本文介紹如何使用STM32 SysTick系統定時器實現延時功能。
本文適合對單片機及C語言有一定基礎的開發人員閱讀,MCU使用STM32F103VE系列。
1.1. 介紹
SysTick—系統定時器是CM3內核中的一個24bit 的向下遞減的計數器,計數器每計數一次的時間為 1/SYSCLK,當計數器值遞減到0的時候,將自動重裝載計數初值,開始新一輪計數系統,可以用SysTick實現簡單的延時函數。
1.2. 說明
SysTick_Config()函數設置計數器重裝載值,將當前值設置為0,並使能定時器。
1.3. 操作
直接調用delay_us()和delay_ms()函數即可。
1 void delay_us(__IO uint32_t us) 2 { 3 uint32_t i; 4 5 //將一次計數器時間設置為1us 6 SysTick_Config(SystemCoreClock / 1000000); 7 8 for(i = 0; i < us; i++) 9 { 10 // 當計數器的值減小到0的時候,CTRL寄存器COUNTFLAG會置1 11 while( !((SysTick->CTRL) & SysTick_CTRL_COUNTFLAG_Msk) ); 12 } 13 // CTRL寄存器ENABLE寄存器置零,關閉SysTick定時器 14 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; 15 16 } 17 18 void delay_ms(__IO uint32_t ms) 19 { 20 uint32_t i; 21 22 //將一次計數器時間設置為1ms 23 SysTick_Config(SystemCoreClock / 1000); 24 25 for(i = 0; i < ms; i++) 26 { 27 // 當計數器的值減小到0的時候,CTRL寄存器COUNTFLAG會置1 28 while( !((SysTick->CTRL) & SysTick_CTRL_COUNTFLAG_Msk) ); 29 } 30 // CTRL寄存器ENABLE寄存器置零,關閉SysTick定時器 31 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; 32 }
main()函數
1 int main(void) 2 { 3 while (1) 4 { 5 delay_us(100); 6 delay_ms(100); 7 } 8 }
仿真結果
編譯完成后,點擊開始仿真,單步執行,可以在下方狀態欄查看程序執行時間。
可以看到在delay_us(100)函數執行前后時間差距大約是0.0001s,也就是100us,而delay_ms(100)函數執行前后時間差距大約是0.1s,也就是100ms,因此延時功能正確。