本帖最后由 数码小叶 于 2020-6-18 10:52 编辑
最近一个应用里用到了STM32F4的两个外部中断,但是最终结果一直不对,发现仿真是正确的,单独运行就不正确,多次调试后发现问题出现在中断上,中断服务函数进了两次,但是这个应用只允许进一次中断
在论坛搜索到两个帖子:
用HAL库写的一个STM32的中断程序,为什么会发生两次中断
https://bbs.21ic.com/icview-2520878-1-1.html?fromuser=
(出处: 中国电子网技术论坛)
关于STM32中断多进的问题总结
https://bbs.21ic.com/icview-184728-1-1.html?fromuser=
(出处: 中国电子网技术论坛)
知道了问题出现的原因是AHB2APB桥延迟,其中提到几条建议:
1)进入中断后,判断了相应标志位,就clear之,在作后续的处理
3、解决方法:清中断标志,只要不是中断函数的最后一条语句就没问题了。
当前这个情况下把程序下载到板子上运行的时候,按下按键,LED的状态会翻转两次,后来尝试改了一下软件生成的代码,将清中断标志位那条语句放到调用中断回调函数之后就可以了
程序原本的代码:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_8)
{
xxxxxxxxxxxxxxxxxxxxxxxxx;
}
}
原本的清标志是自动生成的
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
按照建议,改成如下依旧无效果
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
if(GPIO_Pin == GPIO_PIN_8)
{
xxxxxxxxxxxxxxxxxxxxxxxxx;
}
}
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
}
}
|