您的位置 首页 5G

STM32延时函数

voiddelay_init(u8SYSCLK){SysTick->CTRL=0xfffffffb;fac_us=SYSCLK8;fac_ms=(u1

void delay_init(u8 SYSCLK)

{
SysTick->CTRL&=0xfffffffb;
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
Systick 首要的效果便是拿来计时,其原理和使用简述一下便是这样的:经过装备寄存器 SysTick->CTRL来设定Systick的计时频率并Enable使Systick开端计数,这儿的 SysTick->CTRL&=0xfffffffb应该很好了解,把第2位设定为0,查找使用手册能够知道这是把Systick的计时频率设定为CPU主频(SYSCLK)的1/8。
假定咱们板子默许的晶振频率是8Mhz,默许CPU作业频率(SYSCLK)是9倍频,即72M,那Systick的频率便是72/8=9Mhz。
知道了Systick的频率,下一步便是确认倒时计数器的数值,即SysTick-> LOAD这个寄存器的装备。上面现已知道了,Systick的作业频率F=9Mhz=SYSCLK/8,即每秒钟计数器自减900万次,也便是说,SYSCLK/8次的自减耗时1秒,那么(8/SYSCLK)/1000,000次自减就耗时1微秒了,这也便是fac_us的值了。那么上面函数中的fac_us为什么是SYSCLK/8呢?这儿先搞清楚一点,函数中SYSCLK的单位是Mhz,所以SYSCLK的值是72(这个以Mhz为单位应该是STM32根底库里边做过宏界说的),不然也不行能用一个8位整形去表明一个7200万的数值;而咱们这儿核算的SYSCLK是以Hz为单位的,即 72Mhz/1000,000=72,所以这个SYSCLK/8是对的。
你或许还没搞清楚 fac_us到底是干嘛的。很简单,fac_us便是要写入SysTick-> LOAD寄存器的值,Systick的作业原理是这个寄存器的值在Systick被Enable之后就开端以设定的作业频率自减,减到0的时分就宣布中止,完结守时。所以,写入fac_us到SysTick-> LOAD寄存器,便是要Systick在自减了fac_us次今后宣布中止,自减fac_us所耗的时刻现已说了,1微秒。
下面的fac_ms应该很好了解了,便是1毫秒的计数次数,刚好是1奇妙的1000倍,留意9×1000超出了8位整形的表明规模,所以要用(u16)先把fac_us转成16位变量,以确保核算的正确。
详细的使用函数是用来做延时,如下:
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时刻加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //Enable Systick,开端倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时刻抵达
SysTick->CTRL=0x00; //Disable Systick
SysTick->VAL =0X00; //清空计数器
}
详细的寄存器装备只需看手册就知道了,这儿只需要了解一句:
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时刻抵达
中心便是while(temp&0x01&&!(temp&(1<<16)));//等待时刻抵达
temp 现已是Systick操控寄存器的值了,temp&0x01便是把该寄存器的值读出而且把除第一位之外位都清零(当然要经过temp变量来传递值而不是直接修正寄存器),第一位便是Systick的Enable装备信息,写入1便是Enable,写入0便是Disable,读这一位是判别 Systick是否依然处于Enable状况(或许被其他中止禁用掉),temp&(1<<16)便是读取第16位的值,这一位假如为0就表明计数器的值不是0(即还在计数),假如是1就表明计数器现已自减到0了。
那么这段就很好了解了,即判别,假如Systick还在Enable的状况,而且计数器还没数到0,就不断的循环把当时的 SysTick->CTRL寄存器值写入变量temp,持续下一次判别。当Systick被Disable或许计数器数到0了,就中止循环。由于仅仅做延时,也不需要跳到任何中止服务那儿去处理什么,只需这个循环的耗时进程完结就能够了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/317442.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部