目录
SysTick 定时器
简介
SysTick 定时器在 Cortex-M 内核中集成,属于 NVIC 的一部分,能够产生 SysTick 异常(#15)。SysTick 是一个向下计数的 24 位计数器,时钟来源为处理器时钟或外部时钟。
在现代操作系统中,需要一个周期性的中断来触发 OS 内核,用于任务的管理和上下文的切换,处理器也可以在不同的时间片内处理不同的任务。处理器设计还需要确保运行在非特权等级的任务无法禁止该定时器,不然会因禁止 SysTick 导致整个系统被锁定。在内核集成 SysTick 定时器提高了软件的可移植性,所以的Cortex-M内核都集成了 SysTick ,内核为Cortex-M3/M4的微控制器都可以使用该为内核实现的OS 。
Unprivileged:非特权级,起到保护用户任务的作用,防止用户可以在任意任务中访问和修改系统寄存器,操作不当会造成系统崩溃。
Privileged:特权级,这种模式下用户可以在任意任务中对系统控制寄存器的访问和修改。
特权级这些详细可以查看该文章https://blog.csdn.net/weixin_33775582/article/details/85927787
在不使用OS的情况下,SysTick 定时器还一颗用作定时器外设,产生周期性中断,精准延时或时间测量。
SysTick 的寄存器
SysTick 计数器有四个相关的寄存器,分别是
SysTick 控制和状态寄存器 CTRL
SysTick 重装载值寄存器LOAD
SysTick 当前值寄存器VAL
SysTick 校准值寄存器CALIB
SysTick 控制和状态寄存器 CTRL
SysTick 重装载值寄存器LOAD
SysTick 当前值寄存器VAL
SysTick 校准值寄存器CALIB
SysTick 定时器框图
SysTick 运行原理简述
通过配置控制和状态寄存器(CTRL)Bit[0]使能计数器、Bit[1]配置异常中断、Bit[2]时钟选择、Bit[16]计数器计数到0的标志位
重装载值寄存器LOAD,当计数器减计数到零是,重装载值寄存器LOAD将值从新加载到计数器中继续计数
当前值寄存器VAL,该寄存器就是计数器当前的计数值(减去若干个数后的计数器)
校准值寄存器CALIB,查看寄存器简介就可以理解,此处不做解释
STM32 SysTick 的使用
工具
IDE:Keil_MDK 5.29
配置工具:STM32CubeMX 6.2.0
软件代码:CMSIS_Core 5.3
时钟的选择
STM32_HAL库中SysTick的使用
CubeMX配置好工程,在main.c文件的时钟初始化函数中的 HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_2) 中的结尾处初始化了 SysTick 时钟(HAL_InitTick(uwTickPrio))。
void SystemClock(void)
{
}
在 SysTick 时钟初始化函数(HAL_InitTick(uwTickPrio))中,进行了Systick 相关寄存器及异常中断优先级的配置。在HAL_SYSTICK_Config配置函数中的入口参数是重装载寄存器的值,据此可算出 SysTick 的异常中断时间为1ms(以下图代码为例)
__weak HAL_StatusTypedef HAL_InitTick(uint32_t TickPriority)
{
if(HAL_SYSTICK_Config(SystemCoreclock/(1000U/uwTickFreq))>0)
{
return HAL_ERROR;
}
if(TickPriority <(1UL << __NVIC_PRIO_BITS))
{
HAL_NVIC_SetPriority(SysTick_IRQn,TickPriority,0);
uwTickPrio = TickPriority;
}
else
{
return HAL_ERROR
}
return HALL_OK
}
配置完成后我们可以在 stm32f3xx_it.c 文件夹中的相应中断中添加需要的代码,如下所示