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