STM32滴答定时器(SysTick)原理及延时函数实现
一、滴答定时器(SysTick)简介
SysTick是ARM Cortex内核内置的一个24位向下递减计数器,通常用于操作系统的时基和任务调度。STM32中,这个定时器也经常用于实现精准的延时功能。
SysTick的寄存器包括:
-
CTRL (控制和状态寄存器)
-
LOAD (重装载寄存器)
-
VAL (当前值寄存器)
-
CALIB (校准寄存器)
二、SysTick工作原理
SysTick计数器工作过程为:
-
用户写入LOAD寄存器以设置初始倒数值。
-
当计数器使能后,计数器VAL以系统时钟(或系统时钟8分频)频率递减。
-
当计数器递减到0时,触发一个计数结束标志,并重新装载LOAD寄存器的值继续倒数。
利用这一特性,可以实现精准延时。
三、延时函数实现
下面是一个典型的STM32基于SysTick实现微秒(us)与毫秒(ms)延时函数的示例。
#include "stm32f10x.h"
// 初始化滴答定时器
void SysTick_Init(void)
{
SysTick->CTRL = 0; // 禁用SysTick
SysTick->LOAD = 0xFFFFFF; // 最大重装值
SysTick->VAL = 0; // 清空当前计数值
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; // 选择内核时钟,启动计数
}
// 微秒级延时函数
void delay_us(uint32_t us)
{
uint32_t ticks = us * (SystemCoreClock / 1000000);
SysTick->LOAD = ticks;
SysTick->VAL = 0; // 清空VAL
// 等待计数完成
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
}
// 毫秒级延时函数(基于微秒函数实现)
void delay_ms(uint32_t ms)
{
while (ms--)
delay_us(1000);
}
四、注意事项
-
在延时函数调用之前,必须调用
SysTick_Init()
初始化滴答定时器。 -
SystemCoreClock
为系统主频(如STM32F103通常为72MHz),确保该变量已经正确初始化。 -
由于SysTick是24位计数器,因此延时的最大值不能超过
LOAD
寄存器所能存储的最大值。
五、总结
STM32中SysTick定时器以其高精度和内置特性,非常适合用于延时函数实现和实时操作系统的时钟节拍,实现简单且精确,是嵌入式开发中非常常见的一种延时方法。