咱们在写单片机程序时,最经常使用的一个函数就是延时函数,不少状况下,都须要咱们产生一个延时,若是此时,程序对延时的精确程度较高,显然通常的延时函数并不能知足咱们的需求,那咱们该怎么办呢?这个时候,Systick定时器就是它发挥做用的时候了。
ide
什么是Systick定时器呢?简而言之,它是stm32内部系统滴答定时器,而且它是24位倒计时定时器,做用就是可以产生精确的延时时间。当计数到0时,它自动从一个叫作RELOD寄存器中自动加载数值。众所周知,咱们想要驱动定时器,须要一个时钟才能驱动,而Systick定时器的时钟比较特殊,它的时钟来源是系统时钟。Systick有两种得到系统时钟的方式,一种是直接取自系统时钟,另外一种是将系统时钟8分频,而后再赋值给Systick定时器。
函数
Systick定时器是属于CM3内核的外设,全部基于CM3内核的单片机都具备这个系统定时器。系统定时器通常用于操做系统,用于产生时基,维持操做系统的心跳。
操作系统
这里先来说讲Systick最基础的用法---精确产生一个延时。这里,就让它延时1秒钟吧。Systick仍是比较简单的,由于它只有四个寄存器。以下:
it
寄存器名称 寄存器描述 CTRL Systick控制及状态寄存器 LOAD Systick重装载数值寄存器 VAL Systick当前数值寄存器 CALIB Systick校准数值寄存器
咱们经过systick产生精确的延时,首先,咱们要设置重装载数值。由于,当定时的时间为0时,RELOAD中的数值自动赋值给systick。那么,设置重装载数值,也就是定时时间为,这里延时ms为单位,class
SysTick->LOAD = 9000 * i; //72MHz进行8分频,因而是9MHz,因此9 * 10^6 Hz * 1 * 10^-6 s
接着,咱们要使能systick,基础
SysTick->CTRL = 0x01; //若为0x00,则关闭定时器
以后,咱们要对定时器清零,定时器
SysTick->VAL = 0;
完整代码以下:程序
void delay_ms ( unsigned int i ){ unsigned int temp; SysTick->LOAD = 9000 * i; //若是是微妙,则 SysTick->LOAd = 9 * i; SysTick->CTRL = 0x01; SysTick->VAL = 0; do{ temp = SysTick->CTRL; //读取当前倒计数值 }while ( ( temp & 0x01 ) && ( !( temp & ( 1 << 16 ) ) ) ); SysTick->CTRL = 0x00; //关闭计数器 SysTick->VAL = 0; //计数器清零 }