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

相关推荐
无敌贵点大王6 小时前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表
恶魔泡泡糖9 小时前
stm32F103C8T6标准库串口接收之中断方式2
stm32·单片机·嵌入式硬件
充哥单片机设计9 小时前
【STM32开源项目】智能小区充电桩
stm32·单片机·嵌入式硬件·毕业设计·小区充电桩·智能小区充电桩
充哥单片机设计11 小时前
【STM32开源项目】智能语音台灯
stm32·单片机·嵌入式硬件·毕业设计·单片机设计·智能语音台灯
Brilliantwxx13 小时前
【STM32】 SPI阻塞式通信与HAL源码 (源码分析)
stm32·单片机·嵌入式硬件
WWJA王文举14 小时前
Bootloader、App 和升级分区之间是什么关系?
stm32·freertos·嵌入式开发·在线升级
LCG元15 小时前
STM32F103 NTC 热敏电阻测温实战:分压网络设计、Steinhart-Hart 标定与 ADC 采样优化实测
stm32·单片机·嵌入式硬件
捷瑞电子工坊16 小时前
蓝桥杯嵌入式STM32G431定时器入门:从原理到CubeMX配置(LL库)
cubemx·定时器·定时中断·led闪烁·蓝桥杯嵌入式·stm32g431·ll库
怀民民民16 小时前
嵌入式软件学习路线与项目实践记录:STM32、FreeRTOS、Linux 与 OpenMV
stm32·freertos·嵌入式软件·嵌入式linux·openmv
辰域电子17 小时前
STM32项目开源:实验室消防预警控制系统(代码 + 原理图 + 仿真)
stm32·单片机·嵌入式硬件·开源·proteus