代碼的書寫過程中經(jīng)常用到延時,這里主要講述一下HAl延時,HAL庫之HAL_Delay()函數(shù)在72M主頻,STM32CUBEMX自動生成情況下,默認(rèn)為延時1ms單位,即HAL_Delay(500)表示500ms延時,這是因?yàn)樵谀J(rèn)狀態(tài)下,SysTick()默認(rèn)設(shè)置為1ms中斷,下面就原理進(jìn)行敘述。
Systick 定時器延時原理
Systick(滴答時鐘)是一個24位,向下計(jì)數(shù)的定時器,當(dāng)?shù)褂?jì)時完成后,定時器可以產(chǎn)生一個中斷,所以,當(dāng)頻率一定,計(jì)數(shù)個數(shù)一定時,這個中斷就會以一定的時間間隔發(fā)生,如果每個中斷發(fā)送后調(diào)用的中斷函數(shù)中給一個變量累加,這樣我們就可以獲得一個與時間相關(guān)的變量。
HAL_Delay()延時函數(shù)的使用
如果你使用STM32CubeMx來生成一個工程,那么使用Systick來延時是非常方便的,你只需要調(diào)用HAL庫的一個虛函數(shù),它的原型如下:
__weak void HAL_Delay(__IO uint32_t Delay)
可以看到,HAL_Delay()是一個虛函數(shù),這表明用戶可以在其它的位置重定義,如果這樣,新的函數(shù)將會取代它,編譯 過程中也不會出現(xiàn)重定義的錯誤。該函數(shù)只有一個32位的參數(shù),明顯的,這個形參指定了延時的時間,它的單位是毫秒(ms)。
![214344dcweern3lcl5n0n3.jpg](https://file1.elecfans.com/web2/M00/8D/62/wKgaomS6ACSACJ9HAAAAonla07I147.jpg)
關(guān)于osDELAY函數(shù)可以看一下CMSIS_OS2.h里面的定義,我也是在網(wǎng)上查到具體的定義函數(shù),如下,但是我在官方提供的函數(shù)中未找到相關(guān)的函數(shù)內(nèi)容。實(shí)際使用中就是調(diào)用Free-RTOS函數(shù),然后直接使用 OSdelay(5);含義就是延時50ms。
實(shí)際上系統(tǒng)OSdelay就是一種程序阻塞的狀態(tài),在阻塞態(tài)下,其他資源函數(shù)進(jìn)行工作,時間到從阻塞態(tài)變?yōu)榫途w態(tài),再到運(yùn)行態(tài)。
![214159vzr15eiii9ibx898.jpg](https://file1.elecfans.com/web2/M00/8D/62/wKgaomS6ACWADXm-AAAAonla07I851.jpg)
軟件延時就是大家用的最多的,讓程序運(yùn)行計(jì)算來延時,這就很多了,直接上代碼。
void delay_ms(u16 nms)
{
if(delay_osrunning&&delay_osintnesting==0) //如果OS已經(jīng)在跑了,并且不是在中斷里面(中斷里面不能任務(wù)調(diào)度)
{
if(nms>=fac_ms) //延時的時間大于OS的最少時間周期
{
delay_ostimedly(nms/fac_ms); //OS延時
}
nms%=fac_ms; //OS已經(jīng)無法提供這么小的延時了,采用普通方式延時
}
delay_us((u32)(nms*1000)); //普通方式延時
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //時間加載
SysTick->VAL=0x00; //清空計(jì)數(shù)器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //開始倒數(shù)
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待時間到達(dá)
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //關(guān)閉計(jì)數(shù)器
SysTick->VAL =0X00; //清空計(jì)數(shù)器
}
//延時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; //清空計(jì)數(shù)器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //開始倒數(shù)
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待時間到達(dá)
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //關(guān)閉計(jì)數(shù)器
SysTick->VAL =0X00; //清空計(jì)數(shù)器
}
-
定時器
+關(guān)注
關(guān)注
23文章
3256瀏覽量
115409 -
延時函數(shù)
+關(guān)注
關(guān)注
0文章
25瀏覽量
10056 -
Systick
+關(guān)注
關(guān)注
0文章
62瀏覽量
13155
發(fā)布評論請先 登錄
相關(guān)推薦
STM32 SYSTICK定時器常見問題
Systick定時器是如何去實(shí)現(xiàn)delay延時的
如何用Systick定時器去實(shí)現(xiàn)delay延時函數(shù)呢
SysTick定時器的相關(guān)資料推薦
STM32單片機(jī)使用定時器中斷方式實(shí)現(xiàn)毫秒級延時的設(shè)計(jì)
![STM32單片機(jī)使用<b class='flag-5'>定時器</b>中斷方式實(shí)現(xiàn)毫秒級<b class='flag-5'>延時</b>的設(shè)計(jì)](https://file.elecfans.com/web1/M00/95/4F/pIYBAFz2F-qAetlzAAB-55EyDOc695.jpg)
【STM32單片機(jī)-庫函數(shù)】SysTick延時—delay
![【STM32單片機(jī)-庫<b class='flag-5'>函數(shù)</b>】<b class='flag-5'>SysTick</b><b class='flag-5'>延時</b>—<b class='flag-5'>delay</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【野火指南者】STM32F103延時函數(shù)及其系統(tǒng)定時器—SysTick
![【野火指南者】STM32F103<b class='flag-5'>延時</b><b class='flag-5'>函數(shù)</b>及其系統(tǒng)<b class='flag-5'>定時器</b>—<b class='flag-5'>SysTick</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32F4: Systick滴答定時器-延時函數(shù)講解(五)
![STM32F4: <b class='flag-5'>Systick</b>滴答<b class='flag-5'>定時器</b>-<b class='flag-5'>延時</b><b class='flag-5'>函數(shù)</b>講解(五)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
SysTick 定時器
![<b class='flag-5'>SysTick</b> <b class='flag-5'>定時器</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32學(xué)習(xí)心得九:Systick滴答定時器和延時函數(shù)解讀
![STM32學(xué)習(xí)心得九:<b class='flag-5'>Systick</b>滴答<b class='flag-5'>定時器</b>和<b class='flag-5'>延時</b><b class='flag-5'>函數(shù)</b>解讀](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32之HAL庫實(shí)現(xiàn)us延時方法
![stm32之<b class='flag-5'>HAL</b>庫實(shí)現(xiàn)us<b class='flag-5'>延時</b>方法](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32 HAL 庫延時函數(shù) HAL_Delay 解析
![STM32 <b class='flag-5'>HAL</b> 庫<b class='flag-5'>延時</b><b class='flag-5'>函數(shù)</b> <b class='flag-5'>HAL_Delay</b> 解析](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32】SysTick滴答定時器(delay延時函數(shù)講解)
![【STM32】<b class='flag-5'>SysTick</b>滴答<b class='flag-5'>定時器</b>(<b class='flag-5'>delay</b><b class='flag-5'>延時</b><b class='flag-5'>函數(shù)</b>講解)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論