2026/6/26 15:19:45

瑞芯微RV1126B开发板(EASY-EAI-PI2) GPIO

瑞芯微RV1126B开发板(EASY-EAI-PI2) GPIO 1.GPIO简介1.1硬件接线原理图注意虽然GPIO可以热插拔但在没给底板加装外壳保护的情况下很容易触碰到底板上的器件甚至板卡附近有金属零件很容易造成板卡短路。因此也建议在插拔外设时最好确保电源已经完全切断。GPIO的输入/输出电压为3.3V注意电平匹配否则会损坏芯片引脚或接入设备。1.2GPIO硬件资源分布介绍gpiod库需要使用上表的【Chip对象名】和【Line偏移量】。sysfs访问方式需要使用上表的【GPIO系统节点路径】。1.3gpiod简介在Linux 4.8开始加入了libgpiod的支持而原有基于sysfs的访问方式将被逐步放弃。因此本文对应的demo主要采用了gpiod方式控制GPIO。gpiod库通过操作chip对象以及line对象来达到控制GPIO引脚输出电平或者读取GPIO引脚电平的目的。Chip对象名在调用gpiod_chip_open_by_name获取chip对象时作为传入参数使用。Line偏移量在调用gpiod_chip_get_line获取line对象时作为传入参数使用。以GPIO5_B2为例【引脚名称】【Chip对象名】【Line偏移量】三者之间的关系如下方公式所示。1.4sysfs访问方式简介sysfs控制gpio的方式主要基于内核提供的gpio控制接口文件。也就是通过读写/sys/class/gpio目录下的文件来控制对应的gpio接口。pin脚编号sysfs访问方式均以pin脚编号作为操作依据。GPIO系统节点路径具体的GPIO引脚所对应的节点路径。【引脚名称】【GPIO系统节点路径】两者之间的关系如下方公式所示。引脚的导出申请某一引脚在使用前需要手动向gpio管理器申请导出该引脚资源。echo 170 /sys/class/gpio/export ## gpio_request 申请导出相应的gpio设置该引脚的工作模式输入或者输出。echo in /sys/class/gpio/gpio170/direction ## gpio_direction_output 设置相应gpio为输入方向 ## 或者 echo out /sys/class/gpio/gpio170/direction ## gpio_direction_output 设置相应gpio为输出方向根据引脚的工作模式做相应的控制写入电平或读取电平。cat /sys/class/gpio/gpio170/value ## gpio_get_value 获取gpio当前状态值 ## 或者 echo 0 /sys/class/gpio/gpio170/value ## gpio_set_value 设置输出低电平 echo 1 /sys/class/gpio/gpio170/value ## gpio_set_value 设置输出高电平引脚的释放申请引脚使用完毕后需要手动向gpio管理器申请释放该引脚资源。echo 170 /sys/class/gpio/unexport ## gpio_free 释放申请的gpio2.快速上手2.1开发环境准备如果您初次阅读此文档请阅读《入门指南/开发环境准备/Easy-Eai编译环境准备与更新》并按照其相关的操作进行编译环境的部署。在PC端Ubuntu系统中执行run脚本进入EASY-EAI编译环境具体如下所示。cd ~/develop_environment ./run.sh 22042.2源码下载以及例程编译首先在虚拟机后台终端执行以下命令创建外设单例源码管理目录cd /opt mkdir -p EASY-EAI-PI2/demo首先到【百度网盘】上下载相关的单例程序链接https://pan.baidu.com/s/1ORJrMeW-bOJ6g_lPiNG6mw?pwd1234提取码1234比如把单例程序下载到此电脑\D:\BaiduNetdisk (无规定用户可自主选择)如下图所示。再将下载好的单例复制进入虚拟机的文件系统过程如下图所示。最后进入到对应的例程目录执行编译操作具体命令如下所示cd EASY-PI2/demo/09_GPIO ./build.sh注* 由于依赖库部署在板卡上因此交叉编译过程中必须保持/mnt挂载。编译成功后相关的demo会生成在Release目录下并会自动部署到开发板的/userdata/目录中。2.2例程运行通过串口调试或ssh调试进入板卡后台定位到例程部署的位置如下所示cd /userdata执行例程命令如下所示。sudo ./test-gpio执行效果如下所示。再把【GPIO5_B2】和【GPIO5_B3】用导线短接起来就能从【GPIO5_B3】引脚读到从【GPIO5_B2】输出的【高电平】如下所示。3.C语言使用案例GPIO的C语言使用案例代码地址为09_GPIO/test-gpio/main.c供用户编码参考。以下代码展示了对GPIO操作流程#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) static const GPIOCfg_t gpioCfg_tab[] { { .pinName GPIO5_B2, .direction DIR_OUTPUT, .val 0, }, { .pinName GPIO5_B3, .direction DIR_INPUT, .val 0, /* }, { .pinName GPIO5_C2, .direction DIR_OUTPUT, .val 0, }, { .pinName GPIO5_C6, .direction DIR_INPUT, .val 0, */ } }; int main(int argc, char **argv) { gpio_init(gpioCfg_tab, ARRAY_SIZE(gpioCfg_tab)); pin_out_val(GPIO5_B2, 1); // pin_out_val(GPIO5_C2, 0); int val read_pin_val(GPIO5_B3); printf(GPIO5_C1 val : %d\n, val); // val read_pin_val(GPIO5_C6); // printf(GPIO5_C6 val : %d\n, val); return 0; }其中gpio_init()pin_out_val()read_pin_val()是基于libgpiod的易用化封装。具体实现于09_GPIO/commonApi/gpio.c若用户需要如demo一样地引用libgpiod需要注意以下两点。* 需要包含头文件#include gpiod.h。* 编译时需要加上-lgpiod作为编译参数。