SysTIck(系统定时器)时Cortex-M4内核中的一个外设,内嵌在NVIC(nested vectored interrupt controlleder)中,SysTIck是一个24位向下递减的计数器,计数器每计数一次的时间为1/SYSCLK(一般情况下SYSCLK = 180MHz)。当重装载数值寄存器的值递减到0的时候,系统定时器就会产生一次中断。
SysTick寄存器介绍
CTRL | SysTick control and status register |
LOAD | SysTick reload value register |
VAL | SysTick curent value register |
CALIB | SysTick calibration value register |
SysTick control and status register
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
16 | COUNTFLAG | R/W | 0 | 如果在上次读取本位寄存器后,SysTick已经计数到0,则该位为1 |
2 | CLKSOURCE | R/W | 0 | 时钟源选择位,0 = AHB(Advanced High-performance Bus)/8, 1=处理器时钟AHB |
1 | TICKINT | R/w | 0 | 1:SysTick倒数计数到0的时产生SYSTick异常请求。 0:计数到0时无动作,也可以读取COUNTFLAG标志位来确定计数器是否递减到0 |
0 | ENABLE | R/W | 0 | SysTick使能位 |
SysTick reload value register
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
23:0 | RELOAD | R/W | 0 | 当倒数计数到0的时候,将被重装载的值 |
SysTick curent value register
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
23:0 | CURRENT | R/W | 0 | 读取时返回当前倒计数的值,写它则使之清零,同时还会清除CTRL寄存器中的COUNTFLAG标志 |
SysTick calibration value register
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
31 | NOREF | R | 0 | 1=没有外部参考时钟 ; 0=外部参考时钟可用 |
30 | SKEW | R | 1 | 1=校准值不是准确的10ms; 0=校准值是准确的10ms |
23:0 | TENMS | R | 0 | 10ms的时间内倒计数的格数,芯片设计者应该通过CM4的输入信号提供该数值。若该数值读回0,则表示无法使用校准功能 |
编程要点
1)设置重装载寄存器的值。
2)清除当前数值寄存器的值。
3)配置控制与状态寄存器。
(注:Systick属于内核的外设,寄存器和库函数的定义都在内核相关的库文件中core_cm4中)
代码分析:(SysTick配置库函数)
__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 */
}