Ⅰ關(guān)于STM32的計(jì)數(shù)和延時(shí)
在STM32中,具有計(jì)數(shù)(或計(jì)時(shí))功能的模塊基本都能實(shí)現(xiàn)延時(shí)功能。如:系統(tǒng)滴答SysTick、定時(shí)器TIM、實(shí)時(shí)時(shí)鐘RTC、看門狗WDG。
精確延時(shí)一般使用定時(shí)器TIM即可實(shí)現(xiàn)。當(dāng)然,是否精確,取決于你的主頻(也就是晶振)是否準(zhǔn)確,如果主頻精確,那么實(shí)現(xiàn)的延時(shí)也一定精確。
一般來說,常溫下實(shí)現(xiàn)us微秒級(jí)的延時(shí),誤差還是挺小的(應(yīng)該說挺精確)。拿F407,主頻168M來說,可以實(shí)現(xiàn)幾十ns納秒的延時(shí),如果選用高精度的晶振,誤差還是很小的。
總結(jié):想要TIM定時(shí)器實(shí)現(xiàn)高精確的延時(shí),就需要高精度的晶振。主頻精確,那么延時(shí)就精確。
ⅡSTM32的TIM定時(shí)器
STM32的定時(shí)器有3類:
高級(jí)定時(shí)器Advanced control Timer
通用定時(shí)器General purpose Timer
基本定時(shí)器BasicTimer
STM32的這三種定時(shí)器都能實(shí)現(xiàn)最基本的定時(shí)計(jì)數(shù)功能。差異在于它們的功能多少不一樣,從結(jié)構(gòu)圖一目了然,下面以STM32F4為例,給大家展示一下F4三類定時(shí)器的結(jié)構(gòu)圖:
高級(jí)定時(shí)器
通用定時(shí)器
基本定時(shí)器
相信大家看了上面3種結(jié)構(gòu)圖,心里大概應(yīng)該明白它們的差異存在哪些地方。具體差異可以參看手冊(cè)中的“主要特性”,里面詳細(xì)講述了其中的功能和特性。
重要提示:
1.定時(shí)器的位數(shù)有16位和32位之分,詳見數(shù)據(jù)手冊(cè)。
2.定時(shí)器有多少個(gè),以及是TIM幾,同樣見數(shù)據(jù)手冊(cè)。如下圖STM32F411就只有8個(gè)定時(shí)器,沒有基本定時(shí)器。
ⅢSTM32定時(shí)器計(jì)數(shù)延時(shí)原理
上面3種定時(shí)器(高級(jí)、通用和基本)都能實(shí)現(xiàn)計(jì)數(shù)延時(shí)的功能,我們以最簡單的基本定時(shí)器為例,還是參看著結(jié)構(gòu)圖來說明:
1.來自RCC的時(shí)鐘,參看RCC時(shí)鐘樹,一般是SystemCoreClock或者SystemCoreClock/2, 如STM32F429的就是(180M/2)。
2.分頻CK_PSC之后就是計(jì)數(shù)器CK_CNT的計(jì)數(shù)頻率。
如分頻值位9,則計(jì)數(shù)頻率為1M. (180M / 2 /9= 10M).
3.實(shí)現(xiàn)1us計(jì)數(shù):
上面1秒計(jì)數(shù)10M個(gè)數(shù),那么我計(jì)10個(gè)數(shù),就是1us的時(shí)間。只需要在自動(dòng)重載寄存器ARR中填充10 - 1即可。
代碼分析:
紅定義
//計(jì)數(shù)時(shí)鐘(相當(dāng)于1秒鐘計(jì)數(shù)10M次個(gè)脈沖) #define TIM6_COUNTER_CLOCK 10000000 //預(yù)分頻值 #define TIM6_PRESCALER_VALUE (SystemCoreClock/2/TIM6_COUNTER_CLOCK - 1) //定時(shí)周期(計(jì)數(shù)滿10個(gè)算一個(gè)周期,也就是1us) #define TIM6_PERIOD_TIMING (10 - 1)
配置
void TIM6_Configuration(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM6時(shí)基單元配置 */ TIM_TimeBaseStructure.TIM_Prescaler = TIM6_PRESCALER_VALUE; //預(yù)分頻值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計(jì)數(shù)模式 TIM_TimeBaseStructure.TIM_Period = TIM6_PERIOD_TIMING; //定時(shí)周期 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //時(shí)鐘分頻因子 TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); //使能"更新"中斷 }
如果需要中斷,則開啟1us中斷。
定時(shí)器阻塞延時(shí)
void TIM6_Nus(uint16_t Times){ TIM_Cmd(TIM6, ENABLE); //啟動(dòng)定時(shí)器 while(Times--) { while(TIM_GetFlagStatus(TIM6, TIM_FLAG_Update) == RESET); //等待計(jì)數(shù)完成 TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除標(biāo)志 } TIM_Cmd(TIM6, DISABLE); //關(guān)閉定時(shí)器 }
以上代碼,之前有分享過類似的,在下載區(qū) STM32F417_第一階段里面。
提示:
1.這類阻塞延時(shí),僅供學(xué)習(xí)其原理使用,請(qǐng)結(jié)合實(shí)際項(xiàng)目修改代碼。
2.可以通過定時(shí)中斷 + 讀取計(jì)數(shù)器的值來獲取精確的時(shí)間。
比如:1ms中斷一次,同時(shí),計(jì)數(shù)累加。獲取計(jì)數(shù)值 +累計(jì)值也能得出精確延時(shí)。 (當(dāng)然,中斷不能太頻繁), 此原理,適用于其他SysTick,RTC等具有計(jì)數(shù)功能的模塊。
-
延時(shí)
+關(guān)注
關(guān)注
0文章
108瀏覽量
25770 -
STM32
+關(guān)注
關(guān)注
2283文章
10986瀏覽量
361321 -
Tim
+關(guān)注
關(guān)注
0文章
83瀏覽量
18183 -
計(jì)數(shù)
+關(guān)注
關(guān)注
1文章
57瀏覽量
20286
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
STM32F030內(nèi)部晶振怎么設(shè)置,內(nèi)部晶振是延時(shí)函數(shù)怎么設(shè)置?
使用STM32F030時(shí)沒使用內(nèi)部晶振怎么設(shè)置,使用內(nèi)部晶振時(shí)延時(shí)函數(shù)怎么寫?
延時(shí)繼電器功能匯總與應(yīng)用
使用ADC08D500對(duì)模擬信號(hào)采樣時(shí),遇到的延時(shí)疑問求解
關(guān)于ADS1120延時(shí)的疑問求解
延時(shí)開關(guān)需要零線嗎為什么
延時(shí)開關(guān)接線技巧與注意事項(xiàng)有哪些
延時(shí)開關(guān)改手動(dòng)開關(guān)怎么接線
延時(shí)開關(guān)怎么調(diào)時(shí)間長短
延時(shí)開關(guān)上l和a是什么意思
揭秘:單片機(jī)硬件與軟件延時(shí)之大不同!

評(píng)論