STM32F4学习笔记5——SysTick定时器
扫描二维码
随时随地手机看文章
SysTick 定时器被捆绑在 NVIC 中,用于产生 SYSTICK 异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
Cortex—M4处理器内部包含了一个简单的定时器,该定时器时钟源可以是内部时钟,或者外部时钟的,不过STCLK的具体来源由芯片设计者决定。SysTick定时器能产生中断,CM为他专门开出一个异常类型,并且在向量表中有他的一席之地,共有4个寄存器控制SysTick定时器:
·SysTick控制及状态寄存器 0xE000_E010
第0位RW定时器使能位 第1位RW异常请求位 第2位RW外部内部时钟选择位 第16位计数标志位
·SysTick重装载数值寄存器 0xE000_E014
第0-23RW位当计数到0时将被重装载的值
·SysTick当前数值寄存器 0xE000_E018
第0-23RWc位读取时返回当前倒数计时的值,写它则使寄存器清零同时清除状态标志位
·SysTick校准数值寄存器 0xE000_E01C
第0-23RW位在10ms间隔中倒计数的格数,芯片设计者应该通过输入信号提供该数值,若读回为0则表示无法使用校准功能 第30R位1表示校准值不是准确的10ms,0表示准确的10ms 第31R位1表示没有外部参考时钟,0表示外部参考时钟可用
注:其他保留位置必须保持清零
嘀嗒定时器的运行是基于处理器时钟的,如果因为低功耗模式,时钟信号停止了,那么嘀嗒定时器也会停止的,确保软件使用字对齐访问来访问SysTick 寄存器。系统复位以后重载寄存器和当前值是没有定义的,正确的初始化顺序如下:
·Program reload value.
·Clear current value.
·Program Control and Status register.
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)实现时钟源的选择
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
/* Reload value impossible */
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1);
SysTick->LOAD = ticks - 1; /* set reload register */
/* set Priority for Systick Interrupt */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
/* Load the SysTick Counter Value */
SysTick->VAL = 0;
/* Enable SysTick IRQ and SysTick Timer */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
/* Function successful */
return (0);
}
这个函数配置的滴答定时器,其中重要的是将滴答定时器优先级默认设置为15,STM32F4xx支持16级的中断嵌套,这里15表示滴答定时器中断无论中断如何设置分组其中断已经是最低等级