一.SysTick概述
Systick定时器是一个24 位的倒计数定时器,计到0时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
Systick定时器一般用来做精确的延时,或者在实时系统中充当心跳时钟,这样就大大节省了定时器资源,不必浪费一个单独的定时器。
Systick定时器旳时钟来源可以是内核时钟FCLK或AHB总线时钟HCLK。
Systick定时器可以产生Systick中断,中断号为15。
使用步骤:
1.初始化
void SysTick_Init(void)
{
if(SysTick_Config(SystemCoreClock/100000))
{
while(1)
;
}
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
}
函数描述:调用函数SysTick_Config(),相当于打开了系统滴答时钟和滴答中断,传入的参数的含义是产生一个滴答中断所经过的系统时钟周期数,函数返回值为0表示系统滴答时钟设置成功,返回值为1表示系统滴答时钟设置失败(以上函数中,若设置失败则进入死循环)。紧接着直接操作寄存器关闭系统滴答时钟,后面用到的时候再打开。
2.调用
下面以一个简单的延时函数为例解析一下系统滴答时钟的应用。
首先定义一个全局变量:
static __IO u32 TimingDelay;
延时函数如下:
void delay_us(__IO u32 nTime)
{
TimingDelay=nTime;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
while(TimingDelay!=0)
;
}
中断函数如下:
void TimingDelay_Decrement(void)
{
if(TimingDelay!=0x00)
{
TimingDelay--;
}
}
其中中断函数需要在文件stm32f10x_it.c的开头进行声明[extern void TimingDelay_Decrement(void);],并在文件stm32f10x_it.c的void SysTick_Handler(void)函数里面进行调用。
函数描述:每次调用延时函数,传入参数的值传给一个全局变量TimingDelay,并且延时函数将立即开启系统滴答时钟,在TimingDelay不等于0的情况下陷入死循环。与此同时,系统滴答时钟是由内核控制的,每产生一次滴答中断,内核便会自动执行中断函数,令TimingDelay减1,直至TimingDelay减为0,不再执行中断程序,也即刻跳出延时函数的死循环,回到原来调用延时函数的代码的下一行继续执行其它代码,从而实现了延时的功能。
二.寄存器概述
STK_CTRL
STK_VAL
STK_LOAD