百家汽车网
您的当前位置:首页【stm32f103c8t6】SysTick滴答定时器延时函数详解

【stm32f103c8t6】SysTick滴答定时器延时函数详解

来源:百家汽车网

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 微秒。

完整代码

最后:希望这篇文章可以帮到你

因篇幅问题不能全部显示,请点此查看更多更全内容