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

相关推荐
d111111111d2 小时前
了解Modbus
网络·笔记·stm32·单片机·嵌入式硬件·学习
gihigo19984 小时前
MAX30102 + STM32 人体血氧饱和度(SpO₂)测量方案
stm32·单片机·嵌入式硬件
LCG元5 小时前
STM32实战:基于uC/OS-III的STM32移植与多任务应用
stm32·单片机·嵌入式硬件
今日待办5 小时前
【CEM5881-M11雷达模块】使用开发指南
stm32·雷达模块·cem5881-m11
Deitymoon6 小时前
STM32——433M无线遥控灯
stm32·单片机·嵌入式硬件
Wallace Zhang7 小时前
SimpleFOC源码学习09(v2.3.2) - 磁编码器MagneticSensorSPI.cpp与MagneticSensorSPI.h
驱动开发·stm32·simplefoc·foc电机控制
12.=0.7 小时前
【stm32_7】定时器的原理与应用、基本定时器、通用定时器、PWM、模拟脉冲信号的宽度、利用PWM控制外设、逻辑分析仪的使用
c语言·stm32·单片机·嵌入式硬件
Deitymoon7 小时前
STM32——振动传感器控制继电器
stm32·单片机·嵌入式硬件
国产芯片设计8 小时前
DIY实战|0.8寸WiFi自动授时电子钟,国产数码管驱动芯片方案分享
stm32·单片机·mcu·51单片机·硬件工程
LCMICRO-133108477468 小时前
长芯微LD73360完全P2P替代AD73360,是一款工业电能计量6通道模拟输入前端(AFE) 处理器
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模拟前端afe