<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 學(xué)習(xí)筆記_TIME定時(shí)器詳解1

          STM32 學(xué)習(xí)筆記_TIME定時(shí)器詳解1

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

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

          高級定時(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
          好吧一堆寄存器光看都看到眼花繚亂了,當(dāng)然不是所有寄存器都涉及到才能讓定時(shí)器工作的,例如最基本的定時(shí)功能所涉及的只有幾個與時(shí)基功能相關(guān)的寄存器,TIMx_CNT(計(jì)數(shù)器寄存器)、TIMx_PSC(預(yù)分頻器寄存器)、TIMx_ARR(自動裝載寄存器)、TIMx_RCR(重復(fù)次數(shù)寄存器)。參考手冊中有那么衣服定時(shí)器的框圖。這幾個寄存器的關(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ā)。這部分日后再說,這里暫且使用最常用的內(nèi)部時(shí)鐘方式,既是當(dāng)內(nèi)部時(shí)鐘為72MHz 的內(nèi)部時(shí)鐘源。
          如圖所示的,時(shí)鐘源首先進(jìn)入預(yù)分頻器,然后再進(jìn)入預(yù)先裝入自動重裝載寄存器的計(jì)數(shù)器中,當(dāng)計(jì)數(shù)器溢出時(shí)產(chǎn)生一次中斷和一次事件更新。除了多了一個PSC,其他的基本和51單片機(jī)很相似,初次看參考手冊中的功能描述中出現(xiàn)了好多次“更新事件(UEV)”。這究竟是怎么的一樣?xùn)|西呢?在這里有個新概念叫“影子寄存器”,在上圖中,可以看到PSC、ARR、REP(重復(fù)計(jì)數(shù)器中的低八位)這三個寄存器框框下都有個黑影,每次這三個寄存器就是影子寄存器,如果看到參考手冊全圖中還可以看到另外還有幾個框框下也有陰影部分的,這幾個寄存器也是影子寄存器。何謂影子寄存器呢,例如PSC寄存器可以理解為有兩個,一個是用戶可以訪問到的寄存器,可讀可寫,另一部分就是客戶訪問不到的但其裝載值和實(shí)際寄存器是密切關(guān)聯(lián)的,當(dāng)程序在運(yùn)行中改寫PSC 這時(shí)候影子寄存器的作用就體現(xiàn)了,因?yàn)榱⒖虒懭氲闹悼赡軙笥诨蛐∮谀壳罢谶\(yùn)行的寄存器中的數(shù)值,而真實(shí)在運(yùn)行時(shí)候的正是這個影子寄存器中的值,而程序?qū)懭氲氖强稍L問的寄存器,只有當(dāng)產(chǎn)生一個更新事件的時(shí)候影子寄存器才會讀入訪問寄存器中的值,這樣就可以防止突然修改而產(chǎn)生的非正常中斷或不會中斷等異常問題。當(dāng)然在控制器CR1中控制這個影子寄存器是否起作用,不起作用的話就是立即寫入這個數(shù)值到寄存器中。下面兩幅是參考手冊中的相關(guān)時(shí)序圖:
          1.jpg(76.1 KB)
          2012-7-22 22:23

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


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

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

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

          上一頁 1 2 下一頁

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();