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