STM32 - 利用 SysTick 實現(xiàn)非中斷式延時函數(shù)
SysTick 是 Cortex-M 系列內(nèi)核中普遍存在的系統(tǒng)定時器,共 24 位(高 8 位保留),通過不斷遞減進(jìn)行計數(shù),到達(dá) 0 時將?SYST_CSR 的 COUNTFLAG?標(biāo)志位置?1 并根據(jù) TICKINT 標(biāo)志位決定是否產(chǎn)生內(nèi)核中斷。
因此,利用 SysTick 實現(xiàn)延時函數(shù)就分為中斷式和非中斷式兩種。前者容易產(chǎn)生優(yōu)先級沖突,也不適合在中斷函數(shù)中調(diào)用;這里選擇的是后者,直接對寄存器進(jìn)行操作和查詢。需要注意的是,使用 FreeRTOS 等實時操作系統(tǒng)時,修改?SysTick 會影響系統(tǒng)時鐘,建議采用軟件延時或使用其他定時器。

代碼部分如下(包含 SysTickDelay.c?以及 SysTickDelay.h):
延時函數(shù)的準(zhǔn)確性依賴于 SYSCLK,這里使用的是 STM32F1?系列單片機(jī),因此 SYSCLK 頻率設(shè)置為 72 MHz。若使用 STM32F4 系列,則需修改 SysTickDelay.c:
其他代碼主要用于操作寄存器,具體信息如下:

更多內(nèi)容參見?ARM 官網(wǎng):https://developer.arm.com/documentation/dui0552/a/cortex-m3-peripherals/system-timer--systick

隨便寫的代碼,還能進(jìn)一步優(yōu)化(主要是為了把文件存檔,方便日后參考)。