Linux+自动寻路小车+智航追迹
-
-
作为一名萌新,在如何操作gpio端口上,历经千辛万苦,查阅各种资料。
-
首先是根据同样是发布在平头哥开发社区的博文,链接如下
[https://bbs.aw-ol.com/topic/349/模块第一弹-哪吒d1中gpio及pwm使用?_=1660806719873&lang=zh-CN]
本文是文件操作gpio端口,代码易读懂,但是代码量太大了。对有些部分,像是打开文件,进行读写操作的一块进行,可以简化一些,但是要控制多个gpio端口,还要多次复用,实在是不好用。所以在写完小车动起来的程序后,就想着有没有更简单的方式。 -
找到了官方提供的gpio开发指南,利用的是设备树和Pinctrl和gpio子系统操作gpio,花了两天时间终于弄了个大概明白,想上手开始做,发现没找到一个完整的案例,不知如何入手。
-
于是搜搜查查,最后回归了简单的终端操作,将终端操作用命令和shell脚本来操作方便同时操作多个gpio端口。更简单了,但是没学过脚本语言,准备开始学习基本知识的时候,发现了一篇博文,什么都解决了。链接如下(https://blog.csdn.net/weixin_39673471/article/details/110256721?app_version=5.8.1&code=app_1562916241&csdn_share_tail={"type"%3A"blog"%2C"rType"%3A"article"%2C"rId"%3A"110256721"%2C"source"%3A"Roselucky"}&uLinkId=usr1mkqgl919blen&utm_source=app)https://blog.csdn.net/weixin_39673471/article/details/110256721?app_version=5.8.1&code=app_1562916241&csdn_share_tail={"type"%3A"blog"%2C"rType"%3A"article"%2C"rId"%3A"110256721"%2C"source"%3A"Roselucky"}&uLinkId=usr1mkqgl919blen&utm_source=app
此文里面有一个板块为C语言代码里操作gpio,代码短短几行,用了system()函数来操作echo等,很类似终端操作,但又更方便了。
于是操作gpio变成了这样 -
将大部分操作宏定义
#define EXPORT_GPIO2 "echo 2020 > /sys/class/gpio/export" #define EXPORT_GPIO3 "echo 2021 > /sys/class/gpio/export" #define EXPORT_GPIO4 "echo 2022 > /sys/class/gpio/export" #define UEXPORT_GPIO1 "echo 2027 > /sys/class/gpio/unexport" #define UEXPORT_GPIO2 "echo 2020 > /sys/class/gpio/unexport" #define UEXPORT_GPIO3 "echo 2021 > /sys/class/gpio/unexport" #define UEXPORT_GPIO4 "echo 2022 > /sys/class/gpio/unexport" #define GPIO1_OUTPUT "echo out > /sys/class/gpio/gpio2027/direction" #define GPIO2_OUTPUT "echo out > /sys/class/gpio/gpio2020/direction" #define GPIO3_OUTPUT "echo out > /sys/class/gpio/gpio2021/direction" #define GPIO4_OUTPUT "echo out > /sys/class/gpio/gpio2022/direction" #define LOWGPIO1 "echo 0 > /sys/class/gpio/gpio2027/value" #define LOWGPIO2 "echo 0 > /sys/class/gpio/gpio2020/value" #define LOWGPIO3 "echo 0 > /sys/class/gpio/gpio2021/value" #define LOWGPIO4 "echo 0 > /sys/class/gpio/gpio2022/value"
- 一些操作语句,简单明了
void INIT() { system(EXPORT_GPIO1); system(EXPORT_GPIO2); system(EXPORT_GPIO3); system(EXPORT_GPIO4); system(EXPORT_HW1); system(EXPORT_HW2); system(EXPORT_HW3); system(EXPORT_HW4); system(GPIO1_OUTPUT); system(GPIO2_OUTPUT); system(GPIO3_OUTPUT); system(GPIO4_OUTPUT); system(HW1_INPUT); system(HW2_INPUT); system(HW3_INPUT); system(HW4_INPUT); } void RUN() { system(LOWGPIO1);//0 system(HIGHGPIO2);//1 system(HIGHGPIO3);//1 system(LOWGPIO4);//0 }
- 但是由于没有办法system(cat...),得到value的值只能用文件方式来读出,但也将代码简化了很多。
int GETHW(int gpio) { char in[3] = {0, 0, 0}; char buf[50]; int nread, gpiofd; sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio); gpiofd = open(buf, O_RDWR); if(gpiofd < 0) { fprintf(stderr, "Failed to open gpio %d value\n", gpio); perror("gpio failed"); } do { nread = read(gpiofd, in, 1); } while (nread == 0); if(nread == -1){ perror("GPIO Read failed"); return -1; } close(gpiofd); return atoi(in); }
最后希望哪吒开发板也能拥有专门的操作gpio的函数和接口,方便大家使用。
-
-
@ubuntu14_0824 楼主写的很详细啊,写单片机的老铁们刚接触soc,都有这个适应过程,感谢分享
-
这不来个视频演示?
-
同刚入门,想问下用这种直接终端操作对比官方的pinctrl操作是否响应速度有不同?
我是想生成脉冲控制步进电机的,如果有区别的话用pinctrl是不是更快一些?
但是找不到例子都不知道头文件该调什么:(
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号