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
相关产品推荐
相关产品推荐

