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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32定時(shí)器詳解 -----影子寄存器,預(yù)裝寄存器

          STM32定時(shí)器詳解 -----影子寄存器,預(yù)裝寄存器

          作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
          ● 重復(fù)計(jì)數(shù)器被重置為TIMx_RCR寄存器中的內(nèi)容
          ● 預(yù)分頻器的緩存器被加載為預(yù)裝載(TIMx_PSC寄存器)的值。
          ● 當(dāng)前的自動(dòng)加載寄存器被更新為預(yù)裝載值(TIMx_ARR寄存器中的內(nèi)容)。注:如果因?yàn)橛?jì)數(shù)器溢出而產(chǎn)生更新,自動(dòng)重裝載將在計(jì)數(shù)器重載入之前被更新,因此下一個(gè)周期將是預(yù)期的值(計(jì)數(shù)器被裝載為新的值)。
          下面是一些計(jì)數(shù)器在不同時(shí)鐘頻率下的操作的例子:
          內(nèi)部時(shí)鐘分頻因子為1,TIMx_ARR=0x6時(shí)的計(jì)數(shù)器時(shí)序圖:
          內(nèi)部時(shí)鐘分頻因子為2時(shí)的計(jì)數(shù)器時(shí)序圖:
          內(nèi)部時(shí)鐘分頻因子為4,TIMx_ARR=0x36時(shí)的計(jì)數(shù)器時(shí)序圖:
          注:在此無論是中心對(duì)齊模式2或3都是在溢出時(shí)與UIF標(biāo)志一起使用
          內(nèi)部時(shí)鐘分頻因子為N,計(jì)數(shù)器時(shí)序圖如下:
          ARPE=1時(shí)的更新事件(計(jì)數(shù)器下溢),計(jì)數(shù)器時(shí)序圖如下:
          計(jì)數(shù)器寄存器各位的描述如下:
          位15:0 ARR[15:0]: 自動(dòng)重裝載的值 (Prescaler value)
          ARR包含了將要裝載入實(shí)際的自動(dòng)重裝載寄存器的值。 詳細(xì)參考數(shù)據(jù)手冊(cè)13.3.1節(jié):有關(guān)ARR的更新和動(dòng)作。 當(dāng)自動(dòng)重裝載的值為空時(shí),計(jì)數(shù)器不工作。
          4.重復(fù)計(jì)數(shù)器
          前面解釋了計(jì)數(shù)器上溢/下溢時(shí)更新事件(UEV)是如何產(chǎn)生的,然而事實(shí)上它只能在重復(fù)計(jì)數(shù)達(dá)到0的時(shí)候產(chǎn)生。這個(gè)特性對(duì)產(chǎn)生PWM信號(hào)非常有用。
          這意味著在每N次計(jì)數(shù)上溢或下溢時(shí),數(shù)據(jù)從預(yù)裝載寄存器傳輸?shù)接白蛹拇嫫?TIMx_ARR自動(dòng)重載入寄存器,TIMx_PSC預(yù)裝載寄存器,還有在比較模式下的捕獲/比較寄存器TIMx_CCRx),N是TIMx_RCR重復(fù)計(jì)數(shù)寄存器中的值。
          重復(fù)計(jì)數(shù)器在下述任一條件成立時(shí)遞減:
          ● 向上計(jì)數(shù)模式下每次計(jì)數(shù)器溢出時(shí),
          ● 向下計(jì)數(shù)模式下每次計(jì)數(shù)器下溢時(shí),
          ● 中央對(duì)齊模式下每次上溢和每次下溢時(shí)。雖然這樣限制了PWM的最大循環(huán)周期為128,但它能夠在每個(gè)PWM周期2次更新占空比。在中央對(duì)齊模式下,因?yàn)椴ㄐ问菍?duì)稱的,如果每個(gè)PWM周期中僅刷新一次比較寄存器,則最大的分辨率為2xTck。
          重復(fù)計(jì)數(shù)器是自動(dòng)加載的,重復(fù)速率是由TIMx_RCR寄存器的值定義。當(dāng)更新事件由軟件產(chǎn)生(通過設(shè)置TIMx_EGR 中的UG位)或者通過硬件的從模式控制器產(chǎn)生,則無論重復(fù)計(jì)數(shù)器的值是多少,立即發(fā)生更新事件,并且TIMx_RCR寄存器中的內(nèi)容被重載入到重復(fù)計(jì)數(shù)器。
          下圖為不同模式下更新速率的例子,及TIMx_RCR的寄存器設(shè)置
          重復(fù)計(jì)數(shù)器各位的描述如下:
          位15:8 保留位,始終讀為0。
          位7:0 REP[7:0]: 重復(fù)計(jì)數(shù)器的值 (Repetition counter value) 開啟了預(yù)裝載功能后,這些位允許用戶設(shè)置比較寄存器的更新速率(即周期性地從預(yù)裝載寄存器傳輸?shù)疆?dāng)前寄存器);如果允許產(chǎn)生更新中斷,則會(huì)同時(shí)影響產(chǎn)生更新中斷的速率。
          每次向下計(jì)數(shù)器REP_CNT達(dá)到0,會(huì)產(chǎn)生一個(gè)更新事件并且計(jì)數(shù)器REP_CNT重新從REP值開始計(jì)數(shù)。由于REP_CNT只有在周期更新事件U_RC發(fā)生時(shí)才重載REP值,因此對(duì)TIMx_RCR寄存器寫入的新值只在下次周期更新事件發(fā)生時(shí)才起作用。 這意味著在PWM模式中,(REP+1)對(duì)應(yīng)著:
          - 在邊沿對(duì)齊模式下,PWM周期的數(shù)目;
          - 在中心對(duì)稱模式下,PWM半周期的數(shù)目;
          5.控制寄存器1
          控制寄存器1各位的描述如下:
          位15:10 保留,始終讀為0。
          位9:8 CKD[1:0]:時(shí)鐘分頻因子 (Clock division)
          這2位定義在定時(shí)器時(shí)鐘(CK_INT)頻率、死區(qū)時(shí)間和由死區(qū)發(fā)生器與數(shù)字濾波器(ETR,TIx)所用的采樣時(shí)鐘之間的分頻比例。
          00:tDTS = tCK_INT
          01:tDTS = 2 x tCK_INT
          10:tDTS = 4 x tCK_INT
          11:保留,不要使用這個(gè)配置
          位7 ARPE:自動(dòng)重裝載預(yù)裝載允許位 (Auto-reload preload enable)
          0:TIMx_ARR寄存器沒有緩沖;
          1:TIMx_ARR寄存器被裝入緩沖器。
          位6:5 CMS[1:0]:選擇中央對(duì)齊模式 (Center-aligned mode selection)
          00:邊沿對(duì)齊模式。計(jì)數(shù)器依據(jù)方向位(DIR)向上或向下計(jì)數(shù)。
          01:中央對(duì)齊模式1。計(jì)數(shù)器交替地向上和向下計(jì)數(shù)。配置為輸出的通道(TIMx_CCMRx寄存器中CCxS=00)的輸出比較中斷標(biāo)志位,只在計(jì)數(shù)器向下計(jì)數(shù)時(shí)被設(shè)置。
          10:中央對(duì)齊模式2。計(jì)數(shù)器交替地向上和向下計(jì)數(shù)。配置為輸出的通道(TIMx_CCMRx寄存器中CCxS=00)的輸出比較中斷標(biāo)志位,只在計(jì)數(shù)器向上計(jì)數(shù)時(shí)被設(shè)置。
          11:中央對(duì)齊模式3。計(jì)數(shù)器交替地向上和向下計(jì)數(shù)。配置為輸出的通道(TIMx_CCMRx寄存器中CCxS=00)的輸出比較中斷標(biāo)志位,在計(jì)數(shù)器向上和向下計(jì)數(shù)時(shí)均被設(shè)置。
          在計(jì)數(shù)器開啟時(shí)(CEN=1),不允許從邊沿對(duì)齊模式轉(zhuǎn)換到中央對(duì)齊模式。
          位4 DIR:方向 (Direction)
          0:計(jì)數(shù)器向上計(jì)數(shù);
          1:計(jì)數(shù)器向下計(jì)數(shù)。
          當(dāng)計(jì)數(shù)器配置為中央對(duì)齊模式或編碼器模式時(shí),該位為只讀。
          位3 OPM:單脈沖模式 (One pulse mode)
          0:在發(fā)生更新事件時(shí),計(jì)數(shù)器不停止;
          1:在發(fā)生下一次更新事件(清除CEN位)時(shí),計(jì)數(shù)器停止。
          位2 URS:更新請(qǐng)求源 (Update request source)
          軟件通過該位選擇UEV事件的源
          0:如果使能了更新中斷或DMA請(qǐng)求,則下述任一事件產(chǎn)生更新中斷或DMA請(qǐng)求:
          −計(jì)數(shù)器溢出/下溢
          −設(shè)置UG位
          −從模式控制器產(chǎn)生的更新
          1:如果使能了更新中斷或DMA請(qǐng)求,則只有計(jì)數(shù)器溢出/下溢才產(chǎn)生更新中斷或DMA請(qǐng)求
          位1 UDIS:禁止更新 (Update disable)
          軟件通過該位允許/禁止UEV事件的產(chǎn)生
          0:允許UEV。更新(UEV)事件由下述任一事件產(chǎn)生:
          −計(jì)數(shù)器溢出/下溢
          −設(shè)置UG位
          −從模式控制器產(chǎn)生的更新 具有緩存的寄存器被裝入它們的預(yù)裝載值。(更新影子寄存器)
          1:禁止UEV。不產(chǎn)生更新事件,影子寄存器(ARR、PSC、CCRx)保持它們的值。如果設(shè)置了UG位或從模式控制器發(fā)出了一個(gè)硬件復(fù)位,則計(jì)數(shù)器和預(yù)分頻器被重新初始化。
          位0 CEN:使能計(jì)數(shù)器 (Counter enable)
          0:禁止計(jì)數(shù)器;
          1:使能計(jì)數(shù)器。
          在軟件設(shè)置了CEN位后,外部時(shí)鐘、門控模式和編碼器模式才能工作。觸發(fā)模式可以自動(dòng)地通過硬件設(shè)置CEN位。
          6.事件產(chǎn)生寄存器
          位15:8 保留,始終讀為0。
          位7 BG:產(chǎn)生剎車事件 (Break generation) 該位由軟件置’1’,用于產(chǎn)生一個(gè)剎車事件,由硬件自動(dòng)清’0’。
          0:無動(dòng)作;
          1:產(chǎn)生一個(gè)剎車事件。此時(shí)MOE=0、BIF=1,若開啟對(duì)應(yīng)的中斷和DMA,則產(chǎn)生相應(yīng)的中斷和DMA。
          位6 TG:產(chǎn)生觸發(fā)事件 (Trigger generation) 該位由軟件置’1’,用于產(chǎn)生一個(gè)觸發(fā)事件,由硬件自動(dòng)清’0’。
          0:無動(dòng)作;
          1:TIMx_SR寄存器的TIF=1,若開啟對(duì)應(yīng)的中斷和DMA,則產(chǎn)生相應(yīng)的中斷和DMA。
          位5 COMG:捕獲/比較事件,產(chǎn)生控制更新 (Capture/Compare control update generation) 該位由軟件置’1’,由硬件自動(dòng)清’0’。
          0:無動(dòng)作;
          1:當(dāng)CCPC=1,允許更新CCxE、CCxNE、OCxM位。
          該位只對(duì)擁有互補(bǔ)輸出的通道有效。
          位4 CC4G:產(chǎn)生捕獲/比較4事件 (Capture/Compare 4 generation) 參考CC1G描述。
          位3 CC3G:產(chǎn)生捕獲/比較3事件 (Capture/Compare 3 generation) 參考CC1G描述。
          位2 CC2G:產(chǎn)生捕獲/比較2事件 (Capture/Compare 2 generation) 參考CC1G描述。
          位1 CC1G:產(chǎn)生捕獲/比較1事件 (Capture/Compare 1 generation) 該位由軟件置’1’,用于產(chǎn)生一個(gè)捕獲/比較事件,由硬件自動(dòng)清’0’。
          0:無動(dòng)作;
          1:在通道CC1上產(chǎn)生一個(gè)捕獲/比較事件:
          若通道CC1配置為輸出: 設(shè)置CC1IF=1,若開啟對(duì)應(yīng)的中斷和DMA,則產(chǎn)生相應(yīng)的中斷和DMA。
          若通道CC1配置為輸入: 當(dāng)前的計(jì)數(shù)器值被捕獲至TIMx_CCR1寄存器;設(shè)置CC1IF=1,若開啟對(duì)應(yīng)的中斷和DMA,則產(chǎn)生相應(yīng)的中斷和DMA。
          若CC1IF已經(jīng)為1,則設(shè)置CC1OF=1。
          位0 UG:產(chǎn)生更新事件 (Update generation) 該位由軟件置’1’,由硬件自動(dòng)清’0’。
          0:無動(dòng)作;
          1:重新初始化計(jì)數(shù)器,并產(chǎn)生一個(gè)更新事件。注意預(yù)分頻器的計(jì)數(shù)器也被清’0’(但是預(yù)分頻系數(shù)不變)。若在中心對(duì)稱模式下或DIR=0(向上計(jì)數(shù))則計(jì)數(shù)器被清’0’;若DIR=1(向下計(jì)數(shù))則計(jì)數(shù)器取TIMx_ARR的值。
          關(guān)于剎車事件,觸發(fā)事件,捕獲比較事件的描述,詳見數(shù)據(jù)手冊(cè)13章
          程序分析:
          固件庫函數(shù)分析:
          STM32的高級(jí)定時(shí)器功能十分強(qiáng)大,但相應(yīng)的功能強(qiáng)大就意味著結(jié)構(gòu)復(fù)雜。復(fù)雜的結(jié)構(gòu)帶來的是復(fù)雜的庫函數(shù)。
          高級(jí)定時(shí)器TIM1和TIM8一共有著80多個(gè)庫函數(shù),如果對(duì)其一一介紹,不但浪費(fèi)時(shí)間,浪費(fèi)精力,還有可能變成類似《固件庫使用手冊(cè)》一樣的東西。在學(xué)習(xí)的時(shí)候,我們對(duì)事物的認(rèn)知總是螺旋上升的,尤其是我們做嵌入式開發(fā),當(dāng)遇到一個(gè)新的系統(tǒng)或者硬件,指望著看一遍數(shù)據(jù)手冊(cè),就完全掌握其使用方法是不可能的。所以,我們先建立起一個(gè)最簡單,最基礎(chǔ)的實(shí)驗(yàn),方便對(duì)新事物有著一個(gè)感性的直觀的認(rèn)知。有了清晰的認(rèn)知,明白了基本原理后,后面的學(xué)習(xí)速度就會(huì)大大加快,也能的心應(yīng)手了.看數(shù)據(jù)手冊(cè)和固件庫函數(shù)的時(shí)候,不要圖快,不要浮躁,指望著看看相關(guān)的資料,復(fù)制下固件庫例程的代碼把程序搞定,這不叫“寫代碼”,這叫“移植”?;A(chǔ)打的不牢靠,對(duì)于細(xì)節(jié)問題理解的不清晰,是不可能真正的學(xué)好ARM的.如果想繼續(xù)學(xué)習(xí)的話,你會(huì)發(fā)現(xiàn),你“節(jié)省”的時(shí)間,在越來越深入后,就會(huì)給你帶來雙倍的“節(jié)省時(shí)間”長的麻煩.
          ----------作者的心得在"stm32f10x_tim.h"中可以看到如下定義:
          typedef struct { uint16_t TIM_Prescaler; uint16_t TIM_CounterMode; uint16_t TIM_Period; uint16_t TIM_ClockDivision; uint8_t TIM_RepetitionCounter; } TIM_TimeBaseInitTypeDef;
          庫函數(shù)TIM_TimeBaseInit()的原型如下
          void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) { uint16_t tmpcr1 = 0; assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode)); assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision)); tmpcr1 = TIMx->CR1; if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM2) || (TIMx == TIM3)|| (TIMx == TIM4) || (TIMx == TIM5)) { tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS))); tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode; } if((TIMx != TIM6) && (TIMx != TIM7)) { tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD)); tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision; } TIMx->CR1 = tmpcr1; TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ; TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler; if ((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM15)|| (TIMx == TIM16) || (TIMx == TIM17)) { TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter; } TIMx->EGR = TIM_PSCReloadMode_Immediate; }
          正如函數(shù)名,和結(jié)構(gòu)體名所描述的,這個(gè)函數(shù)的作用為,初始化TIM1的時(shí)基部分.
          結(jié)合著數(shù)據(jù)手冊(cè)和上面的高級(jí)定時(shí)器框圖和時(shí)鐘簡介可知,我們使用高級(jí)定時(shí)器TIM1中斷時(shí)對(duì)TIM1的時(shí)基配置順序如下所示。
          在此例中,我們可以這樣定義他.
          TIM_TimeBaseStructure.TIM_Prescaler=(18000-1); //時(shí)鐘預(yù)分頻 TIM_TimeBaseStructure.TIM_Period=(4000-1); //定時(shí)器初始值 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計(jì)數(shù)模式 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 時(shí)鐘分割 TIM_CKD_DIV1 為 0x0 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); //初始化定時(shí)器的值
          上面的初始化流程圖已經(jīng)說明,
          定時(shí)器中斷頻率 = 時(shí)鐘頻率/(時(shí)鐘預(yù)分頻+1)/(計(jì)數(shù)器裝載值+1)
          所以我們要達(dá)到1S間隔的跑馬燈,定時(shí)器的中斷頻率為1Hz,所以這里只要時(shí)鐘分頻的值與定時(shí)器的計(jì)數(shù)器的裝載值之積為72MHZ且不越界即可
          關(guān)于計(jì)數(shù)模式,在stm32f10x.h中有如下的定義
          #define TIM_CounterMode_Up ((uint16_t)0x0000) #define TIM_CounterMode_Down ((uint16_t)0x0010) #define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) #define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) #define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060)
          上一頁 1 2 下一頁

          評(píng)論


          技術(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); })();