触觉智能Purple Pi OH2开发板板载双20Pin的GPIO排针(兼容树莓派),提供了丰富的拓展空间。本文基于Purple Pi OH2为大家讲解GPIO概念、原理、代码示例、调试方法灯。
一、GPIO基本概念
1.1什么是GPIO?
GPIO(General Purpose Input/Output,通用输入输出)是嵌入式系统中最基础的外设接口。每个GPIO引脚可以被配置为:
•输入模式:读取外部信号(如按键、传感器)
•输出模式:控制外部设备(如LED、继电器)
•中断模式:检测边沿变化触发中断
1.2 RK3576 GPIO资源
RK3576芯片共有5组GPIO(GPIO0~GPIO4),每组包含32个引脚(A0-A7, B0-B7, C0-C7, D0-D7)。
从设备树可以看到:
gpio0 = &gpio0; gpio1 = &gpio1; gpio2 = &gpio2; gpio3 = &gpio3; gpio4 = &gpio4;1.3 GPIO命名规则
RK平台使用GPIOx_PYz的命名方式:
•x: GPIO组号(0-4)
•Y:端口(A、B、C、D)
•z:引脚号(0-7)
例如:GPIO0_PB4表示GPIO0组的B端口第4号引脚
二、GPIO工作原理
2.1内部结构
2.2工作模式
模式 | 说明 | 典型应用 |
输入模式 | 高阻态,读取外部电平 | 按键检测 |
输出模式 | 驱动外部电路 | LED控制 |
中断模式 | 边沿/电平触发 | 事件通知 |
复用模式 | 作为其他功能(UART/I2C等) | 引脚复用 |
三、GPIO设备树配置
3.1在设备树中添加GPIO节点
编辑设备树文件(如ido-evb7609-v1a.dtsi):
// 定义 LED 设备节点 / { leds: leds { status = "okay"; compatible = "gpio-leds"; pinctrl-names = "default"; pinctrl-0 = <&leds_gpio>; work_led: work { gpios = <&gpio4 RK_PC7 GPIO_ACTIVE_HIGH>; linux,default-trigger = "heartbeat"; }; hub_rst { gpios = <&gpio4 RK_PD0 GPIO_ACTIVE_HIGH>; default-state="on"; }; }; // USB 电源控制 cgpio:cgpios{ status = "okay"; compatible = "cust,cgpio"; usb_pwr { //SD-card、USB-A、Wi-Fi gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>; init-status = <1>; }; }; };3.2 pinctrl 引脚配置&pinctrl { // LED 引脚配置 led_pins: led-pins { rockchip,pins = <0 RK_PB4 RK_FUNC_GPIO &pcfg_pull_none>; }; // 按键引脚配置 key_pins: key-pins { rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>; }; };3.3 GPIO上下拉配置详解
RK3576的GPIO支持多种上下拉配置,通过rockchip,pins属性的最后一个参数指定。
上下拉配置类型
配置 | 设备树值 | 说明 | 典型应用 |
上拉 | &pcfg_pull_up | 引脚默认上拉到高电平 | 按键输入、I2C SDA/SCL |
下拉 | &pcfg_pull_down | 引脚默认下拉到低电平 | 复位信号、使能信号 |
无上下拉 | &pcfg_pull_none | 浮空输入,无上拉电阻 | LED输出、GPIO输出 |
保持 | &pcfg_pull_bus | 总线保持器 | 低功耗场景 |
实际设备树配置示例
&pinctrl { /* LED 引脚 - 无上拉(输出模式不需要) */ leds_gpio: leds-gpio { rockchip,pins = <4 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>, /* work_led */ <4 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>; /* hub_rst */ }; /* USB 电源 - 无上拉 */ usb_pwr: usb-pwr { rockchip,pins = <0 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>; }; /* 耳机检测 - 上拉(按键检测) */ hp_det: hp-det { rockchip,pins = <3 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up>; }; /* WiFi 唤醒 - 下拉 */ wifi_host_wake_irq: wifi-host-wake-irq { rockchip,pins = <0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_down>; }; /* 按键输入 - 上拉 */ adc_keys_pins: adc-keys-pins { rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>; }; /* I2C 引脚 - 上拉(I2C 标准需要) */ i2c2m0_xfer: i2c2m0-xfer { rockchip,pins = <1 RK_PB3 9 &pcfg_pull_up>, /* i2c2_sda_m0 */ <1 RK_PB4 9 &pcfg_pull_up>; /* i2c2_scl_m0 */ }; };上下拉选择原则
注意事项
1.输出模式:通常使用&pcfg_pull_none,因为GPIO输出是推挽驱动
2.输入按键:必须使用&pcfg_pull_up,确保按键未按下时读到高电平
3.I2C总线:必须使用&pcfg_pull_up,I2C是开漏输出需要上拉电阻
4.中断引脚:根据触发方式选择,上升沿触发用下拉,下降沿触发用上拉
今天就先写到这里 下期带来驱动代码示例和调试方法 以及常见问题解决