Ⅰ關于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瀏覽量
25582 -
STM32
+關注
關注
2272文章
10923瀏覽量
357553 -
Tim
+關注
關注
0文章
81瀏覽量
17952 -
計數
+關注
關注
1文章
57瀏覽量
20145
發布評論請先 登錄
相關推薦
使用ADC08D500對模擬信號采樣時,遇到的延時疑問求解
關于ADS1120延時的疑問求解
延時開關接線技巧與注意事項有哪些
延時開關怎么調時間長短
延時開關上l和a是什么意思
如何使用定時器寫一個延時函數?
stm32cubemx的HAL_Delay()函數,當HAL_GetTick()的計數正好要溢出時,是不是延時就不準了?
FreeRtos能否直接讀取Rtos的系統時鐘計數器來實現延時統計,改如何讀取呢?
STM32F407以太網突然延時變高導致死機的原因?怎么解決?
stm32比較器輸出到timer_etr沒有計數是為什么?
用stm32f303進行ad采集,采集完需要延時1000ms,請問stm32f303的延時程序怎么寫?
STM32蜂鳴器音樂播放實例教程
![<b class='flag-5'>STM32</b>蜂鳴器音樂播放實例教程](https://file1.elecfans.com/web2/M00/C5/CA/wKgZomYCaVSAHG5SAAA5WnhfFpw591.png)
STM32F407在HAL庫下使用SPI通過DMA發送數據時,如何獲取DMA發送計數?
關于STM32 DMAMUX模塊具體的應用示例代碼
![<b class='flag-5'>關于</b><b class='flag-5'>STM32</b> DMAMUX模塊具體的應用示例代碼](https://file1.elecfans.com/web2/M00/C5/98/wKgZomYA0KWAXr1uAAActZx-jhs970.png)
評論