日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 一、函數(shù)原型STM32官方提供的函數(shù)庫(kù)中,可以找到類(lèi)似于 HAL_Delay() 這樣的函數(shù)。這個(gè)函數(shù)的就是通過(guò)使用定時(shí)器,達(dá)到一個(gè)較為精確的時(shí)間延遲,提供給用戶調(diào)用。這個(gè)函數(shù)一般包含在類(lèi)似于 stm32f4xx_ha

一、函數(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ō)明

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉