静电场 发表于 2022-1-26 18:10:46

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);   
                
}
有没有更好的方法啊?

tclg 发表于 2022-1-26 20:13:32

我都是用 if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_12) != RESET) 这个函数来判断,你这个如果用上升下降沿中断就没办法识别了。但是我也发现了问题,我用的是上升下降沿中断,用这个函数判读多个外部中断源的时候,要先从低位开始判断,再判断高位,反过来的话就有问题,具体就是没有中断的也能识别到中断信号,另外判断多个必须用 if ,else if ,else if 如果每个中断线都用if 来判断也会导致没有中断信号的也会识别到有中断标志,这个真是奇怪的问题。

2nd 发表于 2022-1-26 20:38:25

为什么这么写?5~9只是共中断入口,又不共中断标志,判EXTI_PR就行了。

静电场 发表于 2022-1-27 11:02:50

tclg 发表于 2022-1-26 20:13
我都是用 if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_12) != RESET) 这个函数来判断,你这个如果用上升下降沿中断 ...

我没发现这个问题,我都是if判断,好像顺序也没关系。不知道和你用的库版本有关没有,我是用F4最后版本

静电场 发表于 2022-1-27 11:07:11

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]
查看完整版本: STM32 多路IO共用中断,查询具体触发IO的使用方法