本文介绍如何使用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,因此延时功能正确。