代碼的書寫過程中經常用到延時,這里主要講述一下HAl延時,HAL庫之HAL_Delay()函數在72M主頻,STM32CUBEMX自動生成情況下,默認為延時1ms單位,即HAL_Delay(500)表示500ms延時,這是因為在默認狀態下,SysTick()默認設置為1ms中斷,下面就原理進行敘述。
Systick 定時器延時原理
Systick(滴答時鐘)是一個24位,向下計數的定時器,當倒計時完成后,定時器可以產生一個中斷,所以,當頻率一定,計數個數一定時,這個中斷就會以一定的時間間隔發生,如果每個中斷發送后調用的中斷函數中給一個變量累加,這樣我們就可以獲得一個與時間相關的變量。
HAL_Delay()延時函數的使用
如果你使用STM32CubeMx來生成一個工程,那么使用Systick來延時是非常方便的,你只需要調用HAL庫的一個虛函數,它的原型如下:
__weak void HAL_Delay(__IO uint32_t Delay)
可以看到,HAL_Delay()是一個虛函數,這表明用戶可以在其它的位置重定義,如果這樣,新的函數將會取代它,編譯 過程中也不會出現重定義的錯誤。該函數只有一個32位的參數,明顯的,這個形參指定了延時的時間,它的單位是毫秒(ms)。

關于osDELAY函數可以看一下CMSIS_OS2.h里面的定義,我也是在網上查到具體的定義函數,如下,但是我在官方提供的函數中未找到相關的函數內容。實際使用中就是調用Free-RTOS函數,然后直接使用 OSdelay(5);含義就是延時50ms。
實際上系統OSdelay就是一種程序阻塞的狀態,在阻塞態下,其他資源函數進行工作,時間到從阻塞態變為就緒態,再到運行態。

軟件延時就是大家用的最多的,讓程序運行計算來延時,這就很多了,直接上代碼。
void delay_ms(u16 nms)
{
if(delay_osrunning&&delay_osintnesting==0) //如果OS已經在跑了,并且不是在中斷里面(中斷里面不能任務調度)
{
if(nms>=fac_ms) //延時的時間大于OS的最少時間周期
{
delay_ostimedly(nms/fac_ms); //OS延時
}
nms%=fac_ms; //OS已經無法提供這么小的延時了,采用普通方式延時
}
delay_us((u32)(nms*1000)); //普通方式延時
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //時間加載
SysTick->VAL=0x00; //清空計數器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //開始倒數
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待時間到達
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //關閉計數器
SysTick->VAL =0X00; //清空計數器
}
//延時nms
//注意nms的范圍
//SysTick->LOAD為24位寄存器,所以,最大延時為:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK單位為Hz,nms單位為ms
//對72M條件下,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; //時間加載(SysTick->LOAD為24bit)
SysTick->VAL =0x00; //清空計數器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //開始倒數
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待時間到達
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //關閉計數器
SysTick->VAL =0X00; //清空計數器
}
-
定時器
+關注
關注
23文章
3289瀏覽量
117354 -
延時函數
+關注
關注
0文章
25瀏覽量
10171 -
Systick
+關注
關注
0文章
63瀏覽量
13504
發布評論請先 登錄
STM32 SYSTICK定時器常見問題
SysTick定時器的相關資料推薦
STM32單片機使用定時器中斷方式實現毫秒級延時的設計

【STM32單片機-庫函數】SysTick延時—delay

【野火指南者】STM32F103延時函數及其系統定時器—SysTick

SysTick 定時器

STM32學習心得九:Systick滴答定時器和延時函數解讀

stm32之HAL庫實現us延時方法

STM32 HAL 庫延時函數 HAL_Delay 解析

【STM32】SysTick滴答定時器(delay延時函數講解)

評論