SysTick滴答定时器基本介绍
SysTick定时器是一个24位的倒计数定时器,默认时钟源是内核时钟 (HCLK),也可以选择HCLK的八分之一。SysTick的主要用途是提供一个简单的计时机制,以便在操作系统中实现时间片轮转和其他定时任务。 SysTick 是 Cortex-M 核心的一部分,它的配置可以在 Cortex-M 参考手册和 STM32 微控制器的参考手册中找到。
滴答定时器的寄存器
SysTick涉及到4个寄存器
- 计数寄存器 (VAL):存储当前的倒计时值。
- 重装载寄存器 (LOAD):设置定时器每次倒计时的初始值。
- 控制寄存器 (CTRL):控制定时器的启停、时钟源选择、中断使能等。
- 校准寄存器 (CALIB):提供参考时钟的校准值(通常由芯片制造商预设)
各个寄存器的功能
1,控制寄存器 (CTRL):
这个寄存器控制SysTick定时器的启停、时钟源选择和中断功能。其各个位的定义如下:
寄存器控制SysTick时钟源选择我们可以选为1分频和8分频,在这里我用的是8分频。
2.重装载寄存器 (LOAD):
这个寄存器存储定时器的重装载值。当计数器达到0时,会自动重装载这个值并继续计数。其范围是0到0xFFFFFF。
3.计数寄存器 (VAL):
这个寄存器存储当前计数值。当计数器递减到0时会重新加载STK_LOAD寄存器的值。
4.校准寄存器 (CALIB):
这个寄存器提供参考时钟的校准值。
当我们了解了各个寄存器的功能之后又就可以理解SysTick的定时原理了
滴答定时器延时的原理
微秒延时的计时原理介绍:
首选要先选择滴答定时器的时钟源(8分频还是1分频)在这里我选择的是8分频。当我们选择8分频的时候,滴答定时器的计数频率就是9MHZ,(也就是计数寄存器 (VAL)1秒计数9 000 000次),计数寄存器一次的时间就是 1/9000000 秒,当计数9次时就是1us,计数器每计数一次就会减一,当减为0 时,重装载寄存器 (LOAD)的值就会给计数寄存器 (VAL),同时控制寄存器 (CTRL)的COUNTFLAG位会置一个标志位。根据这个标志位来判断是否计数1us。
微妙延时的计时代码:
该代码就是按照上面微秒延时的计时原理来写的。在了解该代码之前,要理解上面的微秒延时的计时原理.
void Delay_Init(void)
先将控制寄存器 (CTRL)全部置零,这样是为了避免在HAL库的其他文件里面对控制寄存器 (CTRL)进行了配置。然后在对时钟进行8分频(HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);)。 systick是系统频率 72MHZ, G_clk 是每计时1us的次数。
void Delay_us(uint6_t us)
重装载寄存器 (LOAD)里面放着我们要计时的时间(us * G_clk [G_clk ]是每计时1us的次数),预先将计数寄存器 (VAL)清零,这样在控制寄存器 (CTRL)启动计数时就直接将重装载寄存器 (LOAD)的值给计数寄存器 (VAL),然后一直等到计数寄存器 (VAL)减到0时控制寄存器 (CTRL)的COUNTFLAG位(第16位)会置一个标志位,在whil里面判断该标志位是否置1。当标志位置1时控制寄存器 (CTRL)停止计数。并清空计数寄存器 (VAL)。
void Delay_ms (uint16_t ms)
毫秒延时就是在微秒延时的基础上实现的。1毫秒 == 1000 微秒。
完整代码
最后:希望这篇文章可以帮到你