新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32通用定時器(時鐘選擇,模式選擇)

        STM32通用定時器(時鐘選擇,模式選擇)

        作者: 時間:2016-11-28 來源:網絡 收藏
        STM32的定時器功能很強大,學習起來也很費勁兒.

        其實手冊講的還是挺全面的,只是無奈TIMER的功能太復雜,所以顯得手冊很難懂,我就是通過這樣看手冊:while(!SUCCESS){看手冊…}才搞明白的!所以接下來我以手冊的順序為主線,增加一些自己的理解,并通過11個例程對TIMER做個剖析。實驗環境是STM103V100的實驗板,MDK3.2 +Library2.東西都不怎么新,湊合用……

        本文引用地址:http://www.104case.com/article/201611/322720.htm

        TIMER主要是由三部分組成:

        1、時基單元。

        2、輸入捕獲。

        3、輸出比較。

        還有兩種模式控制功能:從模式控制和主模式控制。

        一、 框圖

        讓我們看下手冊,一開始是定時器的框圖,這里面幾乎包含了所有定時器的信息,您要是能看明白,那么接下來就不用再看別的了…

        為了方便的看圖,我對里面出現的名詞和符號做個注解:

        TIMx_ETR:TIMER外部觸發引腳 ETR:外部觸發輸入

        ETRP:分頻后的外部觸發輸入 ETRF:濾波后的外部觸發輸入

        ITRx:內部觸發x(由另外的定時器觸發)

        TI1F_ED:TI1的邊沿檢測器。

        TI1FP1/2:濾波后定時器1/2的輸入

        TRGI:觸發輸入TRGO:觸發輸出

        CK_PSC:應該叫分頻器時鐘輸入

        CK_CNT:定時器時鐘。(定時周期的計算就靠它)

        TIMx_CHx:TIMER的輸入腳TIx:應該叫做定時器輸入信號x

        ICx:輸入比較xICxPS:分頻后的ICx

        OCx:輸出捕獲xOCxREF:輸出參考信號

        關于框圖還有以下幾點要注意:

        1、影子寄存器。

        有陰影的寄存器,表示在物理上這個寄存器對應2個寄存器,一個是程序員可以寫入或讀出的寄存器,稱為preload register(預裝載寄存器),另一個是程序員看不見的、但在操作中真正起作用的寄存器,稱為shadow register(影子寄存器);(詳細請參考版主博客http://blog.ednchina.com/STM32/401461/message.aspx)

        2、輸入濾波機制

        在ETR何TIx輸入端有個輸入濾波器,它的作用是以采樣頻率Fdts來采樣N次進行濾波的。(具體也請參考版主博客http://blog.ednchina.com/STM32/263170/message.aspx)

        3、輸入引腳和輸出引腳是相同的。

        二、時基單元

        時基單元有三個部分:CNT、PSC、ARR。CNT的計數方式分三種:向上、向下、中央對齊。通俗的說就是0—ARR、ARR—0、0—(ARR-1)—ARR—1.

        三、時鐘源的選擇

        這個是難點之一。從手冊上我們看到共有三種時鐘源:

        1、內部時鐘。

        也就是選擇CK_INT做時鐘,這個簡單,但是有一點要注意,定時器的時鐘不是直接來自APB1或APB2,而是來自于輸入為APB1或APB2的一個倍頻器,當APB1的預分頻系數為1時,這個倍頻器不起作用,定時器的時鐘頻率等于APB1的頻率;當APB1的預分頻系數為其它數值(即預分頻系數為2、4、8或16)時,這個倍頻器起作用,定時器的時鐘頻率等于APB1的頻率兩倍。

        例如AHP 72M,APB12分頻36M,那么TIMER就是APB1的2倍頻,即72M。

        怎么選擇時鐘模式1呢?只要將SMCR中SMS[2:0]弄成000就好了

        SMCR

        1514131211 109876543210

        ETP

        ECE

        ETPS[1:0]

        ETF[3:0]

        MSM

        TS[2:0]

        SMS[2:0]

        2、外部時鐘模式1

        這個比較麻煩,時鐘源選擇的其實就是TRGI(觸發輸入),但觸發輸入選擇挺多的,共8個……。看框圖,他們是:ITRx、TI1F_ED、

        TI1FP1、TI2FP2、ETRF

        ITRx的東西跟定時器的級聯有關,暫時不管他。要進入這種時鐘模式首先置SMS為111,當然這還沒完,不像內部時鐘那樣,什么都配好了,這里你還得配置一下別的參數,比如選擇TI1FP1,自然要對輸入通道1的參數配置好,這樣時鐘才能按你需要的方式進來。就是配框圖這塊

        相關寄存器

        CCMR1(輸入)

        IC2F[3:0]

        IC2PSC[1:0]

        CC2S[1:0]

        IC1F[3:0]

        IC1PSC[1:0]

        CC1S[1:0]

        CCER

        15 14131211 10987 6543210

        CC4P

        CC4E

        CC3P

        CC3E

        CC2P

        CC2E

        CC1P

        CC1E

        SMCR

        1514131211 109876543210

        ETP

        ECE

        ETPS[1:0]

        ETF[3:0]

        MSM

        TS[2:0]

        SMS[2:0]

        在CCMR1寄存器里選擇好相應的輸入(CC1S)和濾波(IC1F)后再配置好輸入極性(CCIP)然后在SMCR中選擇觸發源(TS[2:0])為TI1這樣輸入通道就配好了!最后選擇SMS為111,開啟時鐘(CR1中的CEN)。現在時鐘就是從TI1上的輸入了,可以接個時鐘源進行計數之類的。同理,如果要用ETR就把它相關通道配好就可以了。

        3、外部時鐘模式2

        選擇外部輸入作為時鐘,看框圖:

        從圖上可以看出ETR可以直接作為時鐘輸入也可以通過觸發輸入(TRGI)來作為時鐘輸入即在時鐘模式1中觸發源選擇為ETR,兩個效果上是一樣的,看起來好像這個外部時鐘模式2沒什么用處,實際上不是的,他可以跟一些從模式(復位、觸發、門控)進行組合。比如當從模式選為觸發時,我們不可能再通過觸發源選擇ETR了,因為從模式控制器被占了,好在有外部時鐘模式2,我們選擇這種模式后就可以把兩者組合在一起完成一些功能了。

        總結一下,STM32的時鐘選擇比較特別,在SFR中關于時鐘選擇配置位不再一塊,不是說兩個位在一起00、01、11就選擇了而是由

        SMCR中SMS和ECE 來控制,這樣感覺可以吧內部時鐘與外部模式2同時打開(SMS:000,ECE:1),也可以吧外部模式1和外部模式2同時打開(SMS:111,ECE:1),實際上上述兩種方式用的都是外部時鐘2.

        四、捕獲比較通道

        這就是我說的定時器三個組成部分中的兩個部分了。核心是那個捕獲比較寄存器。

        看框圖

        異或那塊先不管他,好像跟編碼器有關,輸入有個特色就是可以把TI的輸入搞到CC1上去,也可以把T2的輸入搞到CC1上去,其實也可以把T1搞到CC1上去同時把T1搞到CC2上去,這樣就有了后來的PWM輸入。

        輸出上的特色是不直接輸出,而是有個OC1REF,這樣可以定義高有效還是低有效,輸出自己需要的有效電平。

        五、做實驗

        講了這么多你一定煩了吧,那么讓我們搞點實際的吧,通過做實驗來熟悉定時器,用到新知識時再在其中加以介紹。

        實驗一:

        TIMER-1:定時器上溢,中斷中取反LED.

        現象:LED 周期2秒閃爍。

        主要代碼如下:

        TIM_DeInit(TIM2);

        TIM_TimeBaseStructure.TIM_Period=2000;//ARR的值

        TIM_TimeBaseStructure.TIM_Prescaler=0;

        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采樣分頻

        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式

        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

        TIM_PrescalerConfig(TIM2,0x8C9F,TIM_PSCReloadMode_Immediate);//時鐘分頻系數36000,所以定時器時鐘為2K

        TIM_ARRPreloadConfig(TIM2, DISABLE);//禁止ARR預裝載緩沖器

        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

        TIM_Cmd(TIM2, ENABLE);//開啟時鐘

        解釋一下,首先得配好ARR,這是必須地。然后配置預分頻,為什么我先配為0再用TIM_PrescalerConfig(TIM2,0x8C9F,TIM_PSCReloadMode_Immediate)配呢,原來PSC也有個預裝載功能,卻不像ARR和CRR那樣有相關的位控制立即裝載或更新事件裝載。也就是說只能更新事件來裝載。在上面函數中手工產生了一個更新事件,使PSC立刻生效。CK_DIV暫時沒用到。計數模式配置為向上計數。然后在中斷中做下LED取反就可以了。

        溢出周期怎么算?在這個實驗里AHB為72M,APB1為36M,所以CK_INT為72M,36000分頻變為2K.ARR=2000,所以1秒溢出1次。

        相關寄存器:

        CR1

        9876543210

        CKD[1:0]

        ARPE

        CMS[1:0]

        DIR

        OPM

        URS

        UDIS

        CEN

        ARR

        PSC

        接下來的4個實驗跟輸出通道有關系

        實驗2

        TIMER-2:強置輸出

        現象:LED 常亮

        例子比較簡單關鍵是配好輸出通道

        CCER

        15 14131211 10987 6543210

        CC4P

        CC4E

        CC3P

        CC3E

        CC2P

        CC2E

        CC1P

        CC1E

        CCMR(輸出)

        OC2CE

        OC2M[2:0]

        OC2PE

        OC2FE

        CC2S

        OC1CE

        OC1M[2:0]

        OC1PE

        OC1FE

        CC1S

        將通道1配為輸出,輸出使能,輸出極性選擇好,輸出模式選擇好就可以了。在V100實驗板上PC6-9接了LED,剛好對應著TIMER3重映射后的輸出,注意程序里的AFIO函數。

        實驗3

        TIMER-3:輸出比較

        現象:LED 2秒的周期閃爍。

        跟上個實驗配置大致相同,只是把輸出模式改為翻轉功能,并且CRR要配好,當CRR=CNT時翻轉輸出。

        實驗4

        TIMER-4:PWM輸出

        現象:輸出4種不同占空比的PWM波,4個LED亮度不同。

        實驗5

        TIMER-7:單脈沖方式

        現象:LED 只閃爍一次。

        將上個實驗加一句話

        TIM_SelectOnePulseMode(TIM3, TIM_OPMode_Single);//設置單脈沖模式

        就是這個實驗。其實手冊上關于此實驗的本意是由一個外部觸發使能計數器,然后產生一個脈沖的,這里還沒涉及從模式所以簡化處理。


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 鄂州市| 建瓯市| 城口县| 林周县| 肥西县| 泉州市| 乌鲁木齐县| 德化县| 凤山市| 靖安县| 江永县| 新平| 夏津县| 兰考县| 盐边县| 武冈市| 贵港市| 惠来县| 万源市| 化州市| 弋阳县| 临泉县| 呼伦贝尔市| 横山县| 电白县| 石城县| 陵川县| 石棉县| 通化市| 理塘县| 句容市| 六枝特区| 同江市| 丹棱县| 综艺| 铜山县| 儋州市| 渝北区| 青海省| 承德市| 晋城|