Cortex M4 提供了 SysTick 功能,SysTick 是一个 24bits 定时器,可以通过简单的编程提供一个周期中断,常用于作为操作系统的”心跳“。
一、寄存器
1、STK_CTRL
2、STK_LOAD
3、STK_VAL
?二、时钟源
SysTick 可选择两种时钟源,通过寄存器 STK_CTRL 的 CLKSOURCE 位来选择,‘0’ 表示时钟源为 AHB(HCLK)的 1/8,'1' 表示时钟源为 AHB(HCLK)。
三、重装载与中断
通过寄存器 STK_CTRL 的 ENABLE 置 ‘1' 可以启动 SysTick。启动后 SysTick 值在每个时钟周期减一,当值为 ‘0’ 时会将寄存器 STK_CTRL 的 COUNTFLAG 置位。若此时使能了 SysTick 中断则会触发中断。可以通过将寄存器 STK_CTRL 的 TICKINT 位置 ‘1’ 使能 SysTick 中断。SysTick 在计数到 0 的下一个时钟周期会从 STK_LOAD 寄存器中加载值。
四、周期中断
使能 SysTick 并打开中断后会产生周期中断,周期频率与时钟源与 STK_LOAD 的值有关,公式如下:
F = FSRC / (STK_LOAD + 1)
代码如下:
uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
{
return (1UL); /* 重装在值是否有效(24位)*/
}
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* 设置重装载值 */
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* 设置 SysTick 中断优先级 */
SysTick->VAL = 0UL; /* 清空计数器 */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | /* 设置 SysTick 源为 AHB(HCLK) */
SysTick_CTRL_TICKINT_Msk | /* 使能 SysTick 中断 */
SysTick_CTRL_ENABLE_Msk; /* 启动 SysTick */
return (0UL);
}
|