SYSTICK定时器与内核紧密相连,请参考ARM公司的手册,他的中断使能在自己的模块中,中断优先级和标志位在SCB中。
- 寄存器定义core_cm4.h
typedef struct
{
__IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
__IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
__IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
__I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
} SysTick_Type;
控制及状态寄存器:计数标志、时钟源、异常(中断)使能、计时器使能(开始)
重装载数值寄存器:倒计时起始值,24位有效,因为是减到0后再减1后重装,所以写入值要在目标值上减1
当前值寄存器:存有倒计数的当前值,和计数标志位有联动关系,具体见权威手册
校准寄存器:校准计时用,部分厂家会去掉此功能,读取值位零,较少使用
SysTick_Config(uint32_t ticks)
设置优先级为15(异常中的最低),使能计时器,使能计时器中断,时钟源是SYSCLK
虽然设置优先级时调用了NVIC相关函数,但是systick优先级设置在SCB模块中,只是该函数会根据中断向量号选择设置NVIC还是SCB,实际上与NVIC寄存器无关。
- misc.c
SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
更换systick时钟源的函数
-
有关中断标志位的疑惑
一般而言,中断出发后,在服务函数的最后需要清除中断标志位,保证下次中断正常,比如在使用EXTI时,EXTI->PR唤起中断后,需要写1完成清零,但是systick的相关中断不需要这一步即可正常运行,似乎默认硬件自动清零;它的中断标志位在SCB->ICSR中,在参考手册、内核手册、权威指南中均没有自动复位的描述,甚至留有写1清零位,但似乎并不需要使用。 -
使用流程
只要使用SysTick_Config函数、编写服务函数即可
如果不适用默认的配置,可以仿照库函数自行配置,或者参考权威指南内的步骤建议
在使用OS时,会被用作为OS提供时基,就不能实现其他功能了