STM32 延時(shí)函數(shù)解析
一、函數(shù)原型
STM32官方提供的函數(shù)庫(kù)中,可以找到類(lèi)似于 HAL_Delay() 這樣的函數(shù)。這個(gè)函數(shù)的就是通過(guò)使用定時(shí)器,達(dá)到一個(gè)較為精確的時(shí)間延遲,提供給用戶調(diào)用。
這個(gè)函數(shù)一般包含在類(lèi)似于 stm32f4xx_hal.c 這樣的函數(shù)中。函數(shù)原型如下:
__weak void HAL_Delay(__IO uint32_t Delay)
{
uint32_t tickstart = 0U;
tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart) < Delay)
{
}
}
輸入?yún)?shù)為需要延時(shí)的時(shí)間,單位為毫秒(ms)。其中調(diào)用的 HAL_GetTick() 函數(shù)為獲取計(jì)數(shù)值 uwTick,該計(jì)數(shù)值在中段服務(wù)函數(shù)中進(jìn)行加一操作。
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}
在中斷服務(wù)函數(shù)如下:
void SysTick_Handler(void)
{
uwTick++;
}
該中斷服務(wù)函數(shù)為系統(tǒng)定時(shí)器SysTick的中斷響應(yīng)。而該定時(shí)器的初始化函數(shù) HAL_InitTick() 是在 stm32f4xx_hal.c文件里定義,并在 HAL_Init() 函數(shù)中被調(diào)用。
查看其初始化函數(shù) HAl_InitTick() ,內(nèi)容如下:
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
/*Configure the SysTick to have interrupt in 1ms time basis*/
HAL_SYSTICK_Config(SystemCoreClock/1000U);
/*Configure the SysTick IRQ priority */
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0U);
/* Return function status */
return HAL_OK;
}
這個(gè)函數(shù)首先是為該定時(shí)器設(shè)置中斷產(chǎn)生的周期,例如當(dāng)前情況下為1ms,也就是沒(méi)一毫秒都要產(chǎn)生一次中斷。其次是為該定時(shí)器設(shè)置中斷優(yōu)先級(jí)。
二、函數(shù)說(shuō)明
用戶在使用延時(shí)時(shí),直接調(diào)用函數(shù) HAl_Delay(time),填入需要延時(shí)的時(shí)長(zhǎng),單位為毫秒,例如填入5000,則代表延遲5秒,這段時(shí)間MCU會(huì)產(chǎn)生5000次中斷,進(jìn)5000次中斷服務(wù)函數(shù)對(duì)計(jì)數(shù)值進(jìn)行加一操作。
延時(shí)函數(shù)的核心語(yǔ)句為 while循環(huán),如下:
while((HAL_GetTick() - tickstart) < Delay)
{
}
這個(gè)函數(shù)在條件滿足時(shí)會(huì)一直循環(huán),但是由于循環(huán)體為空,所以實(shí)際上循環(huán)是不產(chǎn)生任何操作的,直到循環(huán)不滿足,也就是計(jì)數(shù)值在不斷加一操作后的值減去開(kāi)始延遲時(shí)值已經(jīng)大于延時(shí)值時(shí)。此時(shí)條件不滿足,循環(huán)結(jié)束,程序繼續(xù)向下執(zhí)行。
關(guān)于上面這個(gè)while循環(huán),還可以用采用for循環(huán)寫(xiě)的版本,如下:
for( ;(HAL_GetTick() - tickstart) < Delay; );
即僅使用for循環(huán)的一個(gè)條件,這段代碼等同于如下代碼:
for(;;)
{
if((HAL_GetTick() - tickstart) > Delay)
break;
}
三、更多說(shuō)明
1、關(guān)于 SysTick 定時(shí)器,數(shù)據(jù)手冊(cè)的說(shuō)明如下:
2、關(guān)于for和while循環(huán)的效率說(shuō)明