STM32 多路IO共用中断,查询具体触发IO的使用方法
我使用的407;使用的PE的7,8,9三路IO中断。使用下面的办法确定每次触发的IO,好像偶尔有丢失中断。void EXTI9_5_IRQHandler(void)//EXTI9_5_IRQn
{
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_7) == 0) HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
else __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_7);
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_8) == 0)HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
else __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8);
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_9) == 0) HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
else __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9);
}
有没有更好的方法啊? 我都是用 if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_12) != RESET) 这个函数来判断,你这个如果用上升下降沿中断就没办法识别了。但是我也发现了问题,我用的是上升下降沿中断,用这个函数判读多个外部中断源的时候,要先从低位开始判断,再判断高位,反过来的话就有问题,具体就是没有中断的也能识别到中断信号,另外判断多个必须用 if ,else if ,else if 如果每个中断线都用if 来判断也会导致没有中断信号的也会识别到有中断标志,这个真是奇怪的问题。 为什么这么写?5~9只是共中断入口,又不共中断标志,判EXTI_PR就行了。 tclg 发表于 2022-1-26 20:13
我都是用 if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_12) != RESET) 这个函数来判断,你这个如果用上升下降沿中断 ...
我没发现这个问题,我都是if判断,好像顺序也没关系。不知道和你用的库版本有关没有,我是用F4最后版本 2nd 发表于 2022-1-26 20:38
为什么这么写?5~9只是共中断入口,又不共中断标志,判EXTI_PR就行了。
惯性思维,原来都是用1路中断,直接调库函数 HAL_GPIO_EXTI_IRQHandler( );了。而且里面有中断标识判断。看来多路就不适合了,还是先判断标识主动处理了。
我改成这样试试
void EXTI9_5_IRQHandler(void)//EXTI9_5_IRQn
{
uint16_t exit_io=0;
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_7) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_7);
exit_io |=0x01;
}
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_8) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8);
exit_io |=0x02;
}
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_9) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9);
exit_io |=0x04;
}
if(exit_io) HAL_GPIO_EXTI_Callback(exit_io);
}
页:
[1]