本章知识的总结大部分来自于《M3--权威指南》
SysTick属于NVIC的一部分(即属于内核的一部分),可以产生SysTick异常,为简单的24位向下计数器,可以使用外部参考时钟或内部时钟。SysTick有两个重要的特征:一,它是为OS服务的,作为一个周期性的中断来定期触发OS(这需要后续的探索);二是处理器设计要确保运行在非特权等级的应用无法禁止该定时器,否则任务会禁止SysTick定时器并锁定整个系统。
SysTick定时器存在四个寄存器。CMSIS-Core头文件中定义了一个名为SysTick的结构体。
若系统中不需要OS,SysTick定时器可用作定时器的简单外设,用以产生周期性的中断,延时和时间测量。(这三个方面是本篇的重点)若想产生周期性的SysTIck中断,最简单的方法是使用CMSIS-Core的函数SysTick_Config(),下面的例程就使用了该函数。
下面来看程序。
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_SysTick.h"
int main(void)
{
LED_GPIO_Config ();
SysTick_Init();
while(1)
{
LED1 (ON);
Delay_us (10000); //10000*10us=100ms
LED1 (OFF);
}
依旧是在一个简单的led灯点亮的实验基础上,增添了定时器的内容。在主函数中,出现了SysTick的配置函数,消失了以往的用while(i--)的简单方式进行的延时函数。进入SysTick_Init(),观察配置的细节。
void SysTick_Init(void)
{
if (SysTick_Config(SystemCoreClock / 100000))
{
/* Capture error */
while (1);
}
调用库函数SysTick_Config(),如果为真,就出现错误,进入无限循环。为了搞清楚这个,我们进入这个库函数。
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible