先楫半导体HPMicro
直播中

城市世界

3年用户 41经验值
擅长:电源/新能源 测量仪表 嵌入式技术 控制/MCU
私信 关注

GPIO中断例程实现按键检测和定时采样,中断无法返回

我利用GPIO中断例程实现按键检测功能,同时加入了定时采样后,发现GPIO中断无法返回,不管是否清除了中断标志,我怀疑是不是例程里少了一步中断返回。

但不知道先楫对于处理完中断后返回应该怎么处理。

void isr_gpio(void)

{

if(gpio_check_pin_interrupt_flag(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,BOARD_APP_GPIO_PIN_DOWN))
                    {
                     printf("Down Key is on...\\n");
                     //board_delay_ms(200);
                     gpio_toggle_pin(BOARD_OP_GPIO_CTRL, BOARD_OP_GPIO_INDEX,BOARD_OP_GPIO_PIN);
                     board_delay_ms(200);

                     gpio_clear_pin_interrupt_flag(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,BOARD_APP_GPIO_PIN_DOWN);
                    
                     }
             
}
SDK_DECLARE_EXT_ISR_M(BOARD_APP_GPIO_IRQ, isr_gpio)

回帖(4)

martin330824

2023-10-18 10:26:31
哪个系列芯片?
1 举报

冯泽平

2023-10-18 13:59:55
我按照你的代码写的测试 没有发现问题 ,
void isr_gpio(void)
{

      if(gpio_check_pin_interrupt_flag(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,BOARD_APP_GPIO_PIN))
      {
        
          printf("toggle led pin output\n");
            gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX,
                                BOARD_LED_GPIO_PIN);
            board_delay_ms(200);
    gpio_clear_pin_interrupt_flag(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,
                              BOARD_APP_GPIO_PIN);               
      }
}
SDK_DECLARE_EXT_ISR_M(BOARD_APP_GPIO_IRQ, isr_gpio)

中断代码里面只要清除了相关的标志位就能正常返回,没有清除就会反复进入(如果中断源反复触发也会反复进入)。
你的问题不在中断处理程序里面,可能是其他地方如初始化 中断源反复触发或者触发的中断源不是你判断并清除的的那个源等。
1 举报
  • 城市世界: 单看这个程序是没问题的,但当和我的采样程序一起运行的时候,GPIO中断后,采样程序就停掉了,并且不再运行,我怀疑是这个中断程序没返回。每次按键都会有响应。

城市世界

2023-10-18 21:19:19
尝试在中断里加return(0);也没用。
举报

城市世界

2023-10-29 10:12:54
终于查到问题了,是那个board_delay_ms(),感觉不能用在中断函数里,当注释掉这句的时候便能正常返回,很奇怪的是在主程序里这个可以正常使用。查看代码也看不出什么道道来。很奇怪。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分