Ⅰ關于STM32的計數和延時
在STM32中,具有計數(或計時)功能的模塊基本都能實現延時功能。如:系統滴答SysTick、定時器TIM、實時時鐘RTC、看門狗WDG。
精確延時一般使用定時器TIM即可實現。當然,是否精確,取決于你的主頻(也就是晶振)是否準確,如果主頻精確,那么實現的延時也一定精確。
一般來說,常溫下實現us微秒級的延時,誤差還是挺小的(應該說挺精確)。拿F407,主頻168M來說,可以實現幾十ns納秒的延時,如果選用高精度的晶振,誤差還是很小的。
總結:想要TIM定時器實現高精確的延時,就需要高精度的晶振。主頻精確,那么延時就精確。
ⅡSTM32的TIM定時器
STM32的定時器有3類:
高級定時器Advanced control Timer
通用定時器General purpose Timer
基本定時器BasicTimer
STM32的這三種定時器都能實現最基本的定時計數功能。差異在于它們的功能多少不一樣,從結構圖一目了然,下面以STM32F4為例,給大家展示一下F4三類定時器的結構圖:
高級定時器
通用定時器
基本定時器
相信大家看了上面3種結構圖,心里大概應該明白它們的差異存在哪些地方。具體差異可以參看手冊中的“主要特性”,里面詳細講述了其中的功能和特性。
重要提示:
1.定時器的位數有16位和32位之分,詳見數據手冊。
2.定時器有多少個,以及是TIM幾,同樣見數據手冊。如下圖STM32F411就只有8個定時器,沒有基本定時器。
ⅢSTM32定時器計數延時原理
上面3種定時器(高級、通用和基本)都能實現計數延時的功能,我們以最簡單的基本定時器為例,還是參看著結構圖來說明:
1.來自RCC的時鐘,參看RCC時鐘樹,一般是SystemCoreClock或者SystemCoreClock/2, 如STM32F429的就是(180M/2)。
2.分頻CK_PSC之后就是計數器CK_CNT的計數頻率。
如分頻值位9,則計數頻率為1M. (180M / 2 /9= 10M).
3.實現1us計數:
上面1秒計數10M個數,那么我計10個數,就是1us的時間。只需要在自動重載寄存器ARR中填充10 - 1即可。
代碼分析:
紅定義
//計數時鐘(相當于1秒鐘計數10M次個脈沖) #define TIM6_COUNTER_CLOCK 10000000 //預分頻值 #define TIM6_PRESCALER_VALUE (SystemCoreClock/2/TIM6_COUNTER_CLOCK - 1) //定時周期(計數滿10個算一個周期,也就是1us) #define TIM6_PERIOD_TIMING (10 - 1)
配置
void TIM6_Configuration(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM6時基單元配置 */ TIM_TimeBaseStructure.TIM_Prescaler = TIM6_PRESCALER_VALUE; //預分頻值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數模式 TIM_TimeBaseStructure.TIM_Period = TIM6_PERIOD_TIMING; //定時周期 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //時鐘分頻因子 TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); //使能"更新"中斷 }
如果需要中斷,則開啟1us中斷。
定時器阻塞延時
void TIM6_Nus(uint16_t Times){ TIM_Cmd(TIM6, ENABLE); //啟動定時器 while(Times--) { while(TIM_GetFlagStatus(TIM6, TIM_FLAG_Update) == RESET); //等待計數完成 TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除標志 } TIM_Cmd(TIM6, DISABLE); //關閉定時器 }
以上代碼,之前有分享過類似的,在下載區 STM32F417_第一階段里面。
提示:
1.這類阻塞延時,僅供學習其原理使用,請結合實際項目修改代碼。
2.可以通過定時中斷 + 讀取計數器的值來獲取精確的時間。
比如:1ms中斷一次,同時,計數累加。獲取計數值 +累計值也能得出精確延時。 (當然,中斷不能太頻繁), 此原理,適用于其他SysTick,RTC等具有計數功能的模塊。
-
延時
+關注
關注
0文章
107瀏覽量
25546 -
STM32
+關注
關注
2270文章
10906瀏覽量
356560 -
Tim
+關注
關注
0文章
81瀏覽量
17910 -
計數
+關注
關注
1文章
56瀏覽量
20120
發布評論請先 登錄
相關推薦
評論