久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2847|回復: 0
打印 上一主題 下一主題
收起左側

stm32學習定時器

[復制鏈接]
跳轉到指定樓層
樓主
ID:105756 發表于 2016-2-19 15:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM32的定時器功能很強大,學習起來也很費勁兒.
其實手冊講的還是挺全面的,只是無奈TIMER的功能太復雜,所以顯得手冊很難懂,我就是通過這樣看手冊:while(!SUCCESS){看手冊}才搞明白的!所以接下來我以手冊的順序為主線,增加一些自己的理解,并通過11個例程對TIMER做個剖析。實驗環境是STM103V100的實驗板,MDK3.2+Library2.東西都不怎么新,湊合用……
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:輸入比較x ICxPS:分頻后的ICx
OCx:輸出捕獲x OCxREF:輸出參考信號
關于框圖還有以下幾點要注意:
1、 影子寄存器。
有陰影的寄存器,表示在物理上這個寄存器對應2個寄存器,一個是程序員可以寫入或讀出的寄存器,稱為preloadregister(預裝載寄存器),另一個是程序員看不見的、但在操作中真正起作用的寄存器,稱為shadowregister(影子寄存器);(詳細請參考版主博客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的計數方式分三種:向上、向下、中央對齊。通俗的說就是0ARR、ARR0、0(ARR-1)ARR1.
三、時鐘源的選擇
這個是難點之一。從手冊上我們看到共有三種時鐘源:
1、 內部時鐘。
也就是選擇CK_INT做時鐘,這個簡單,但是有一點要注意,定時器的時鐘不是直接來自APB1或APB2,而是來自于輸入為APB1或APB2的一個倍頻器,當APB1的預分頻系數為1時,這個倍頻器不起作用,定時器的時鐘頻率等于APB1的頻率;當 APB1的預分頻系數為其它數值(即預分頻系數為2、4、8或16)時,這個倍頻器起作用,定時器的時鐘頻率等于APB1的頻率兩倍。
例如AHP72M,APB12分頻36M,那么TIMER就是APB1的2倍頻,即72M。
怎么選擇時鐘模式1呢?只要將SMCR中SMS[2:0]弄成000就好了
SMCR
15 14 13 12 11 10 9 8 7 6 5 4 3 2 10

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 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CC4P

CC4E

CC3P

CC3E

CC2P

CC2E

CC1P

CC1E

SMCR
15 14 13 12 11 10 9 8 7 6 5 4 3 2 10

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,所以定時器時鐘為2KTIM_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
9 8 7 6 5 4 3 2 1 0

CKD[1:0]

ARPE

CMS[1:0]

DIR

OPM

URS

UDIS

CEN

ARR
PSC
接下來的4個實驗跟輸出通道有關系
實驗2
TIMER-2:強置輸出
現象:LED 常亮
例子比較簡單關鍵是配好輸出通道
CCER
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

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); //設置單脈沖模式
就是這個實驗。其實手冊上關于此實驗的本意是由一個外部觸發使能計數器,然后產生一個脈沖的,這里還沒涉及從模式所以簡化處理。
涉及寄存器
CR1
9 8 7 6 5 4 3 2 1 0

CKD[1:0]

ARPE

CMS[1:0]

DIR

OPM

URS

UDIS

CEN

接下來再做兩個輸入的實驗
實驗6
TIMER-5:輸入捕獲模式。
現象:通過V100的JOYSTICK鍵的SELECT鍵進入捕獲,硬件仿真看CRR的值。
首先是基本的配置:ARR的值、時鐘PSC、采樣CKD、計數方式。
然后配置輸入通道。
選擇輸入捕獲模式、輸入極性、把T1配到CC1上、選好輸入的濾波跟分頻,就可以了。
講下輸入濾波功能,在此實驗中Fdts=CK_INT/2,Fsample=Fdts/4,所以定時器時鐘為2K,所以采樣周期為4ms。才8次的話周期小于32ms的干擾會濾除。
相關寄存器
CR1
9 8 7 6 5 4 3 2 1 0

CKD[1:0]

ARPE

CMS[1:0]

DIR

OPM

URS

UDIS

CEN

PSC
ARR
CCMR1(輸入)

IC2F[3:0]

IC2PSC[1:0]

CC2S[1:0]

IC1F[3:0]

IC1PSC[1:0]

CC1S[1:0]

CCER
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CC4P

CC4E

CC3P

CC3E

CC2P

CC2E

CC1P

CC1E

實驗7
TIMER-6:PWM輸入
現象:由TIMER3輸出通道1產生一路周期2秒占空比50%的PWM波,飛線到TIMER4的輸入通道1,有TIMER4來測量該PWM得周期和占空比。
在做實驗之前引入三種從模式控制:復位、觸發、門控。通過SMCR選擇后可以進入這三種從模式
SMCR
15 14 13 12 11 10 9 8 7 6 5 4 3 2 10

ETP

ECE

ETPS[1:0]

ETF[3:0]

MSM

TS[2:0]

SMS[2:0]

SMS: 100 101 110
復位 門控 觸發
所謂從模式簡單理解就是受控于別人了,包括何時啟動、何時停止、何時復位。相關作用請看手冊。提示一點就是進入這三種模式后時鐘是誰的問題?肯定不是外部時鐘1了,可以是內部時鐘和外部時鐘2.
接著看實驗,PWM方式的原理是這樣的,如前文提到過輸入時可以把T1映射到CC1上去同時映射到CC2上,將CC1和CC2的捕獲邊沿搞成相反的,比如CC1捕獲T1上升沿,CC2捕獲T1下降沿,還要再設置T1為復位從模式,上升沿有效,這樣T1上升沿后計數器開始計數。下降沿CC2捕獲發生,此為PWM占空比,在來一個上升沿,CC1捕獲發生此為PWM周期。注意CC1捕獲的第一次無效。
這是從模式跟輸入捕獲的一種組合使用,從模式還可以跟輸出比較組合使用。比如手冊上的單脈沖實驗。
接著做4個實驗跟定時器的級聯和定時器同步有關系,在實驗前先得說說主模式的問題。在CR2寄存器中的MMS位決定了定時器的主模式方式,即決定TRGO.幾種方式可以參看手冊。要說明一點就是一個定期器既可以是主模式同時它也是從模式,這就好像你是一個中層干部一樣,既可以領導別人同時又被別人領導,這個不沖突的。
簡單介紹下4個實驗。
實驗8
TIMER-8: TIMER2作為TIMER3的分頻器.
現象:LED以10秒周期閃爍。
TIMER3配置為PWM輸出,但是始終有TIMER2的溢出時間頻率來提供,其溢出頻率為100Hz所以TIMER3PWM的周期為10S.
實驗9
TIMER-9:TIMER2來使能TIMER3.
現象:LD1前15秒以1秒的周期閃爍,后15秒熄掉,然后下個15秒再閃爍如此循環。
在這個實驗里TIEMR3輸出一個周期1秒的PWM波,仍然驅動LD1閃爍。同時從模式配成門控模式,TIEMR2將OC1作為TRGO,OC1是一個周期30S占空比50%的PWM波。
實驗10
TIMER-10: IMER2啟動TIMER3
現象:上電后延遲15秒LD1以1秒的周期閃爍。
此實驗跟上個實驗配置差不多只要把TIMER3有門控改為觸發方式即可。
實驗11
TIMER-11: TIMER4的通道1同時出發TIMER4和TIMER3兩個定時器
現象:按下JOYSTICK的“選擇”鍵同時出發兩個定時器開始。同時TIMER3驅動LD1以1秒周期閃爍。
以上4個實驗實際上是主模式和從模式的組合以及主模式和外部時鐘1的組合。其實根據自己的需要還可以做出多種組合,這就是STM32定時器強大的地方。
最后多熟悉下庫函數,關于TIM的庫(2.0版本),本人認為有兩點錯誤:
1、 TIM.C中CR1_CounterMode_Mask 的值為0x039F應該改為0x038F這樣才能覆蓋CR1的DIR位。2、 TIM.C中TIM_PrescalerConfig函數原文if (TIM_PSCReloadMode == TIM_PSCReloadMode_Immediate){TIMx->EGR |= TIM_EventSource_Update;}else{TIMx->EGR &= TIM_EventSource_Update;}紅色的這句好像不對吧?應該TIMx->EGR&=~ TIM_EventSource_Update;才對吧。
stm32通用定時器
STM32的定時器是個強大的模塊,定時器使用的頻率也是很高的,定時器可以做一些基本的定時,還可以做PWM輸出或者輸入捕獲功能。
時鐘源問題:
名為TIMx的有八個,其中TIM1和TIM8掛在APB2總線上,而TIM2-TIM7則掛在
APB1總線上。其中TIM1&TIM8稱為高級控制定時器(advanced controltimer).他們所在的APB2總線也比APB1總線要好。APB2可以工作在72MHz下,而APB1最大是36MHz。
定時器的時鐘不是直接來自APB1或APB2,而是來自于輸入為APB1或APB2的一個倍頻器。
下面以定時器2~7的時鐘說明這個倍頻器的作用:當APB1的預分頻系數為1時,這個倍頻器不起作用,定時器的時鐘頻率等于APB1的頻率;當APB1的預分頻系數為其它數值(即預分頻系數為2、4、8或16)時,這個倍頻器起作用,定時器的時鐘頻率等于APB1的頻率兩倍。
假定AHB=36MHz,因為APB1允許的最大頻率為36MHz,所以APB1的預分頻系數可以取任意數值;當預分頻系數=1時,APB1=36MHz,TIM2~7的時鐘頻率=36MHz(倍頻器不起作用);當預分頻系數=2時,APB1=18MHz,在倍頻器的作用下,TIM2~7的時鐘頻率=36MHz。
有人會問,既然需要TIM2~7的時鐘頻率=36MHz,為什么不直接取APB1的預分頻系數=1?答案是:APB1不但要為TIM2~7提供時鐘,而且還要為其它外設提供時鐘;設置這個倍頻器可以在保證其它外設使用較低時鐘頻率時,TIM2~7仍能得到較高的時鐘頻率。
再舉個例子:當AHB=72MHz時,APB1的預分頻系數必須大于2,因為APB1的最大頻率只能為36MHz。如果APB1的預分頻系數=2,則因為這個倍頻器,TIM2~7仍然能夠得到72MHz的時鐘頻率。能夠使用更高的時鐘頻率,無疑提高了定時器的分辨率,這也正是設計這個倍頻器的初衷。
TIM通用定時器配置步驟:
1.配置TIM時鐘  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);2.定時器基本配置void TIM2_Configuration(void){   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;    //  TIM_OCInitTypeDef  TIM_OCInitStructure ;    TIM_DeInit(TIM2);                              //復位TIM2定時器        TIM_TimeBaseStructure.TIM_Period = 5;        // 2.5ms         TIM_TimeBaseStructure.TIM_Prescaler = 36000;    // 分頻36000           TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 時鐘分頻      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //計數方向向上計數    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);        TIM_ClearFlag(TIM2, TIM_FLAG_Update);        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);         TIM_Cmd(TIM2, ENABLE);       }TIM_Period設置了在下一個更新事件裝入活動的自動重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間。TIM_Prescaler設置了用來作為TIMx時鐘頻率除數的預分頻值。它的取值必須在0x0000和0xFFFF之間。TIM_ClockDivision的作用是做一段延時,一般在特殊場合的時候會用到,可不關心。TIM_CounterMode選擇了計數器模式。    TIM_CounterMode_Up    TIM向上計數模式    TIM_CounterMode_Down    TIM向下計數模式    TIM_CounterMode_CenterAligned1   TIM中央對齊模式1計數模式    TIM_CounterMode_CenterAligned2   TIM中央對齊模式2計數模式    TIM_CounterMode_CenterAligned3   TIM中央對齊模式3計數模式單片機時鐘頻率72MHz,APB1 二分頻36MHz,故TIM2自動2倍頻至72MHz,故定時器中斷頻率為72000000/36000/5=400Hz3.使能定時器中斷TIM_Cmd(TIM2, ENABLE);4.配置NVIC。    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    NVIC_Init(&NVIC_InitStructure);5.寫中斷函數void TIM2_IRQHandler(void){......//中斷處理}  
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久一 | www.日本国产 | 亚洲欧美精品 | 成人免费视频网站在线看 | 欧美日韩视频 | 91精品久久久 | 成人精品一区二区 | 国产在线97 | av手机免费在线观看 | 中文字幕精品视频 | 日韩精品一区二区三区中文字幕 | 九九热在线观看视频 | 美女露尿口视频 | 91久久久www播放日本观看 | 成人欧美一区二区三区在线观看 | 亚洲国产精品日韩av不卡在线 | 国产韩国精品一区二区三区 | 久久极品| 亚洲一区| 盗摄精品av一区二区三区 | 毛片网站免费观看 | 久久久国产精品入口麻豆 | 国产91在线 | 欧美 | 国产精品一区二区三区久久 | 亚洲一区中文字幕 | 亚洲一区二区久久久 | aaa在线| 亚洲一区在线日韩在线深爱 | 亚洲国产精品人人爽夜夜爽 | 国产视频91在线 | 亚洲欧洲国产视频 | 精品国产乱码一区二区三区 | 国产综合精品一区二区三区 | 91影片 | 国产精品久久久久久吹潮 | 日韩精品在线一区 | 久久最新精品视频 | 精品一区二区三区在线观看国产 | 亚洲精品国产电影 | 成人在线观看中文字幕 | wwwsihu|