1.GPIO简介
1.1 硬件接线原理图
注意:虽然GPIO可以热插拔,但如果底板没有外壳保护,很容易触摸到底板上的器件,甚至靠近板子的金属部件也很容易导致板子短路。因此,也建议在插拔外设时,最好确保电源已经完全切断。
GPIO的输入/输出电压为3.3V。注意电平匹配,否则会损坏芯片引脚或所连接的器件。
1.2 GPIO硬件资源分布介绍
gpiod 库:需要使用上表中的【芯片对象名称】和【线路偏移】。
Sysfs访问方式:需要使用上表中的【GPIO系统节点路径】。
1.3 gpiod 简介
从Linux 4.8开始,增加了对libgpiod的支持,原有的基于sysfs的访问方式将逐渐被放弃。因此,本文对应的demo主要使用gpiod来控制GPIO。 gpiod库通过操作chip对象和line对象来控制GPIO引脚输出电平或读取GPIO引脚电平。
芯片对象名称:调用gpiod_chip_open_by_name获取芯片对象时作为传入参数。
线路偏移:作为调用gpiod_chip_get_line获取线路对象时的传入参数。
以GPIO5_C0为例,[引脚名称][芯片对象名称][线路偏移]之间的关系如下公式所示。
1.4 sysfs访问方式简介
sysfs控制gpio的方式主要是基于内核提供的gpio控制接口文件。即通过读写/sys/class/gpio目录下的文件来控制对应的gpio接口。
Pin号:sysfs访问方式使用pin号作为操作的依据。
GPIO系统节点路径:具体GPIO管脚对应的节点路径。
[管脚名称] [GPIO 系统节点路径] 之间的关系如下式所示。
引脚导出申请:在使用某个引脚之前,需要手动向gpio管理器申请导出引脚资源。
echo 176 /sys/class/gpio/export ## gpio_request 申请导出对应的gpio
设置该引脚的工作模式:输入或输出。
echo in /sys/class/gpio/gpio176/direction ## gpio_direction_output 将对应的gpio设置为输入方向## 或者echo out /sys/class/gpio/gpio176/direction ## gpio_direction_output 将对应的gpio设置为输出方向
根据引脚的工作模式,进行相应的控制:写电平或读电平。
cat /sys/class/gpio/gpio176/value ## gpio_get_value 获取gpio当前状态值## 或者echo 0 /sys/class/gpio/gpio176/value ## gpio_set_value 设置输出低电平echo 1 /sys/class/gpio/gpio176/value ## gpio_set_value 设置输出高电平
引脚释放申请:引脚使用后,需要手动向gpio管理器申请释放引脚资源。
echo 176 /sys/class/gpio/unexport ## gpio_free释放所申请的gpio
2. 快速上手
2.1 开发环境准备
如果您是初次阅读此文档,请阅读《入门指南/开发环境准备/Easy-Eai编译环境准备与更新》并按照其相关操作进行编译环境的部署。
在PC上的Ubuntu系统中执行run脚本,进入EASY-EAI编译环境,如下图。
cd ~/develop_environment ./run.sh
2.2 源码下载以及例程编译
首先在虚拟机后台终端中执行以下命令创建外设单例源码管理目录:
cd /opt mkdir -p EASY-EAI-Nano-TB/demo
首先从【百度云盘】下载相关单例程序:
链接:https://pan.baidu.com/s/1Br608Hiff2Xs65PzWO_qWQ?pwd=1234
提取码:1234
例如,将单例程序下载到:本电脑\D:\百度网盘(无规定,用户可自主选择),如下图。
然后将下载的单实例复制到虚拟机的文件系统中。流程如下图所示。
最后进入相应的例程目录进行编译操作。具体命令如下:
cd EASY-EAI-Nano-TB/demo/09_GPIO ./build.sh
注意:
* 由于板子上部署了依赖库,交叉编译过程中必须保持挂载/mnt。
编译成功后,会在Release目录下生成相关demo,并自动部署到开发板的/userdata/目录下。
2.3 例程运行
通过串口调试或者ssh调试,进入板子后台,找到例程部署的位置,如下图:
cd /用户数据
执行如下例程命令。
sudo ./test-gpio
执行效果如下。
然后用导线短接[GPIO5_C0]和[GPIO5_C1],即可从[GPIO5_C1]引脚读取[GPIO5_C0]输出的[高电平],如下图。
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_C0',direction=DIR_OUTPUT,val=0, }, { .pinName='GPIO5_C1',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_C0', 1); //pin_out_val('GPIO5_C2', 0); int val=read_pin_val('GPIO5_C1'); printf('GPIO5_C1 val : %d\n', val); //val=read_pin_val('GPIO5_C6'); //printf('GPIO5_C6 val : %d\n', val);返回0; }
其中gpio_init()、pin_out_val()、read_pin_val()是基于libgpiod的简单易用的包。具体实现在09_GPIO/commonApi/gpio.c中
如果用户需要像demo一样引用libgpiod,需要注意以下两点。
* 需要包含头文件:#include.
* 编译时需要添加-lgpiod作为编译参数。
标题:瑞芯微(EASY EAI)RV1126B GPIO使用
链接:https://yqqlyw.com/news/sypc/67692.html
版权:文章转载自网络,如有侵权,请联系删除!