SysTick系统滴答定时器
1.SysTick 定时器介绍
Systick定时器就是系统滴答定时器,一个24位的“倒计数” 定时器,计到0时(溢出),触发中断或者设置【溢出】标志位,并将从RELOAD寄存器中自动重装载定时初值。只要SysTick控制及状态寄存器中的使能位未清除,就永不停息,即使在睡眠模式下也能工作。
Systick相关寄存器:
CTRL :SysTick 控制和状态寄存器
LOAD :SysTick 自动重装载初值寄存器 ---(设置后自动重载值固定不变,最大2^24)
VAL :SysTick 当前值寄存器 ---(每个时钟周期减1,减到0重新装载LOAD的值)
下载excel文件
2.定时器/计数器 计时原理
定时器从本质上来讲其实就是一个计数器,先给它设置一个初始计数值,它每收到一个脉冲,计数器就会减1,当减到0时,产生一个“叮”的信号,告知我们定时时间到。
定时时间 = 接收到的脉冲个数 * 单个脉冲的周期
STM32F103的工作时钟为72MHz,经过8分频后给SysTick 计数器用。此时计数器接收到的脉冲信号的频率为72/8=9Mhz, 单个脉冲的周期= 1 / (9MHz)= 1/9 us
如果给SysTick 计数器设置初始计数值RELOAD为9,则计数器每接收9个计数脉冲所需要的时间为9 ×(1/9 us)= 1 us.
如果给SysTick 计数器设置初始计数值RELOAD为9 × 1000,则计数器每接收9 × 1000个计数脉冲所需要的时间为9 × 1000 × (1/9 us)= 1000 us = 1 ms.
Systick定时器是24 位的倒计数定时器,RELOAD最大为2^24 = 16777216
16777216 ×(1/9 us)=1864135 us = 1.86 秒
滴答定时器通过查询“计数标志位COUNTFLAG”实现延时:
/**
- 文件:Delay.c
*/
#include "DELAY/Delay.h"
/**
- 功能:初始化Systick定时器
- 参数:None
- 返回值:None
*/
void Delay_init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //设置时钟源8分频
}
/**
- 功能:us级别延时
- 参数:xus:要延时的时间
- 返回值:None
*/
void Delay_us(u32 xus)
{
SysTick->LOAD = 9 * xus; //计9次为1us,xus则重装载值要*9
SysTick->VAL = 0; //计数器归零
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开定时器
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待计数完成
}
/**
- 功能:ms级别延时
- 参数:xms:要延时的时间
- 返回值:None
*/
void Delay_ms(u32 xms)
{
SysTick->LOAD = 9000; //计9次为1us,1000次为1ms
SysTick->VAL = 0; //计数器归零
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开定时器
while (xms--)
{
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待单次计数完成
}
}
评论已关闭