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

相关推荐
爱分享的阿Q17 小时前
STM32现代化AI开发环境搭建:从Keil到VSCode+AI的范式转移
人工智能·vscode·stm32
bubiyoushang88820 小时前
利用STM32实现Modbus通信(RTU从机方案)
stm32·单片机·嵌入式硬件
杰杰桀桀桀20 小时前
4*4无时延矩阵键盘(非阻塞)--附代码链接
stm32·单片机·嵌入式硬件·矩阵·计算机外设·无时延矩阵键盘
cmpxr_21 小时前
【单片机】STM32Fxx启动模式怎么接
stm32·单片机·嵌入式硬件
篮子里的玫瑰21 小时前
STM32 时序计算指南:时钟周期与波特率深入剖析
stm32·单片机·嵌入式硬件
feifeigo12321 小时前
基于STM32F407和WM8978的MP3播放程序设计与实现
stm32·单片机·嵌入式硬件
不做无法实现的梦~1 天前
STM32 上部署 MAVLink 协议教程
stm32·单片机·嵌入式硬件
HIZYUAN1 天前
AG32 MCU可以替代STM32+CPLD吗 (二)
stm32·单片机·嵌入式硬件·fpga开发·agm ag32·国产mcu+fpga·低成本soc
LCG元2 天前
STM32实战:基于STM32F103的LCD1602液晶屏(并口/模拟时序)驱动
stm32·单片机·嵌入式硬件
匿名了匿名了2 天前
直流无刷与直流有刷电机
stm32·嵌入式硬件·mcu