用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)也会直接退出,从而导致延时时间出现错误!