长时间延时

2019-07-21 07:21发布

近客户须要把延时时间长到120S,而delay_ms()只能延时1.86S。为了达到长延时效果,自己重新写了个函数分享给大家一起学习与改进,此延时函数精度不是很高。
void LongDelay_ms(u32 delay)
{
   u32 Remainder;
   if (delay > 1000)
  {
     Remainder = delay % 1000;//先延时余数
     if (Remainder)
       delay_ms(Remainder);
     delay -= Remainder; //减除余数
     for (; delay >= 1000; delay -= 1000)
     {  
       IWDG_ReloadCounter();//最大间隔时间为1.86S 所以1.86S内必须喂狗
       delay_ms(1000);
     }
     
   }
else
   {
     delay_ms(BackTime);
   }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
小小码
1楼-- · 2019-07-21 07:51
 精彩回答 2  元偷偷看……
275891381
2楼-- · 2019-07-21 08:40
多逛逛论坛吧

static   u8  fac_us=0;                                                             //us延时倍乘数       
//SYSTICK的时钟固定为HCLK时钟的1/8
//中断时间time  =  ( SysTick->LOAD + 1 ) / f                        f = AHB或AHB/8            (9000-1+1)/9M=1ms
void delay_init(void)
{
        //NVIC_SetPriority (SysTick_IRQn, x);默认是NVIC_SetPriority (SysTick_IRQn,15);
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8  9M 计数器减1为1/9000000秒
        fac_us=SystemCoreClock/8000000;                                                //9  
        SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;                     //开启SYSTICK中断
        SysTick->LOAD=fac_us*1000-1;                                                               //每1/1000s中断一次       
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;                     //开启SYSTICK          
}       

//nus:0~2^32/fac_us=477218588.444us=477s        (fac_us=9)                                                                  
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                                            //LOAD的值                     
        ticks=nus*fac_us;                                                                               //需要的节拍数                           
        tcnt=0;
        told=SysTick->VAL;                                                                  //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;       
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;                                  //这里注意一下SYSTICK是一个递减的计数器就可以了.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                                                      //时间超过/等于要延迟的时间,则退出.
                }  
        }       
}

一周热门 更多>