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