GPIO10 11用作外部中断
时间: 2024-12-29 22:23:34 浏览: 5
### 配置 GPIO10 和 GPIO11 作为外部中断
在嵌入式 Linux 系统中,要将 GPIO10 和 GPIO11 设置为外部中断引脚,需遵循特定的配置流程。这涉及到修改设备树、编写相应的驱动程序以及确保内核支持必要的功能。
#### 修改设备树以启用 GPIO 中断
为了使能 GPIO10 和 GPIO11 的中断功能,在设备树源文件 (DTS) 中定义这些引脚并指定它们的行为至关重要:
```dts
&gpioa {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpioa>;
gpio_keys: keys {
compatible = "gpio-keys";
#address-cells = <1>;
#size-cells = <0>;
button@10 {
label = "GPIO Button 10";
linux,code = <BTN_0>;
gpios = <&gpioa 10 GPIO_ACTIVE_LOW>; /* PA10 */
interrupt-parent = <&exti>;
interrupts = <10 IRQ_TYPE_EDGE_RISING>;
};
button@11 {
label = "GPIO Button 11";
linux,code = <BTN_1>;
gpios = <&gpioa 11 GPIO_ACTIVE_LOW>; /* PA11 */
interrupt-parent = <&exti>;
interrupts = <11 IRQ_TYPE_EDGE_RISING>;
};
};
};
```
这段代码片段展示了如何通过设备树来声明两个按钮,并指定了每个按钮对应的 GPIO 号码及其触发模式[^4]。
#### 编写按键处理模块
创建一个简单的字符设备驱动用于捕捉来自上述 GPIOs 的事件。下面是一个简化版的例子:
```c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#define BUTTON_GPIO_10 10
#define BUTTON_GPIO_11 11
static irqreturn_t button_irq_handler(int irq, void *dev_id)
{
printk(KERN_INFO "Interrupt from %s\n", dev_id);
return IRQ_HANDLED;
}
static int __init init_button_module(void)
{
int ret;
ret = request_irq(gpio_to_irq(BUTTON_GPIO_10),
button_irq_handler,
IRQF_TRIGGER_RISING,
"button_irq_10",
"Button 10");
if(ret){
pr_err("Failed to register IRQ handler for GPIO%d.\n", BUTTON_GPIO_10);
goto err_out;
}
ret = request_irq(gpio_to_irq(BUTTON_GPIO_11),
button_irq_handler,
IRQF_TRIGGER_RISING,
"button_irq_11",
"Button 11");
if(ret){
free_irq(gpio_to_irq(BUTTON_GPIO_10), NULL); // Clean up previous registration.
pr_err("Failed to register IRQ handler for GPIO%d.\n", BUTTON_GPIO_11);
goto err_out;
}
return 0;
err_out:
return ret;
}
static void __exit cleanup_button_module(void)
{
free_irq(gpio_to_irq(BUTTON_GPIO_10), NULL);
free_irq(gpio_to_irq(BUTTON_GPIO_11), NULL);
}
module_init(init_button_module);
module_exit(cleanup_button_module);
MODULE_LICENSE("GPL");
```
此 C 文件实现了基本的中断服务例程(ISR),每当检测到上升沿时就会被调用,并打印一条消息指出哪个 GPIO 发生了变化[^3]。
阅读全文