Systick时钟
我们在写单片机程序时,最常用的一个函数就是延时函数,很多情况下,都需要我们产生一个延时,如果此时,程序对延时的精确程度较高,显然一般的延时函数并不能满足我们的需求,那我们该怎么办呢?这个时候,Systick定时器就是它发挥作用的时候了。
什么是Systick定时器呢?简而言之,它是stm32内部系统滴答定时器,并且它是24位倒计时定时器,作用就是能够产生精确的延时时间。当计数到0时,它自动从一个叫做RELOD寄存器中自动加载数值。众所周知,我们想要驱动定时器,需要一个时钟才能驱动,而Systick定时器的时钟比较特殊,它的时钟来源是系统时钟。Systick有两种获得系统时钟的方式,一种是直接取自系统时钟,另一种是将系统时钟8分频,然后再赋值给Systick定时器。
Systick定时器是属于CM3内核的外设,所有基于CM3内核的单片机都具有这个系统定时器。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
这里先来讲讲Systick最基础的用法---精确产生一个延时。这里,就让它延时1秒钟吧。Systick还是比较简单的,因为它只有四个寄存器。如下:
寄存器名称寄存器描述CTRLSystick控制及状态寄存器LOADSystick重装载数值寄存器VALSystick当前数值寄存器CALIBSystick校准数值寄存器
我们通过systick产生精确的延时,首先,我们要设置重装载数值。因为,当定时的时间为0时,RELOAD中的数值自动赋值给systick。那么,设置重装载数值,也就是定时时间为,这里延时ms为单位,
SysTick->LOAD=9000*i;//72MHz进行8分频,于是是9MHz,所以9*10^6Hz*1*10^-6s
接着,我们要使能systick,
SysTick->CTRL=0x01;//若为0x00,则关闭定时器
之后,我们要对定时器清零,
SysTick->VAL=0;
完整代码如下:
voiddelay_ms(unsignedinti){unsignedinttemp;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;//计数器清零}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。