SysTick 是一个 24bit 的系统计时器,计数器从 LOAD寄存器 中读取数值(该数值最大为24bit),不断递减,递减为 0 时相应标志位置 1,产生一个中断请求;
该寄存器通常用来产生精确的 延时(Delay)函数;
SysTick寄存器
-
端口配置低寄存器 --- CTRL(Control and status register):使能SysTick和相应中断请求,并配置时钟来源;
作用---使能计数器(counter):位0 置 1 时计数器使能,置 0 时计数器关闭;
-
作用---使能中断请求:位1 置 1 时中断请求使能,置 0 时中断请求关闭(SysTick中断为中断向量表 系统中断第16项);
SysTick中断 作用---选择时钟源:位2 置 1 时选择 AHB 时钟作为源,置 0 时选择 AHB / 8 作为时钟源;(默认情况下AHBCLK = 72M)
位16 为标志位 COUNTFLAG,为 1 时表明计数器的值为 0;
复位值:0x0000 0000
-
读取值寄存器 --- LOAD(reload value register):位23:0 储存计数器要读取的值;
- 复位值:0x0000 0000
-
当前值寄存器 --- VAL(current value register):位23:0 储存计数器当前的值;
- 复位值:0x0000 0000
-
校准值寄存器 --- CALIB(calibration value register):位23:0 储存计数器校准值和相应标志位的寄存器;
- 复位值:0x0002328
常用SysTick固件库函数 (core_cm3.h)
SysTick配置函数 --- SysTick_Config
static __INLINE uint32_t SysTick_Config(uint32_t ticks);
- 作用:使能 SysTick,使能中断请求并把该中断优先级设置为最低(0x1111),把时钟源设置为 AHBCLK,同时设置 reload = ticks;
- 注意:SysTick中断优先级寄存器与外设中断优先级寄存器不同,但仍可按优先级规则判断优先级;
- ticks:LOAD寄存器中的值,为reload值,必须是24位以内的树;
- 返回值:0则表示配置成功,1则表示配置失败;
- 示例:
SysTick_Config(72000); //默认系统为72M
//一般可不需读取返回值,只要ticks值在24位以内即可配置成功
编写Delay函数
编写一个 毫秒(ms) 级Delay函数
计算
设 SysTick 时钟源的频率为 CLK (MHz),LOAD寄存器中存储的值为 reload;
可得计数器在 1毫秒(ms) 内震荡 CLK×1000 次(即递减 CLK×1000 次),我们要让计数器中的值在 1毫秒(ms) 从 reload 递减至 0,将 reload 的值设置为 CLK×1000 即可;
若采用默认情况下 选取 AHBCLK = 72MHz,则将 LOAD 寄存器设置为 72000 即可。
程序思路
- SysTick_Config函数 使能SysTick并配置 reload值;
- 不断读取 COUNTFLAG 位直至其值为 1,确认计数器已经递减至 0;
- 产生相应中断;
实现代码
void SysTick_Delay_ms(uint32_t tms)
{
uint32_t i;
SysTick_Config(72000); //默认系统为72M
for(i=0; i<tms; i++)
{
//等待标志位 COUNTFLAG 为 1
while(!((SysTick->CTRL) & (1<<16)));
}
//使能中断请求
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}