正点原子中的delay()函数的实现是利用系统滴答定时器的倒计时来实现,不占用中断。
我们在main函数中让led0每200ms闪烁一次
while(1){
HAL_GPIO_TogglePin(GPIOF,LED0_Pin);
delay_ms(200);
}
如果在这200ms的延时中进行外部中断,外部中断中有5s的延时。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
delay_ms(5000);
//if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==1)
// {
HAL_GPIO_TogglePin(GPIOF,LED1_Pin);
// }
}
现象就是原先应该闪烁的灯不闪烁了。
就此我们可以知道中断打断了main函数中的delay,跳入了中断的delay。
当中断结束后回到main函数中的delay后,此时的delay应处于什么状态呢
在调试窗口运行进入main函数的delay函数内部,在判断tnow和told大小这步,tnow和told以及系统滴答定时器的数值如左下角,进入外部中断后
定时器的值依然在变化,在中断中的delay为told等变量新开辟空间。之前main函数中delay中told的值依然存在。
我们从中断再次回到main函数中的delay后,依然从tnow和told的判断语句进行。told和tnow都是离开之前的值,但滴答定时器的值以及发生较大变化。故main函数中的delay_ms(20)以及不是延迟20ms了。