系统定时器SysTick简介
今天我们来讲讲ARM cortex M4核系统定时器system Timer,处理器核有一个24位的系统定时器SysTick,可以用来作为系统工作的滴答时钟,从装载值向下计数到零。需要注意的一点是为了调试,当处理器停止时,系统定时器计数器不会递减。
相关寄存器
与系统定时器相关的寄存器主要有SysTick控制和状态寄存器,重装在寄存器,当前值寄存器,校准寄存器。
控制和状态寄存器主要是使能和配置SysTick功能,以及定时器计数到0状态指示位。
重装载寄存器主要用来设置定时器定时的计数装载值。取值范围为0x00000001~0x00FFFFFF.
当前值寄存器存有系统定时器的当前计数值。写操作将清除该寄存器的值为0,同时清除控制和状态期存器的计数标志位。
校准寄存器是与系统定时器的校准属性相关的。关于这些寄存器的具体位定义可以参考ARM官方文档,这里不在赘述,在编程使用操作系统定时器Systick时候,需要仔细阅读这些寄存器的含义。
Systick的异常中断号是15.
需要特别注意的是:
在深度睡眠模式下,一些操作将会停止处理器时钟信号,这时候,系统定时器计数也会停止。
系统定时器计数重装载和当前值寄存器不是被硬件初始化的,所以在软件中正确的初始化顺序是:
1 编程设置重装载寄存器值
2 清当前值寄存器的值
3 编程控制和状态寄存器
系统定时器中中断向量表中的位置
另外系统定时器与系统控制和状态寄存器等相关的内容,我们会在相关的内容里讲解。
软件方案
在core_cm4.h文件中,ARM已经提供了对系统定时器的操作函数
/** \brief System Tick Configuration
The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
Counter is in free running mode to generate periodic interrupts.
\param [in] ticks Number of ticks between two interrupts.
\return 0 Function succeeded.
\return 1 Function failed.
\note When the variable __Vendor_SysTickConfig is set to 1, then the
function SysTick_Config is not included. In this case, the file device.h
must contain a vendor-specific implementation of this function.
*/
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
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 */
}
如果你是使用飞思卡尔的芯片,那么飞思卡尔的SDK中也提供了相应的函数和文件
在fsl_hwtimer_systick.c和fsl_hwtimer_systick.h中有具体的函数定义和注释。
如果是自己编码实现,建议按照ARM官方文档的说明进行操作,其实小猿建议大家使用ARM或者芯片厂商提供的已有函数。
嵌入式
程序猿
嵌入式程序猿致力于打造程序猿工程师交流分享的精品移动平台,欢迎各位猿友加入和分享。微信搜索嵌入式程序猿添加关注,或者长按下方二维码,选择识别图中二维码添加关注。