1. SysTick系统定时器概述
学习完STM32的中断,下来就要学习STM32的定时器。就像电话最基本的功能是与人通话一样,定时器最基本的功能就是定时(STM32有些定时器的功能强大得超乎想象,当然不是今天要学的SysTick),定时器的使用步骤无非就是设置定时时间,然后等待超时,超时会触发中断或者设置某个标志位:若是触发中断自然要去执行中断处理函数,处理函数和中断源的绑定工作在启动文件的中断向量表已经明确,我们负责实现与之对应的中断处理函数即可;若是查询标志位则轮询访问该标志位,发生改变后再执行其他处理操作。
定时器涉及到中断,那就跟前面学习的EXTI、NVIC以及中断优先级等概念扯上关系了。系统定时器SysTick是属于CM3内核中的一个外设,相关寄存器内嵌在NVIC中,所有基于CM3内核的单片机都具有这个系统定时器,这使得软件(OS)在CM3单片机可以十分容易的移植。SysTick一般用于操作系统的产生时基功能,以维持操作系统的“心跳”。
2. SysTick系统定时器相关寄存器
下图摘自《Cortex™-M3技术参考手册.pdf》-P153
标准库中core_cm3.h中对SysTick描述结构体放入封装与之对应:
typedef struct
{
__IO uint32_t DHCSR; /*!< Offset: 0x00 Debug Halting Control and Status Register */
__O uint32_t DCRSR; /*!< Offset: 0x04 Debug Core Register Selector Register */
__IO uint32_t DCRDR; /*!< Offset: 0x08 Debug Core Register Data Register */
__IO uint32_t DEMCR; /*!< Offset: 0x0C Debug Exception and Monitor Control Register */
} CoreDebug_Type;
2.1 SysTick控制及状态寄存器(SysTick Control and Status Register)
COUNTFLAG: 若上次读取本寄存器后,SysTick已经计到0,则该位为1
CLKSOURCE: 时钟源选择位,0表AHB / 8,1表处理器时钟AHB
TICKINT: 1表SysTick倒数计数计到0时产生SysTick异常请求,0表计到0时无动作。也可以通过读取COUNTFLAG来确定计数器是否递减到0
ENABLE: SysTick定时器使能位
英文描述如下:
2.2 SysTick重装载数值寄存器(SysTick Reload Value Register)
RELOAD: 当倒数计到0时,将被重装载的值
英文描述如下:
2.3 SysTick当前数值寄存器(SysTick Current Value Register)
CURRENT: 读取时返回当前计数的值,写它则使其清零,同时清除SysTick控制及状态寄存器中的COUNTFLAG状态标志位
英文描述如下:
2.4 SysTick校准数值寄存器(SysTick Calibration Value Register)
这个校准不常用,先不理会。
英文描述如下: