先看下流程框图:我们可以注意到SysTick是在Nvic中的一个外设定时器(内核外设)
为什么要用SysTick来设置延时函数?
那么SysTick包括什么,怎么配置寄存器
什么是SysTick定时器
SysTick:系统定时器,和普通定时器类似,它也可以定时,但是却是有特殊用途。它有24bits,定时器最大数值是2^24,并且计数时是向下递减计数,每次递减1,递减一次的时间是1/SYSCLK,一般来说SYSCLK为72MHz。当寄存器中的值减少到0时,会产生一个中断信号,进而执行相应的中断服务函数
SysTick寄存器
与SysTick相关的寄存器有4个:
- CTRL控制及状态寄存器
- LOAD重装载数值寄存器
- VALUE当前数值寄存器
- CALIB校准数值寄存器
但是一般使用情况下,只使用到前三个寄存器。最后一个校准数值寄存器不经常使用
SysTick实战
给load寄存器设置最大倒计数值,然后通过给val寄存器重启,这样load的最大计数值会赋给val,如果没有给val清零,那么计数值会是val寄存器里面的残值。
这张图展示了 SysTick 定时器的内部结构逻辑:LOAD
寄存器并不会直接赋值给 VAL
,而是在执行 VAL = 0
时,控制逻辑触发“重装”(RESET),将 LOAD
的值加载进 VAL
并开始递减。COUNTFLAG
则在 VAL
从 1 递减到 0 时被置位,表示一次倒计时完成
代码
我们可以看到给CRTL寄存器,配置时钟源,CLKSOURCE为0使用外部时钟 = HCLK / 8,为1使用内部时钟 = HCLK(系统时钟),然后配合开启时钟enable。
最后当时倒计时解释,SysTick_CTRL_COUNTFLAG_Msk会置为1,跳出循环。