现在的位置: 首页 > 综合 > 正文

用systick计数器做delay函数易出现的错误一则

2016年11月18日 ⁄ 综合 ⁄ 共 843字 ⁄ 字号 评论关闭

用systick计数器做delay函数易出现的错误一则

    今天在调试程序过程中,发现以前用的好好的delay函数突然不准了,一开始怎么也没有怀疑到delay函数的问题,先贴代码:

//主函数里用到了delay函数

void main()

{    

 if(flag==1)
     {
        Delay_Ms(1000);

         flag=0;
      }

}

中断里也用到了delay函数

void EXTI9_5_IRQHandler(void)

  Delay_Ms(1);
  if((EXTI_GetITStatus(EXTI_Line8)==1)&&(flag==0))
  {
    GPIO_ResetBits(GPIOC, GPIO_Pin_11);
    GPIO_SetBits(GPIOC, GPIO_Pin_9);
    Delay_Us(100);//脉冲持续时间
    flag=1;
   
    TIM5CH1_CAPTURE_STA=0;   //清空
    TIM5CH1_CAPTURE_VAL=0;
    TIM_SetCounter(TIM5,0);
    //ms_delay(20000);
    GPIO_ResetBits(GPIOC, GPIO_Pin_9);
    Delay_Us(3);//延时接受
    GPIO_SetBits(GPIOC, GPIO_Pin_11);
  }
    EXTI_ClearITPendingBit(EXTI_Line8);  // LINE8  
}

 

后来终于在一大神的指导下找到了错误,原来在main函数里当flag==1时,会执行Delay_Ms(1000)函数,但一旦再次进入中断,中断也会执行Delay_Ms(1)函数,而此时,因为Delay_Ms()中用的是systick clock计数,执行Delay_Ms(1)过程中会重新装载计数值,从而导致退出中断后主函数中的Delay_Ms(1000)也会直接退出,从而导致延时时间出现错误!

抱歉!评论已关闭.