定时器在单片机中是一个非常重要东西,其中在Cortex系列的芯片中,内核给我们提供了一个定时器,就是滴答定时器SysTick。其功能就是计时。
SysTick定时器的作用
1:用于延时
2:用于产生中断
3:用于单片机系统(这里不做解释)
SysTick内部结构
根据这个图,总结下各个的作用
HCLK:系统时钟,不会的话可以看我之前的视频
/8 : 一个8分频的分频器,也可以不分
VAL:倒计时寄存器:只用了低0-23位,高位保留(VAL就是Value意思)
LOAD:自动重装载寄存器(load就是本地的意思,本地的寄存器)(英语水平不够,我也不知道他咋就翻译成了自动重装载寄存器了)
CTRL:控制寄存器--拆开就是C(唱)T(跳)R(rap)L(篮球),很生动
SysTick运行的过程是,当SysTick开始运行
1:HCLK提供一个时钟,8分频或不分频来到VAL。
2:VAL内有一个值,每当收到时钟的一个脉冲,则向下递减1位
3:当VAL递减到0时,CTRL内标志位置1表示一个定时周期以完成,并将LOAD内的值赋予VAL。同时根据CTRL内的配置位决定是否触发中断。
在SysTick中只有一个函数需要配置,但是如果想做一些比较灵活的操作的话,需要函数内的位操作有一个比较清楚的认识。
函数位于core_cm4.h中
__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 */
}
这是官方的函数,我们一行一行来解析
第一行:
__STATIC_INLINE官方定义为
#define __STATIC_INLINE static __inline
static:修饰函数只在当前文件有效
__inline:函数被调用时以内联的方式,及不进行创建栈而是将改函数直接复制到引用处。
param:ticks:就是计数值,ticks-1就是放入LOAD中的值
第三行:检测是否参数是否超限,也就是是否超过2的24次方-1
第四行:将tisks-1放入LOAD
第五行:
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
这个函数用于设置SysTick中断优先级的,对于中断优先级不了解的可以看我的另一篇文章,轻松搞懂STM32F407优先级
第六行:清空VAL
第七行:设置CTRL,按从上到下顺序为,设置是否分频,设置是否开启中断,设置SysTick使能。
这里我本来是不想放寄存器介绍的,寄存器直接翻手册就可以了,但是内核这一块东西都是内核手册,而且内核手册是英文的,所以把野火的介绍拿来搞一下,另外其实SysTick还有个校准寄存器,不过没多大用,就不介绍了。
就是这里还有一个地方需要注意,就是这个寄存器的16位,这个用于标志一个计时周期的,读取VAL寄存器会使得这个位自动置0;