引言
在上一篇中,我们揭示了软件延时的致命缺陷(阻塞、不可靠),并决定使用硬件定时器来替代。本篇将聚焦于Cortex-M3内核内置的SysTick定时器:它是实现精确延时的理想工具。核心任务是:掌握SysTick的寄存器结构与固件库配置函数,编写μs和ms级延时函数。
逻辑链条:
1. 认识SysTick定时器硬件结构:SysTick的三个核心寄存器是什么?每个位段控制什么?
2. 掌握配置逻辑:固件库函数SysTick_Config()如何封装底层操作?参数和返回值含义?
3. 明确时钟源:为什么要把时钟源设为处理器时钟(72MHz)?如何配置?
4. 编写延时函数的核心逻辑:利用SysTick递减计数,通过查询COUNTFLAG位判断单次定时是否完成,利用自动重装载机制重复定时,并用位运算控制定时器的启停。
5. 关于调试与编译错误解决方法:头文件未包含、预处理指令错误、变量未声明、位运算语法错误等。
6. 实验验证对比:通过LED闪烁的主观判断验证延时精度。
1. SysTick寄存器结构:LOAD、VAL、CTRL各字段含义
SysTick是一个24位递减计数器,需要用户通过三个寄存器与它交互,所以理解寄存器字段的含义是配置的基础。
CTRL 控制与状态寄存器
- 位[16] COUNTFLAG:计数器从1减到0时置1,读取CTRL后自动清零。
- 位[2] CLKSOURCE:0 = 外部参考时钟(HCLK/8),1 = 处理器时钟(AHB,72MHz)。
- 位[1] TICKINT:1 = 计数到0触发SysTick异常,0 = 不触发。
- 位[0] ENABLE:1 = 开始递减计数,0 = 停止。
LOAD 重装载值寄存器
- 24位有效(位[23:0]),存放计数器从零重新开始计数时的初始值。
- 例如LOAD=71999,则每个时钟周期减1,从71999减到0时,总共经过72000个时钟周期。
VAL 当前值寄存器
- 24位有效(位[23:0]),存放当前递减计数值。
- 写入任意值会清零并迫使LOAD重装载;读取时返回当前值。
- 初始化时通常写0以同步计数起点。
注意1:LOAD和VAL是自动重装载关系:LOAD是目标值,VAL是当前值。当VAL减到0后,下一周期硬件自动把LOAD的值复制到VAL。不要手动向VAL写入LOAD值(除了初始化清零)。
注意2:COUNTFLAG只读且一次性:读取CTRL后COUNTFLAG自动清零,因此查询循环中每次读取CTRL都会获得新状态。
可以将SysTick想象成一个自动倒计时的家用厨房定时器,每次设定好时间(LOAD值),按下开始(ENABLE=1),它就会精确递减。当倒计时结束(VAL=0),它会发出“叮”的一声(COUNTFLAG置位),并自动重新开始倒计时(LOAD重装载)。
设定时间 -> LOAD值
倒计时结束 -> COUNTFLAG=1
2. SysTick_Config()函数:参数为重装载值,返回0表示成功
固件库(STM32标准外设库)提供了一个便捷函数来一次性配置SysTick,其原型通常如下(见于core_cm3.h或mi


294

被折叠的 条评论
为什么被折叠?



