上次点了一个灯之后,总觉得没有什么意思,因为LED一直亮的也没什么意思,所以就得让它闪动起来,学过C语言的同学都知道一个空的循环函数就可以使CPU在那里空转,以达到延时的目的,所以这是我们的第一个延时的代码
void delay(unsigned int t)
{
while(t --);
}
但是,如果这样就结束了,那就太没意思了,这可是stm32单片机啊,一个普普通通的延时就可以搞出花儿来。学过51的都知道,51有一个定时器的东西,stm32也有一个叫定时器的东西,当然stm32不只有一个定时器,它有一堆定时器,但是我现在主要说的是它的SysTick(系统定时器),人们常说的是滴答定时器,它属于Cortex-M3内核的一个外设,内嵌早NVIC(嵌套中断向量)中。系统定时器是一个24bit的向下递减的计数器,计数器每记数一次的时间是1/系统时钟,注意:系统时钟是八分频的,看图

如果是72M,经过分频之后是9M, 所以系统定时器定时一次是1/9M。那么我们计九次就是1us。当重装载数值寄存器的值递减到0时,系统定时器就产生一次中断,以此循环往复。
因为SysTick属于CM3内核的外设,所以所有基于CM3内核的单片机都具有这个系统定时器,这使得软件在CM3单片机中可以很容易移植。系统定时器在一般用于操作系统,用于产生时基,维持系统的心跳。在裸机中也常用作延时。
系统定时器有4个寄存器。使用SysTick产生定时的时候,只需要配置前三个寄存器,最后一个校准计时器不需要使用。
CTRL(控制及状态控制器) LOAD(重装载数值寄存器 )
VAL(当前数值寄存器) CALIB 校准寄存器
介绍如图

本文介绍了如何在STM32单片机上利用SysTick定时器实现精确延时,包括寄存器配置和代码实现,并对比了传统空循环延时方法。
最低0.47元/天 解锁文章
523

被折叠的 条评论
为什么被折叠?



