RK3576开发板GPIO驱动入门教程,基于触觉智能开发板教学-上

触觉智能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.中断引脚 :根据触发方式选择,上升沿触发用下拉,下降沿触发用上拉

今天就先写到这里 下期带来 驱动代码示例和调试方法 以及常见问题解决

相关推荐
comyccccc2 分钟前
LDO与DCDC降压电路原理深度解析学习笔记
硬件工程
Code_Solitude9 分钟前
开发板点灯实验源码
stm32·单片机·嵌入式硬件
炸膛坦客11 小时前
单片机开发工具篇:(十四)配置输出 .map 文件及其本地路径
c语言·单片机·嵌入式硬件
笨笨饿12 小时前
140_AI新手村MCP与Skills是干嘛的
开发语言·人工智能·python·stm32·单片机·嵌入式硬件·物联网
hahaha601614 小时前
色彩恒常性概述
人工智能·嵌入式硬件·数码相机·计算机视觉
我叫洋洋14 小时前
Cadence CIS 元器件库合并实战:3000+ 焊盘、156 个符号零冲突并入自有库
数据库·单片机·嵌入式硬件·oracle·电路
hahaha601615 小时前
Shades-of-Gray (SoG) 算法--白平衡算法
人工智能·嵌入式硬件·算法·计算机视觉
老衲不用@飘柔15 小时前
半导体学习之本征半导体与杂质半导体
硬件工程
ebiobiz15 小时前
极海 APM32 使用 Nimmake 编译指南
c++·python·单片机·嵌入式硬件·mcu
小神兵17 小时前
对电压源与电流源的的简单理解
单片机·嵌入式硬件·物联网