stm32systick滴答定时器
时间: 2025-06-07 12:35:14 浏览: 22
### STM32 SysTick滴答定时器使用教程
#### 介绍
SysTick 是 ARM Cortex-M 系列处理器中的一个简单易用的倒计数定时器,广泛应用于嵌入式系统中作为时间基准。该定时器包含四个主要寄存器用于配置和监控其行为[^1]。
#### 主要特性
- **24位递减计数器**:当计数值达到零时触发中断并重新加载预设值。
- **灵活的时间间隔设置**:支持从几微秒到几百毫秒不等的各种延迟需求。
- **低开销实现精准延时功能**:相比其他硬件定时器更加高效地利用 CPU 资源[^3]。
#### 初始化过程
为了初始化 SysTick 定时器,在程序启动阶段通常会调用 `delay_init()` 函数来计算不同单位时间内所需的滴答次数,并关闭外部时钟源以便于后续调整[^4]:
```c
void delay_init(){
SysTick->CTRL &= ~(1<<2); // 关闭外设时钟
fac_s = SystemCoreClock / 8; // 计算每秒钟对应的 Systick 数量
fac_ms = fac_s / 1000; // 每毫秒对应多少次 Systick 中断
fac_us = fac_ms / 1000; // 每微秒对应多少次 Systick 中断
}
```
上述代码片段展示了如何基于当前系统的主频 (`SystemCoreClock`) 来确定每一秒、每一毫秒以及每一微秒所经历的具体滴答数目。这里假设每次溢出产生的事件频率大约为主频除以八的结果。
#### 延迟函数设计
通过设定合适的重装载值 (RELOAD),可以精确控制等待多久才会发生下一次中断请求 IRQ 或者单纯依靠轮询方式查询是否已经到达目标时刻。下面给出了一种常见的微秒级延迟算法实现方法:
```c
// 微秒级别延时函数定义
void delay_us(u32 nus){
u32 temp;
SysTick->LOAD=nus*fac_us; // 设置比较匹配值
SysTick->VAL=0x00; // 清空当前计数值
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; // 开启计数
do{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); // 判断是否已过期
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;// 关闭计数
SysTick->VAL=0X00; // 清空计数器
}
```
此部分实现了对指定时间段内的阻塞型等待逻辑,其中涉及到几个重要的操作步骤:
- 配置 LOAD 寄存器为期望经过的时间长度;
- 将 VAL 设定成初始状态(通常是全清零);
- 启动控制器开始向下计数直至归零;
- 不断循环检测直到满足条件为止;
- 最终停止计数并将内部变量复原至默认态。
#### 应用场景举例
除了基本的软件延时之外,SysTick 还经常被用来充当 RTOS 的调度依据或是驱动某些周期性的任务执行,如 LED 流水灯效果展示、传感器数据采集等场合均可见其身影。
阅读全文
相关推荐


















