目錄
前言
一、
1.for/while循環(huán)延時
2.匯編延時
3.SYSTICK定時器延時
SYSTICK相關(guān)寄存器
總結(jié)
前言
????????延時函數(shù)是嵌入式中最常用到的測試手段,發(fā)現(xiàn)有許多方式可以達(dá)到延時的目的,所以這里做一點小總結(jié)。
一、
1.for/while循環(huán)延時
代碼如下:
#define SystemCoreClock (26000000U) //時鐘頻率26M
void delay(int time)
{
for (int i = 0; i < time; i--);
}
時間公式:延時 = time * 2 * 機器周期 * 指令周期 *(1/26M)
鏈接:*2的原因
2.匯編延時
代碼如下:
/*匯編延時*/
#define SystemCoreClock (26000000U) //時鐘頻率26M
__asm void
SysCtlDelay(unsigned long ulCount)
{
subs r0,#1;
bne SysCtlDelay;
bx lr;
}
//us級延時,延時n微秒
SysCtlDelay(n*(SystemCoreClock/(3*1000000)))
SystemCoreClock: 為單片機時鐘頻率,使用時需要更改。(一般System_CMSDK_CMx.h里已經(jīng)設(shè)置好了)
SysCtlDelay:ulCount = n*(SystemCoreClock/(3*1000000))
????????SystemCoreClock/(3*1000000)是因為SysCtlDelay內(nèi)有3條指令,公式結(jié)果為1us。
3.SYSTICK定時器延時
代碼如下:
/*SYSTICK定時器延時*/
#define SystemCoreClock (26000000U) //這里是系統(tǒng)時鐘,需要根據(jù)芯片進行修改
#define MS_DELAY (1000U)
#define US_DELAY (1000000U)
void delay_ms(uint8_t ms) //ms延時函數(shù)
{
/* systick delay ms*/
SysTick->CTRL = (1 << 2);
SysTick->LOAD = SystemCoreClock / MS_DELAY * ms;
SysTick->VAL = 0;
SysTick->CTRL = (1 << 2) | (1 << 0);
while ((SysTick->CTRL & (1 << 16)) == 0);
SysTick->CTRL = (1 << 2);
}
SYSTICK相關(guān)寄存器
SysTick控制和狀態(tài)寄存器(STK_CTRL)
????????一般用來控制systick定時器的開關(guān),使用時需要根據(jù)相應(yīng)的芯片更改相應(yīng)的位操作。?
位 | 寄存器 | 作用 |
16 | COUNFLAG | 定時器倒計數(shù)到0時,該為由硬件自動置1 |
2 | CLKSOURCE | 選擇時鐘分頻:1:AHB? ?0:AHB/(8 or 2) |
1 | TICKINT | 定時器異常請求使能:0:不產(chǎn)生中斷,1:產(chǎn)生中斷 |
0 | TICKINT | 使能計數(shù)器 0:失能,1:使能 |
SysTick自動重裝載值寄存器(STK_LOAD)
? ? ? ? 計數(shù)器初始值,自定義,需要自己計算,公式一般如上所示。LOAD的值決定一個時鐘頻率內(nèi)產(chǎn)生的中斷次數(shù),中斷次數(shù)為MS_DELAY。
????????范圍一般為:0x00000001~0x00FFFFFF。
SysTick當(dāng)前值值寄存器(STK_VAL)
? ? ? ? 每次從LOAD中獲取值,直到為0。
相比起前兩種,定時器的延時更準(zhǔn)確,但是,由于是系統(tǒng)時鐘控制,記得使用前保證系統(tǒng)時鐘的頻率準(zhǔn)確。
總結(jié)
????????前兩種時鐘是CPU時鐘,后一個為系統(tǒng)時鐘,一般情況下CPU時鐘是等于系統(tǒng)時鐘的,但當(dāng)系統(tǒng)時鐘出錯時,兩者便不相等了。寫這篇BLOG的目的是在工作中湊巧碰到了需要測量時鐘是否準(zhǔn)確的情況,所以寫了下來分享給其他需要的伙伴。文章來源:http://www.zghlxwxcb.cn/news/detail-708498.html
? ? ? ? PS:本人第一篇BLOG? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2023/06/10? ----BeMi·Aino文章來源地址http://www.zghlxwxcb.cn/news/detail-708498.html
到了這里,關(guān)于【STM32】的延時函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!