延时函数

         如果我们需要得到精确的定时,那么我们可以使用STM32中的定时器(时钟9M,1微秒减9),例如,SysTick 定时器。SysTick是一个24位的递减计数器,它放在NVIC中,主要目的是为了给操作系统提供一个硬件上的中断(滴答中断)。SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。计数到0 时,SvsTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(假如中断使能情况下)。在STM32中,SysTick定时器可以用来作为操作系统的滴答定时器。如果我们的程序不使用操作系统,那么SysTick定时器可以用来产生精确的定时。

//初始化延迟函数
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init(u8 SYSCLK)
{
   SysTick->CTRL&=0xfffffffb;  //bit2清空,选外部时钟 HCLK/8
   fac_us=SYSCLK/8:
   fac_ms=(u16)fac_us*1000;
}
//延时nus
//nus为要延时的us数
//n为10,20,30,.....

void delay_us(u32 nus)
{
  u32 temp;
  SysTick->LOAD=nus*fac_us; //时间加载
  SysTick->VAL=0x00;  //清空计数器
  SysTick->CTRL=0x01; //开始倒数
  
  do
  {
   temp=SysTick->CTRL;
   }
   while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
   SysTick->CTRL=0x00;//关闭计数器
   SysTick->VAL =0X00://清空计数器
}

要注意因为 LOAD 仅仅是一个24bit的寄存器,延时的ms数不能太长。否则超出了LOAD 的范围,高位会被舍去,导致延时不准。最大延迟ms数可以通过公式:n ms<=0xffffff *8*1000/SYSCLK 计算。SYSCLK 单位为Hz,nms的单位为ms。如果时钟为72M,那么nms的最大值为1864ms。超过这个值就会导致延时不准确。

上一篇:k8s核心操作_Deployment的扩缩容能力_Deployment自愈和故障转移能力---分布式云原生部署架构搭建022


下一篇:Artificial intelligence machine learning DATA4800