新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 學習筆記_TIME定時器詳解1

        STM32 學習筆記_TIME定時器詳解1

        作者: 時間:2016-11-26 來源:網絡 收藏
        STM32 單片機的定時器的確很強大,參考說明書中就占了一百多頁,占參考手冊1/4 有多了。
        STM32的定時器分了好幾個類別,各個類別針對功能作用都不大相同。
        分有: 一、高級定時器
        二、通用定時器
        三、基本定時器
        四、看門狗定時器
        五、SysTick定時器

        其中看門狗定時器和SysTick定時器本篇筆記闡述,這里主要記下對平時使用定時器作用的計時計數器的一些自己的理解。
        按照參考手冊中的定義 高級定時器 通用定時器基本定時器,這三個定時器成上下級的關系,即基本定時器有的功能通用定時器都有,而且還增加了向下、向上/向下計數器、PWM生成、輸出比較、輸入捕獲等等功能;而高級定時器又包含了通用定時器的所有功能,另外還增加了死區互補輸出、剎車信號、加入重復計數器等等。(這里等等功能請參考《STM32參考手冊》)
        所以學習STM32 定時器實際就是學習一下高級定時器,然后適當的刪減后就是后面的兩種定時器了。
        假若不涉及輸出輸入,定時器的最基本用法就是計數定時作用了本篇筆記主要針對這部分的理解所寫下的。

        高級定時器中一共有20個寄存器:

        TIMx_CR1、TIMx_CR2、TIMx_SMCR、TIMx_DIER、TIMx_SR、TIMx_EGR、TIMx_CCMR1、TIMx_CCMR2、
        TIMx_CCER、TIMx_CNT、TIMx_PSC、TIMx_ARR、TIMx_RCR、TIMx_CCR1、TIMx_CCR2、TIMx_CCR3、
        TIMx_CCR4、TIMx_BDTR、TIMx_DCR、TIMx_DMAR
        好吧一堆寄存器光看都看到眼花繚亂了,當然不是所有寄存器都涉及到才能讓定時器工作的,例如最基本的定時功能所涉及的只有幾個與時基功能相關的寄存器,TIMx_CNT(計數器寄存器)、TIMx_PSC(預分頻器寄存器)、TIMx_ARR(自動裝載寄存器)、TIMx_RCR(重復次數寄存器)。參考手冊中有那么衣服定時器的框圖。這幾個寄存器的關系如圖所示的:
        st.jpg(24.62 KB)
        2012-7-22 22:23

        CK_PSC這根時鐘線上的時鐘源的選擇,即給定時器計數計時的時鐘源的輸入方式,有四種方式,分別是內部時鐘,外部時鐘模式1,外部時鐘模式2,內部觸發。這部分日后再說,這里暫且使用最常用的內部時鐘方式,既是當內部時鐘為72MHz 的內部時鐘源。
        如圖所示的,時鐘源首先進入預分頻器,然后再進入預先裝入自動重裝載寄存器的計數器中,當計數器溢出時產生一次中斷和一次事件更新。除了多了一個PSC,其他的基本和51單片機很相似,初次看參考手冊中的功能描述中出現了好多次“更新事件(UEV)”。這究竟是怎么的一樣東西呢?在這里有個新概念叫“影子寄存器”,在上圖中,可以看到PSC、ARR、REP(重復計數器中的低八位)這三個寄存器框框下都有個黑影,每次這三個寄存器就是影子寄存器,如果看到參考手冊全圖中還可以看到另外還有幾個框框下也有陰影部分的,這幾個寄存器也是影子寄存器。何謂影子寄存器呢,例如PSC寄存器可以理解為有兩個,一個是用戶可以訪問到的寄存器,可讀可寫,另一部分就是客戶訪問不到的但其裝載值和實際寄存器是密切關聯的,當程序在運行中改寫PSC 這時候影子寄存器的作用就體現了,因為立刻寫入的值可能會大于或小于目前正在運行的寄存器中的數值,而真實在運行時候的正是這個影子寄存器中的值,而程序寫入的是可訪問的寄存器,只有當產生一個更新事件的時候影子寄存器才會讀入訪問寄存器中的值,這樣就可以防止突然修改而產生的非正常中斷或不會中斷等異常問題。當然在控制器CR1中控制這個影子寄存器是否起作用,不起作用的話就是立即寫入這個數值到寄存器中。下面兩幅是參考手冊中的相關時序圖:
        1.jpg(76.1 KB)
        2012-7-22 22:23

        2.jpg(80.17 KB)
        2012-7-22 22:23


        回頭再說一下“更新事件(UEV)” ,當計數器溢出的時候產生一次UEV事件,另外還可以在事件寄存器TMx_EGR中的UG位軟件寫入產生一次事件更新,當UEV事件來臨的時候所有影子寄存器均載入寄存器中的值,從而實現所有帶影子寄存器的更新,而不啟用影子寄存器的情況下只能實現,寫那個寄存器更新那個寄存器而,這可能造成相關聯的寄存器產生沖突矛盾,建議還是開啟此功能,在下一個溢出周期后產生事件更新。

        (既然說到了影子寄存器也說點自己的猜測,了解了點STM32單片機的都知道幾乎所有寄存器都是32位的,唯獨TIM寄存器是16位的,是的如果是32位的計數器我們可能還能做更寬廣的定時作用。但我們也還是發現即使加入了影子寄存器而整體的寄存器地址依然保持是連續的,這我猜測一種可能性寄存器本身其實還是32位的,但高位提供了影子寄存器的載入功能,所以依然能保持地址連續性,只要設定了高位禁止訪問即可。官方資料和搜索中均未有任何確認說法,純粹本人猜測未得到官方任何證實)

        另外高級定時器中還有RCR重復次數寄存器這個,也是比較簡單的事件更新(UEV) 都是在RCR為0的情況下產生計數器溢出而產生的,當RCR中不為0的時候計數器溢出只會使得重復次數寄存器遞減而不會產生UEV,這樣就可以使得定時器的定時情況得以延長,而相當于有16位的分頻器,16位的計數器,再加入16位的重復次數,一共48位的計數定時器。詳細看參考手冊,這個很好理解。

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 绩溪县| 凌源市| 桂林市| 囊谦县| 靖边县| 灵丘县| 剑川县| 西盟| 台南县| 巴林右旗| 宁河县| 南皮县| 方城县| 田阳县| 麦盖提县| 洪洞县| 涡阳县| 莲花县| 镇江市| 通河县| 新晃| 江达县| 灵山县| 五指山市| 全南县| 云和县| 探索| 资阳市| 佳木斯市| 新和县| 得荣县| 大庆市| 华蓥市| 紫云| 九江市| 乐昌市| 邢台县| 玉山县| 永兴县| 青铜峡市| 朝阳区|