STM32 Systick定时器介绍

Systick(滴答定时器),是内核中的一个特殊定时器,用于提供系统级的定时服务。该定时器是一个24位的递减计数器。

Systick的作用

①具有自动重装载值寄存器的功能。
(当计数器到达自动重载值时,它会自动重新加载并开始新的计数周期。)
②简单的延时功能。

SysTick控制及状态寄存器(CTRL)

SysTick重装载数值寄存器(LOAD)

SysTick当前数值寄存器(VAL)

手撕延时函数

示例:

void delay_us (uint32_t nus)

n表示 "数量",us表示微秒,即传入需要延时的微秒数

uint32_t temp = 0;

定义一个 32 位无符号变量temp,用来临时存储 SysTick 控制寄存器的值

SysTick->LOAD = 72 * nus;

  • SysTick->LOAD:SysTick 的重装载寄存器,定时器从这个值开始向下计数到 0;
  • 72 * nus:核心逻辑 ------ 假设 STM32 的系统时钟(HCLK)是 72MHz(72,000,000 Hz),即 1 秒计数 72000000 次,那么 1 微秒(1/1000000 秒)需要计数 72 次;

SysTick->VAL = 0x00;

  • SysTick->VAL:SysTick 的当前值寄存器,存储定时器当前的计数值;
  • 赋值 0x00 是为了清空之前的计数,避免残留值影响本次延时的准确性。

SysTick->CTRL = 1 << 2;

SysTick->CTRL:SysTick 的控制状态寄存器,关键位定义:

  • Bit2(CLKSOURCE):时钟源选择位 ------1 = 使用 HCLK(系统时钟),0 = 使用 HCLK/8;
  • 这里1 << 2表示将 Bit2 置 1,选择 72MHz 的系统时钟作为计数时钟(和前面的 72 倍计算对应)。

SysTick->CTRL |= 1 << 0;

  • Bit0(ENABLE):SysTick 使能位 ------1 = 开启定时器,0 = 关闭;
  • |= 1 << 0:在不改变其他位的前提下,将 Bit0 置 1,启动定时器开始计数。

do-while循环

  • do-while:先执行一次读取寄存器,再判断条件;
  • temp & 0x01:判断 Bit0 是否为 1 → 检查定时器是否还在运行;
  • !(temp & (1 << 16)):判断 Bit16(COUNTFLAG)是否为 0 → COUNTFLAG 是 "计数到 0 标志位",定时器从 LOAD 值减到 0 时,该位会自动置 1;
    • 循环条件:"定时器还在运行(Bit0=1)" 且 "还没计数到 0(Bit16=0)" → 只要满足这两个条件,就一直循环等待;
    • 当计数到 0 时,Bit16 置 1,循环条件不满足,退出循环,延时完成。

SysTick->CTRL &= ~(1 << 0);

&= ~(1 << 0):将 Bit0(ENABLE 位)置 0,关闭定时器,避免定时器继续运行影响后续代码,同时复位计数状态。

总结

  • 该函数利用 STM32 的 SysTick 系统定时器实现精准微秒级延时,核心前提是系统时钟为 72MHz;
  • 核心逻辑:根据 "72MHz 时钟 = 1 微秒计数 72 次",计算出对应延时微秒数需要的计数值,写入重装载寄存器,启动定时器后等待计数到 0;
  • 关键寄存器操作:LOAD(重装载值)、VAL(清空计数)、CTRL(时钟源 + 使能 + 计数完成标志)是实现延时的核心。

带操作系统延时函数

SysTick模拟多线程

在SysTick中断处理函数中更新任务计数器并执行就绪任务。此处只是最简单的,还有更复杂的需要在操作系统中实现。

相关推荐
十月的皮皮17 小时前
stm20260720-从新手 C 到量产 STM32 工程:程序设计推导指南
c语言·开发语言·stm32·stm32cubemx·hal库
开发笔记-阿牛18 小时前
解析一款有意思的产品||CK6159A语音芯片设计的儿童专注力训练机-舒尔特玩具
stm32·单片机·嵌入式硬件·音频
搞全栈小苏20 小时前
SIMetrix_simplis8.4安装教程——附安装包
stm32·单片机·嵌入式硬件·电力电子
qq_5739678221 小时前
STM32控制器
stm32·单片机·嵌入式硬件
某林2121 天前
履带小车底盘stm32F103RCT6开发
人工智能·stm32·单片机·嵌入式硬件·架构·人机交互·ros2
做萤石二次开发的哈哈1 天前
萤石 ERTC Windows SDK 包含哪些类型定义?
stm32·单片机·嵌入式硬件
亿道电子Emdoor1 天前
【Aitium】PCB导出DXF文件出现eDuplicateRecordName报错
stm32·单片机·嵌入式硬件·altium
名字还没想好☜2 天前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
巴巴媛6662 天前
STM32学习笔记【38.DHT11实验】
笔记·stm32·学习
深圳市泰凌微电子2 天前
HK航顺 HK32F407RGT7替STM32F405RGT6 微控制器32位MCU
stm32·单片机·嵌入式硬件