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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32定时器延时函数

發布時間:2024/3/12 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32定时器延时函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文用STM32F205芯片中的TIM3為例,寫了兩種定時器延時函數。本人所知的延時函數方式有3種,通過定時器中斷方式的延時函數在本文中暫時不提及。為方便自己記憶,以下均為自己總結,如有錯誤,歡迎大家討論。
TIM3掛載在APB1上,30MHz,故TIM3的始終頻率為60MHz。

方法一:1. 先配置定時器的單次定時時長,定時器分頻為1M,即每計一個數需要1us。
2. 寫延時函數,當計數器的計數值大于給定的計數值時,停止計數。

void TIM3_Init(void) {TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3時鐘TIM_TimeBaseInitStructure.TIM_Period = 50000-1; //自動重裝載值TIM_TimeBaseInitStructure.TIM_Prescaler = 60-1; //定時器分頻TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3 }//微秒級延時 void TIM3_Delayus(u16 xus) {TIM_Cmd(TIM3,ENABLE); //啟動定時器while(TIM3->CNT < xus);TIM3->CNT = 0;TIM_Cmd(TIM3,DISABLE); //關閉定時器 }//毫秒級延時 void TIM3_Delayms(u16 xms) {int i;for(i=0;i<xms;i++){TIM3_Delayus(1000);} }

注意:通過這個方法寫的定時器延時函數,微秒級延時時長必須小于單次定時時長,即自動重裝載值必須設置大一點,但也不能超過最大值。

方法二:將定時時長跟自動重裝載值聯系在一起,當檢測SR寄存器發生計數溢出,關閉定時器。

//毫秒級延時 void TIM3_Delayms(u16 xms) {TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3時鐘TIM_TimeBaseInitStructure.TIM_Period = xms*10-1; //自動重裝載值TIM_TimeBaseInitStructure.TIM_Prescaler = 6000-1; //定時器分頻TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3TIM3->SR = 0;TIM_Cmd(TIM3,ENABLE); //啟動定時器while((TIM3->SR & TIM_FLAG_Update)!=SET);TIM_Cmd(TIM3,DISABLE); //關閉定時器TIM3->CNT = 0; }

注意:在使用方法二的延時時,在啟動定時器前需要先將SR寄存器清空,否則會出問題。

總結

以上是生活随笔為你收集整理的STM32定时器延时函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。