日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 定时器中断

發(fā)布時(shí)間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 定时器中断 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

通用定時(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í)鐘。
RCC_APB1PeriphClockCmd();
  • 初始化定時(shí)器,配置ARR,PSC。
TIM_TimeBaseInit();
  • 開啟定時(shí)器中斷,配置NVIC。
void TIM_ITConfig();NVIC_Init();
  • 使能定時(shí)器。
TIM_Cmd();
  • 編寫中斷服務(wù)函數(shù)。
TIMx_IRQHandler();//中斷函數(shù)要判斷中斷標(biāo)志位,和手動(dòng)清除中斷標(biāo)志位 ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT); void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。