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

相关推荐
xuxg20051 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT3 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen3 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠6 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
辰哥单片机设计8 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦9 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报10 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
czwxkn10 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响10 小时前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
BackCatK Chen21 小时前
第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)
stm32·单片机·嵌入式硬件·保姆级教程·电机正反转·tmc2240·dir引脚控制