目录
1、SysTick简介
SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器 是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置 系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产 生一次中断,以此循环往复。
因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个 系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统, 用于产生时基,维持操作系统的心跳。一般SysTick系统寄存器用来做延时函数,在此之中可以设置ms和us级别。
2、SysTick寄存器介绍
SysTick—系统定时器有 4 个寄存器,简要介绍如下。在使用 SysTick 产生定时的时候, 只需要配置前三个寄存器,最后一个校准寄存器不需要使用。
代码如下:
void ms_delay(uint32_t ms)
{
uint32_t i;
SysTick_Config( 72000);
for(i=0;i<ms;i++)//一个循环相当于1ms
{
while( !((SysTick->CTRL)&(1<<16)) );//一次计时结束
}
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;//使之使能,置O
}
1、 while( !((SysTick->CTRL)&(1<<16)) ),判断SysTick控制及状态寄存器CTRL,是否计数结束置0,当计数器的值减小到0的时候,CRTL寄存器的位16会置1。
图片内容来源 【野火®】零死角玩转STM32—F103霸道.pdf-->19.2 SysTick 寄存器介绍-->表 19-2 SysTick 控制及状态寄存器
定时时间的计算方式:
其中 CLKAHB =72MHZ=72000000HZ
计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断, 直到SysTick 控制及状态寄存器中的使能位清除。不过 1us 的中断没啥意义,整个程序都用在中断上了,所以我们一般看情况用1ms。
Clk(时钟中断)=72M,t=(72)×(1/72M)=0.000001s=1 us; //1 us进入一次中断NVIC
Clk(时钟中断)=72M,t=(72000)×(1/72M)=0.001s=1 ms; //1 ms进入一次中断NVIC
时间换算单位:1 s=1000 ms=1000000 us
STM32 的内核库已经提供了这个功能,只要配置内置的SysTick_Config()即可实现,一般我们配置计数次数就可以达到我们想要的延时时间单位,SysTick_Config()函数的形参用来设置重装载寄存器的值。1us的代码可以参照1ms的来编写,在需要使用时直接调用即可。
参考链接
学习记录:理解 SysTick系统定时器,编写延时函数_Bitter tea seeds的博客-CSDN博客_systick->ctrl