1、概述
SysTick定时器也称为系统滴答定时器或系统定时器,是Cortex-M系列处理器内核集成的一个简单的定时器。SysTcik定时器有两个时钟源,分别是内部时钟(FCLK自由运行时钟,等于系统总线时钟HCLK)和外部时钟(STCLK Cotrtex系统定时器时钟,等于系统总线时钟8分频)。在裸机的情况下,SysTick可以作为一个简单的定时器,来产生一个精准的延时,如果加载了操作系统(如UCOS、Linux以及其他的实时/分时操作系统)SysTick定时器可以作为操作系统的时基单元。
功能:SysTick定时器是一个24位(计算范围0~224-1)倒计数(计数方式为减法)定时器,从预装载值(计数周期)一直计数到0,然后再从重装载寄存器中自动重装载初始值,只要不把SysTick定时器的使能位清除,那么SysTick定时器就永远不停,即使芯片在睡眠模式下也能正常工作。
2、寄存器
2.1 控制以及状态寄存器(SysTick_CTRL)
设置SysTick定时器的工作模式以及计算器的状态标志位。
![](https://i-blog.csdnimg.cn/blog_migrate/0254cb7c02935aa938615d5c0bf4f72e.png)
2.2 重装载值寄存器(SysTick_LOAD)
存放SysTick定时器重装载的初始计数值。
![](https://i-blog.csdnimg.cn/blog_migrate/5abfeea0a84a4c29302c0142bf326210.png)
2.3 当前值寄存器(SysTick_VAL)
SysTick定时器倒计数寄存器,对寄存器进行读操作,则返回当前的倒计数值,对寄存器进行写操作时,会把寄存器清零,并且对“到零标志位”同时清零。
![](https://i-blog.csdnimg.cn/blog_migrate/44d93144398bc8d7e43828e0cd39048e.png)
2.4 SysTick校准数值寄存器( CALIB)
![](https://i-blog.csdnimg.cn/blog_migrate/6db7b65151c6e5d46b2e68e07c5b7c51.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1abd211a7c175f77915b226400f105c1.png)
3、示例
1)选择SysTick定时器的时钟源。
2)确定SysTick定时器的定时时长:根据定时时间的公式计算定时初始值,并把初始值写入重装载寄存器。
3)对当前值计数寄存器清零。
4)启动定时器。
5)等待定时时间到达:轮询到零标志位是否被硬件置1.
6)关闭定时器。
/************************** SysTick定时器微秒延时函数 *******************
参数:us:需要延时的微秒数(1~1864135us)
**********************************************************************/
void SysTick_Delay_us(unsigned int us)
{
unsigned int Temp = 0;
/* 选择SysTick定时器时钟源 */
SysTick->CTRL &= ~(1 << 2); //选择外部时钟
/* 设定计数初始值 */
SysTick->LOAD = (72 / 8) * us; //把延时计数初始值写入自动重装载寄存器
/* 计数器清零 */
SysTick->VAL = 0x00;
/* 启动定时器 */
SysTick->CTRL |= 1 << 0; //使能SysTick定时器
/* 等待时间到达 */
do
{
Temp = SysTick->CTRL;
}while( !(Temp & (1 << 16)) );
/* 关闭定时器 */
SysTick->CTRL &= ~(1 << 0); //清除SysTick定时器使能位
}