STM32 定时器中断
通用定時(shí)器工作過程:
時(shí)鐘選擇:
計(jì)數(shù)器時(shí)鐘可以由下列時(shí)鐘源提供:
- 內(nèi)部時(shí)鐘(CK_INT)
- 外部時(shí)鐘模式1:外部輸入腳(TIx)
- 外部時(shí)鐘模式2:外部觸發(fā)輸入(ETR)
- 內(nèi)部觸發(fā)輸入(ITRx):使用一個(gè)定時(shí)器作為另一個(gè)定時(shí)器的預(yù)分頻器,如可以配置一個(gè)定時(shí)器Timer1而作為另一個(gè)定時(shí)器Timer2的預(yù)分頻器。
內(nèi)部時(shí)鐘選擇
時(shí)鐘計(jì)算方法:
默認(rèn)調(diào)用SystemInit函數(shù)情況下:
SYSCLK=72M
AHB時(shí)鐘=72M
APB1時(shí)鐘=36M
所以APB1的分頻系數(shù)=AHB/APB1時(shí)鐘=2
所以,通用定時(shí)器時(shí)鐘CK_INT=2*36M=72M
計(jì)數(shù)器模式: 通用定時(shí)器可以向上計(jì)數(shù)、向下計(jì)數(shù)、向上向下雙向計(jì)數(shù)模式。
- 向下計(jì)數(shù)模式(時(shí)鐘分頻因子=1(意思就是:CK_PSC=CK_CNT))
-
向上計(jì)數(shù)模式(時(shí)鐘分頻因子=1)
-
中央對(duì)齊計(jì)數(shù)模式(時(shí)鐘分頻因子=1 ARR=6)
定時(shí)器中斷實(shí)驗(yàn)相關(guān)寄存器: -
計(jì)數(shù)器當(dāng)前值寄存器CNT
-
預(yù)分頻寄存器TIMx_PSC
- 自動(dòng)重裝載寄存器(TIMx_ARR)
- 控制寄存器1(TIMx_CR1)
- DMA中斷使能寄存器(TIMx_DIER)
常用庫函數(shù)
定時(shí)器參數(shù)初始化:
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); ypedef struct {uint16_t TIM_Prescaler;//預(yù)分頻系數(shù)的設(shè)置 uint16_t TIM_CounterMode;//計(jì)數(shù)模式 uint16_t TIM_Period;//自動(dòng)裝載值uint16_t TIM_ClockDivision;//輸入捕獲會(huì)用到 uint8_t TIM_RepetitionCounter;//高級(jí)定時(shí)器會(huì)用到 } TIM_TimeBaseInitTypeDef; TIM_TimeBaseStructure.TIM_Period = 4999; TIM_TimeBaseStructure.TIM_Prescaler =7199; TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);定時(shí)器使能函數(shù):
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)定時(shí)器中斷使能函數(shù):
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);狀態(tài)標(biāo)志位獲取和清除:
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT); void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);定時(shí)器中斷實(shí)現(xiàn)步驟:
- 能定時(shí)器時(shí)鐘。
- 初始化定時(shí)器,配置ARR,PSC。
- 開啟定時(shí)器中斷,配置NVIC。
- 使能定時(shí)器。
- 編寫中斷服務(wù)函數(shù)。
Tout(溢出時(shí)間)=(ARR+1)(PSC+1)/Tclk
其中arr為你重裝的值,
psc是預(yù)分頻計(jì)時(shí)器的值(預(yù)分頻系數(shù)),
Tclk是時(shí)鐘頻率
Tclk/(psc+1)是定時(shí)器的時(shí)鐘
(psc+1))/Tclk*1是計(jì)算的計(jì)數(shù)器 減少/增加 一個(gè)數(shù)所用的時(shí)間;
那么(psc+1))/Tclk*(arr+1)就是一次定時(shí)器的時(shí)間:
然后繼續(xù)重裝arr再次計(jì)數(shù),計(jì)時(shí):
就構(gòu)成一個(gè)循環(huán);
- TIM2-TIM5的時(shí)鐘不是直接來自于APB1,而是來自于輸入為APB1的一個(gè)倍頻器。這個(gè)倍頻器的作用是:當(dāng)APB1的預(yù)分頻系數(shù)為1時(shí),這個(gè)倍頻器不起作用,當(dāng)APB1的預(yù)分頻系數(shù)為其他數(shù)值時(shí)(即預(yù)分頻系數(shù)為2、4、8或16),這個(gè)倍頻器起作用,定時(shí)器的時(shí)鐘頻率等于APB1的頻率的2倍。
- 分頻系數(shù)就是對(duì)定時(shí)器時(shí)鐘進(jìn)行多少分頻之后在使用,最好設(shè)置為定時(shí)器時(shí)鐘的倍數(shù),方便運(yùn)算;重新裝載值是計(jì)算這么多值,時(shí)間到了之后重新開始計(jì)算的值,每一次計(jì)數(shù)的時(shí)間為分頻之后時(shí)鐘的到時(shí);
假設(shè)定時(shí)器時(shí)鐘為72M,分頻系數(shù)設(shè)置為7200-1,那現(xiàn)在定時(shí)器的時(shí)鐘為10kHz,每計(jì)一個(gè)數(shù)花費(fèi)1/(10000)秒,重裝值設(shè)置為5000-1,那一次溢出的時(shí)間為500ms。
分頻值是是指你將系統(tǒng)時(shí)鐘的頻率減小,假設(shè)時(shí)鐘頻率是 72Mhz,然后分頻值是 7199,現(xiàn)在你的定時(shí)器值就是 10kHz,表示每計(jì)一個(gè)數(shù),然后過了 1/(10^4)秒,然后你的重裝值就是你的時(shí)間了,如果值是 9999,就表示定時(shí)時(shí)間為 1s。
定時(shí)器配置代碼:
void TIM4_Init(u16 ar,u16 rs) {TIM_TimeBaseInitTypeDef TIM_InitStrue;NVIC_InitTypeDef NVIC_InitStrue;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能定時(shí)器時(shí)鐘TIM_InitStrue.TIM_Period=ar;//自動(dòng)裝載值TIM_InitStrue.TIM_Prescaler=rs;//預(yù)分頻系數(shù)的設(shè)置TIM_InitStrue.TIM_CounterMode=TIM_CounterMode_Up;TIM_InitStrue.TIM_ClockDivision=TIM_CKD_DIV1;//設(shè)置時(shí)鐘分割:TDTS = Tck_timTIM_TimeBaseInit(TIM4,&TIM_InitStrue);//初始化定時(shí)器,對(duì)定時(shí)器進(jìn)行配置TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//開啟定時(shí)器中斷NVIC_InitStrue.NVIC_IRQChannel=TIM4_IRQn;NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStrue.NVIC_IRQChannelSubPriority=2;NVIC_Init(&NVIC_InitStrue);//初始化中斷,設(shè)置中斷的優(yōu)先級(jí)TIM_Cmd(TIM4,ENABLE);//使能定時(shí)器 }void TIM4_IRQHandler(void) {if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET){LED1=!LED1;TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中斷標(biāo)志位} }實(shí)驗(yàn)現(xiàn)象:LED0閃爍,時(shí)間間隔就是定時(shí)器的溢出時(shí)間
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的STM32 定时器中断的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java学习(109):StringBu
- 下一篇: 45请求转发和请求重定向区别