SysTick定时器可以用来做延时或者实时系统的心跳时钟,他是一个24位的递减定时器,当计时到0时,将从RELOAD寄存器中自动重装载定时初值,只要不把他在Systick控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
SysTick定时器有4个寄存器,即:控制及状态寄存器、重装载数值寄存器、当前数值寄存器、校准数值寄存器。
Reload寄存器放重装载值,初值寄存器就是Val,这个Val每个Systick时钟周期会减一,当减到0之后,接着又从这个Reload重装载寄存器加载到当前值寄存器,循环往复。
外部时钟源就是HCLK(AHB总线时钟的1/8),内核时钟是HCLK时钟,通过systick_clksourceconfig()函数来配置时钟源。
重装载数值寄存器是一个24位的寄存器
systick_clksourceconfig()函数,在misc.c文件中,可以选择systick的时钟源。
Systick_Config(uint32_t ticks)//初始化systick时钟为HCLK,并开启中断,在core_cm3.h/core_cm4.h文件中.
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;
}
}
对于M3使用库函数来初始化时钟,如果系统时钟为72M的话,选择8分频就是9M,那么systick时钟就是9M,如果选择HCLK作为systick时钟的话,就是72M。
//开启systick中断、使能systick以及配置好systick中断的时间间隔
//ticks是两个中断的时间间隔,就是说两个中断之间有多少个systick时钟周期
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}