STM32 學習筆記_TIME定時器詳解1
STM32的定時器分了好幾個類別,各個類別針對功能作用都不大相同。
分有: 一、高級定時器
二、通用定時器
三、基本定時器
四、看門狗定時器
五、SysTick定時器
其中看門狗定時器和SysTick定時器本篇筆記闡述,這里主要記下對平時使用定時器作用的計時計數(shù)器的一些自己的理解。
按照參考手冊中的定義 高級定時器 通用定時器基本定時器,這三個定時器成上下級的關系,即基本定時器有的功能通用定時器都有,而且還增加了向下、向上/向下計數(shù)器、PWM生成、輸出比較、輸入捕獲等等功能;而高級定時器又包含了通用定時器的所有功能,另外還增加了死區(qū)互補輸出、剎車信號、加入重復計數(shù)器等等。(這里等等功能請參考《STM32參考手冊》)
所以學習STM32 定時器實際就是學習一下高級定時器,然后適當?shù)膭h減后就是后面的兩種定時器了。
假若不涉及輸出輸入,定時器的最基本用法就是計數(shù)定時作用了本篇筆記主要針對這部分的理解所寫下的。
高級定時器中一共有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(計數(shù)器寄存器)、TIMx_PSC(預分頻器寄存器)、TIMx_ARR(自動裝載寄存器)、TIMx_RCR(重復次數(shù)寄存器)。參考手冊中有那么衣服定時器的框圖。這幾個寄存器的關系如圖所示的:
st.jpg(24.62 KB)
2012-7-22 22:23
CK_PSC這根時鐘線上的時鐘源的選擇,即給定時器計數(shù)計時的時鐘源的輸入方式,有四種方式,分別是內部時鐘,外部時鐘模式1,外部時鐘模式2,內部觸發(fā)。這部分日后再說,這里暫且使用最常用的內部時鐘方式,既是當內部時鐘為72MHz 的內部時鐘源。
如圖所示的,時鐘源首先進入預分頻器,然后再進入預先裝入自動重裝載寄存器的計數(shù)器中,當計數(shù)器溢出時產(chǎn)生一次中斷和一次事件更新。除了多了一個PSC,其他的基本和51單片機很相似,初次看參考手冊中的功能描述中出現(xiàn)了好多次“更新事件(UEV)”。這究竟是怎么的一樣東西呢?在這里有個新概念叫“影子寄存器”,在上圖中,可以看到PSC、ARR、REP(重復計數(shù)器中的低八位)這三個寄存器框框下都有個黑影,每次這三個寄存器就是影子寄存器,如果看到參考手冊全圖中還可以看到另外還有幾個框框下也有陰影部分的,這幾個寄存器也是影子寄存器。何謂影子寄存器呢,例如PSC寄存器可以理解為有兩個,一個是用戶可以訪問到的寄存器,可讀可寫,另一部分就是客戶訪問不到的但其裝載值和實際寄存器是密切關聯(lián)的,當程序在運行中改寫PSC 這時候影子寄存器的作用就體現(xiàn)了,因為立刻寫入的值可能會大于或小于目前正在運行的寄存器中的數(shù)值,而真實在運行時候的正是這個影子寄存器中的值,而程序寫入的是可訪問的寄存器,只有當產(chǎn)生一個更新事件的時候影子寄存器才會讀入訪問寄存器中的值,這樣就可以防止突然修改而產(chǎn)生的非正常中斷或不會中斷等異常問題。當然在控制器CR1中控制這個影子寄存器是否起作用,不起作用的話就是立即寫入這個數(shù)值到寄存器中。下面兩幅是參考手冊中的相關時序圖:
1.jpg(76.1 KB)
2012-7-22 22:23
2.jpg(80.17 KB)
2012-7-22 22:23
回頭再說一下“更新事件(UEV)” ,當計數(shù)器溢出的時候產(chǎn)生一次UEV事件,另外還可以在事件寄存器TMx_EGR中的UG位軟件寫入產(chǎn)生一次事件更新,當UEV事件來臨的時候所有影子寄存器均載入寄存器中的值,從而實現(xiàn)所有帶影子寄存器的更新,而不啟用影子寄存器的情況下只能實現(xiàn),寫那個寄存器更新那個寄存器而,這可能造成相關聯(lián)的寄存器產(chǎn)生沖突矛盾,建議還是開啟此功能,在下一個溢出周期后產(chǎn)生事件更新。
(既然說到了影子寄存器也說點自己的猜測,了解了點STM32單片機的都知道幾乎所有寄存器都是32位的,唯獨TIM寄存器是16位的,是的如果是32位的計數(shù)器我們可能還能做更寬廣的定時作用。但我們也還是發(fā)現(xiàn)即使加入了影子寄存器而整體的寄存器地址依然保持是連續(xù)的,這我猜測一種可能性寄存器本身其實還是32位的,但高位提供了影子寄存器的載入功能,所以依然能保持地址連續(xù)性,只要設定了高位禁止訪問即可。官方資料和搜索中均未有任何確認說法,純粹本人猜測未得到官方任何證實)
另外高級定時器中還有RCR重復次數(shù)寄存器這個,也是比較簡單的事件更新(UEV) 都是在RCR為0的情況下產(chǎn)生計數(shù)器溢出而產(chǎn)生的,當RCR中不為0的時候計數(shù)器溢出只會使得重復次數(shù)寄存器遞減而不會產(chǎn)生UEV,這樣就可以使得定時器的定時情況得以延長,而相當于有16位的分頻器,16位的計數(shù)器,再加入16位的重復次數(shù),一共48位的計數(shù)定時器。詳細看參考手冊,這個很好理解。
評論