正点原子stm32在外部中断中进行delay的过程中,主函数的delay的运行状态

文章讨论了正点原子中delay函数如何利用定时器实现200ms延时,以及中断如何导致原本灯的闪烁问题。中断会打断延时,导致延时效果改变。当中断结束,main函数中的delay恢复时,由于定时器值变化,延时不再准确。
摘要由CSDN通过智能技术生成

正点原子中的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了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值