Ⅰ關(guān)于STM32的計數(shù)和延時
在STM32中,具有計數(shù)(或計時)功能的模塊基本都能實(shí)現(xiàn)延時功能。如:系統(tǒng)滴答SysTick、定時器TIM、實(shí)時時鐘RTC、看門狗WDG。
精確延時一般使用定時器TIM即可實(shí)現(xiàn)。當(dāng)然,是否精確,取決于你的主頻(也就是晶振)是否準(zhǔn)確,如果主頻精確,那么實(shí)現(xiàn)的延時也一定精確。
一般來說,常溫下實(shí)現(xiàn)us微秒級的延時,誤差還是挺小的(應(yīng)該說挺精確)。拿F407,主頻168M來說,可以實(shí)現(xiàn)幾十ns納秒的延時,如果選用高精度的晶振,誤差還是很小的。
總結(jié):想要TIM定時器實(shí)現(xiàn)高精確的延時,就需要高精度的晶振。主頻精確,那么延時就精確。
ⅡSTM32的TIM定時器
STM32的定時器有3類:
高級定時器Advanced control Timer
通用定時器General purpose Timer
基本定時器BasicTimer
STM32的這三種定時器都能實(shí)現(xiàn)最基本的定時計數(shù)功能。差異在于它們的功能多少不一樣,從結(jié)構(gòu)圖一目了然,下面以STM32F4為例,給大家展示一下F4三類定時器的結(jié)構(gòu)圖:
高級定時器
通用定時器
基本定時器
相信大家看了上面3種結(jié)構(gòu)圖,心里大概應(yīng)該明白它們的差異存在哪些地方。具體差異可以參看手冊中的“主要特性”,里面詳細(xì)講述了其中的功能和特性。
重要提示:
1.定時器的位數(shù)有16位和32位之分,詳見數(shù)據(jù)手冊。
2.定時器有多少個,以及是TIM幾,同樣見數(shù)據(jù)手冊。如下圖STM32F411就只有8個定時器,沒有基本定時器。
ⅢSTM32定時器計數(shù)延時原理
上面3種定時器(高級、通用和基本)都能實(shí)現(xiàn)計數(shù)延時的功能,我們以最簡單的基本定時器為例,還是參看著結(jié)構(gòu)圖來說明:
1.來自RCC的時鐘,參看RCC時鐘樹,一般是SystemCoreClock或者SystemCoreClock/2, 如STM32F429的就是(180M/2)。
2.分頻CK_PSC之后就是計數(shù)器CK_CNT的計數(shù)頻率。
如分頻值位9,則計數(shù)頻率為1M. (180M / 2 /9= 10M).
3.實(shí)現(xiàn)1us計數(shù):
上面1秒計數(shù)10M個數(shù),那么我計10個數(shù),就是1us的時間。只需要在自動重載寄存器ARR中填充10 - 1即可。
代碼分析:
紅定義
//計數(shù)時鐘(相當(dāng)于1秒鐘計數(shù)10M次個脈沖) #define TIM6_COUNTER_CLOCK 10000000 //預(yù)分頻值 #define TIM6_PRESCALER_VALUE (SystemCoreClock/2/TIM6_COUNTER_CLOCK - 1) //定時周期(計數(shù)滿10個算一個周期,也就是1us) #define TIM6_PERIOD_TIMING (10 - 1)
配置
void TIM6_Configuration(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM6時基單元配置 */ TIM_TimeBaseStructure.TIM_Prescaler = TIM6_PRESCALER_VALUE; //預(yù)分頻值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數(shù)模式 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); //等待計數(shù)完成 TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除標(biāo)志 } TIM_Cmd(TIM6, DISABLE); //關(guān)閉定時器 }
以上代碼,之前有分享過類似的,在下載區(qū) STM32F417_第一階段里面。
提示:
1.這類阻塞延時,僅供學(xué)習(xí)其原理使用,請結(jié)合實(shí)際項(xiàng)目修改代碼。
2.可以通過定時中斷 + 讀取計數(shù)器的值來獲取精確的時間。
比如:1ms中斷一次,同時,計數(shù)累加。獲取計數(shù)值 +累計值也能得出精確延時。 (當(dāng)然,中斷不能太頻繁), 此原理,適用于其他SysTick,RTC等具有計數(shù)功能的模塊。
-
延時
+關(guān)注
關(guān)注
0文章
107瀏覽量
25590 -
STM32
+關(guān)注
關(guān)注
2273文章
10926瀏覽量
357800 -
Tim
+關(guān)注
關(guān)注
0文章
81瀏覽量
17971 -
計數(shù)
+關(guān)注
關(guān)注
1文章
57瀏覽量
20153
發(fā)布評論請先 登錄
相關(guān)推薦
使用ADC08D500對模擬信號采樣時,遇到的延時疑問求解
關(guān)于ADS1120延時的疑問求解
延時開關(guān)接線技巧與注意事項(xiàng)有哪些
延時開關(guān)怎么調(diào)時間長短
延時開關(guān)上l和a是什么意思
揭秘:單片機(jī)硬件與軟件延時之大不同!
![揭秘:單片機(jī)硬件與軟件<b class='flag-5'>延時</b>之大不同!](https://file.elecfans.com/web2/M00/20/B3/pYYBAGGfNNmAK-PZAAJsGM5Cgk0227.jpg)
如何使用定時器寫一個延時函數(shù)?
stm32cubemx的HAL_Delay()函數(shù),當(dāng)HAL_GetTick()的計數(shù)正好要溢出時,是不是延時就不準(zhǔn)了?
FreeRtos能否直接讀取Rtos的系統(tǒng)時鐘計數(shù)器來實(shí)現(xiàn)延時統(tǒng)計,改如何讀取呢?
STM32F407以太網(wǎng)突然延時變高導(dǎo)致死機(jī)的原因?怎么解決?
stm32比較器輸出到timer_etr沒有計數(shù)是為什么?
用stm32f303進(jìn)行ad采集,采集完需要延時1000ms,請問stm32f303的延時程序怎么寫?
STM32蜂鳴器音樂播放實(shí)例教程
![<b class='flag-5'>STM32</b>蜂鳴器音樂播放實(shí)例教程](https://file1.elecfans.com/web2/M00/C5/CA/wKgZomYCaVSAHG5SAAA5WnhfFpw591.png)
STM32F407在HAL庫下使用SPI通過DMA發(fā)送數(shù)據(jù)時,如何獲取DMA發(fā)送計數(shù)?
關(guān)于STM32 DMAMUX模塊具體的應(yīng)用示例代碼
![<b class='flag-5'>關(guān)于</b><b class='flag-5'>STM32</b> DMAMUX模塊具體的應(yīng)用示例代碼](https://file1.elecfans.com/web2/M00/C5/98/wKgZomYA0KWAXr1uAAActZx-jhs970.png)
評論