- Systick定时器基础知识讲解
- Systick相关寄存器库函数讲解
- delay延时函数讲解(Systick应用)
频率定义:单位时间内完成周期性变化次数。
(借鉴正点原子网课)
(一)Systick定时器,是一个简单的定时器(最主要的),对于CM3,CM4内核芯片,都有Systick定时器。
Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。
(二)
Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作(这也是为什么要特意开发出Systick定时器的缘由,如果此时用普通定时器在睡眠模式下会大大增加功耗 )。
SysTick定时器被捆绑在NVIC(中断优先级管理)中,用于产生SYSTICK异常。
Systick中断的优先级也可以设置。
(三)4个Systick寄存器
①CTRL SysTick 控制和状态寄存器 LOAD
备注: TICKINT 中断位(1),M3外部时钟源72/8=9MHZ,M4外部时钟源是168/21=21MHZ
②SysTick 自动重装载除值寄存器
③SysTick 当前值寄存器 CALIB
(四)Systick库函数
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
//!!该段代码的作用是选择以下某段时钟源
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//两个中断中间有多少个ticks周期。
if (ticks-1 > SysTick_LOAD_RELOAD_Msk) return (1);
//对tick值进行有效性分析,最后要写到24位的LOAD寄存器,不能大于24位寄存器2的24次方
/* Reload value impossible */
/* set reload register */
SysTick->LOAD = ticks - 1; //设置重装载寄存器值
/* set Priority for Cortex-M0 System Interrupts */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS