目录
一、基础知识
1、Systick定时器是什么
Systick定时器,是一个简单的定时器,对于ST的CM3、CM4、CM7内核芯片,都有Systick定时器
2、Systick定时器用处
常用于做延时或者实时系统的心跳时钟。比如UCOS中时分复用,需要一个最小的时间戳,一般在STM32和UCOS系统中,都采用Systick做UCOS心跳时钟。可以节省MCU资源,不用浪费一个定时器。
3、Systic定时器就是系统滴答定时器,为一个24位的倒计数定时器,从初始值一直减到0,计到0以后,将从RELOAD寄存器中自动重装载定时器初值。只要不把它在Systick控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
4、Systick定时器被捆绑在NVIC中,用于产生SYSTICK异常【可编写中断服务函数】,其中断的优先级也可以设置
二、Systick寄存器
CTRL 控制和状态寄存器
注:1、对于STM32,外部时钟源是HCLK(AHB总线时钟)的1/8,内核时钟是HCLK时钟
2、配置函数:HAL_SYSTICK_CLKSourceConfig();
LOAD 自动重装载除值寄存器
VAL 当前值寄存器
CALIB 校准值寄存器
三、相关函数
四、相关代码
void delay_init(u8 SYSCLK)
{
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
fac_us=SYSCLK; //不论是否使用OS,fac_us都需要使用
}
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值
ticks=nus*fac_us; //需要的节拍数
told=SysTick->VAL; //刚进入时的计数器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
}
};
}
注:代码思路:先知晓系统频率,用于周期为其的倒数,所以频率也就是1秒执行的减的次数,为fac_us,若延时Nus,就是共减N*fac_us次,再根据当前的值开始计数,将溢出考虑进去,计算次数达到预设值则退出程序。