STM32MP157开发板DTS中GPIO B12的EXTI中断配置问题
STM32MP157 GPIO B12 外部中断配置问题解决
核心问题:EXTI 引脚映射未通过 PinCtrl 配置
STM32MP1 的 EXTI 外设采用「一线对应多bank同编号引脚」的设计,每条 EXTI 线(0-15)只能绑定一个 GPIO bank 的同编号引脚。你提到 GPIO A12 能正常触发中断,是因为默认配置中 EXTI12 绑定了 GPIOA12。要切换到 GPIOB12,必须通过 PinCtrl 配置引脚复用为 EXTI 功能,仅靠中断属性配置是不够的。
正确的 DTS 配置步骤
添加 PinCtrl 节点配置
在你的 DTS 文件中,先定义 GPIOB12 的 EXTI 复用配置(复用功能为EXTI12,同时开启内部上拉):&pinctrl { button_pins: button-0 { pins { pinmux = <STM32_PINMUX('B', 12, EXTI)>; bias-pull-up; }; }; };修改按键节点的中断与引脚配置
按键节点需要关联上述 PinCtrl 配置,并正确指向 EXTI 控制器(EXTI12 对应引脚编号12,不是全局GPIO号28):button { compatible = "test,button"; pinctrl-names = "default"; pinctrl-0 = <&button_pins>; input-gpios = <&gpiob 12 GPIO_ACTIVE_LOW>; interrupts-extended = <&exti 12 IRQ_TYPE_EDGE_FALLING>; interrupt-names = "qwerty"; status = "okay"; };注意:
input-gpios里的GPIO_PULL_UP可以去掉,因为 PinCtrl 已经配置了上拉,避免重复配置冲突。
关于中断配置写法的说明
你尝试的几种写法问题点:
interrupts-extended = <&exti 28 ...>:错误,EXTI 线编号是0-15,对应引脚的编号(如12),不是全局GPIO序号(28)。interrupts-extended = <&gpiob 12 ...>或interrupt-parent = <&gpiob>:STM32MP1 的 GPIO bank 本身不直接提供中断,中断最终由 EXTI 控制器处理,必须指向&exti。
进阶需求:通过 interrupt-name 请求中断
Linux 内核的 request_irq() 函数不支持直接传入中断名作为参数,它需要的是中断号。要利用 interrupt-names 属性,驱动中需要通过设备的中断资源接口获取对应名字的中断号:
struct platform_device *pdev = ...; // 你的设备指针 unsigned int irq; // 根据中断名获取对应的中断号 irq = platform_get_irq_byname(pdev, "qwerty"); if (irq < 0) { // 错误处理 return irq; } // 请求中断 if (request_irq(irq, your_irq_handler, IRQF_TRIGGER_FALLING, "button_irq", pdev)) { // 错误处理 return -EBUSY; }
验证配置是否生效
编译更新设备树后,可通过以下方式验证:
- 查看
/proc/interrupts,确认exti12条目存在。 - 查看
/sys/kernel/debug/gpio,确认 GPIOB12 已配置为输入、上拉,且关联了中断。
内容的提问来源于stack exchange,提问作者user554242
相关产品推荐
相关产品推荐

