You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32MP157A启用其他端口GPIO时EXTI中断无法触发求助

问题排查:STM32MP157 PA12 EXTI中断与PD12/PE12/PG12 GPIO导出冲突

核心原因:EXTI线路共享抢占

STM32MP157的EXTI中断线路是按引脚序号共享的——PA12、PB12、PC12、PD12、PE12、PF12、PG12全部共用EXTI12线路。Linux GPIO子系统规定,同一EXTI线路只能被一个引脚独占使用,当你通过API导出PD12/PE12/PG12作为普通GPIO时,内核会自动将EXTI12线路的所有权切换到这些引脚对应的GPIO控制器上,直接覆盖PA12的EXTI中断配置,导致中断无法触发。

具体排查与解决方向

  • 验证线路抢占现象
    执行cat /sys/class/gpio/gpio12/edge(若PA12被映射为gpio12),导出PD12/PE12/PG12前后对比该文件内容:正常中断配置时应为falling,导出后会被重置为none,证明EXTI线路已被抢占。

  • 硬件/引脚规划调整
    更换PD12/PE12/PG12为其他序号的引脚(比如PD13、PE13),避开与PA12共用同一EXTI线路的引脚序号,从根源上解决冲突。

  • 设备树独占配置
    在设备树中明确标记PA12为中断专用引脚,添加独占属性阻止普通GPIO抢占:

    pinctrl_pa12: pa12-irq {
        pins = "PA12";
        function = "gpio_in";
        bias-pull-up;
        interrupts = <12 IRQ_TYPE_EDGE_FALLING>;
        interrupt-parent = <&exti>;
        /* 添加独占标记,禁止同序号GPIO复用 */
        gpio-line-names = "PA12_IRQ";
        status = "okay";
    };
    
  • 寄存器状态校验
    使用devmem工具读取EXTI相关寄存器,确认导出前后PA12的中断配置是否被篡改:

    # 读取下降沿触发寄存器EXTI_FTSR1(基地址0x50000800,偏移0x08)
    devmem 0x50000808
    # 读取中断屏蔽寄存器EXTI_IMR1(偏移0x00)
    devmem 0x50000800
    

    检查第12位是否保持置1,若导出后被清零,说明EXTI配置被内核GPIO子系统覆盖。

内容的提问来源于stack exchange,提问作者Deepak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:00:01