用systick計數器做delay函數易出現的錯誤一則

用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)也會直接退出,從而導致延時時間出現錯誤!

發佈了18 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章