024.STM32标准库学习之SysTick(06)SysTick的工作原理与固件库接口

引言

在上一篇中,我们揭示了软件延时的致命缺陷(阻塞、不可靠),并决定使用硬件定时器来替代。本篇将聚焦于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.hmi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值