导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    Linux+自动寻路小车+智航追迹

    MR Series
    4
    4
    2131
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • U
      ubuntu14_0824 LV 2 最后由 编辑

      • 作为一名萌新,在如何操作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的函数和接口,方便大家使用。

      Y 1 条回复 最后回复 回复 引用 分享 0
      • Y
        yelong98 LV 7 @ubuntu14_0824 最后由 编辑

        @ubuntu14_0824 楼主写的很详细啊,写单片机的老铁们刚接触soc,都有这个适应过程,感谢分享

        1 条回复 最后回复 回复 引用 分享 1
        • H
          huanian LV 4 最后由 编辑

          这不来个视频演示?

          1 条回复 最后回复 回复 引用 分享 0
          • allwinner_account
            allwinner_account LV 5 最后由 编辑

            同刚入门,想问下用这种直接终端操作对比官方的pinctrl操作是否响应速度有不同?
            我是想生成脉冲控制步进电机的,如果有区别的话用pinctrl是不是更快一些?
            但是找不到例子都不知道头文件该调什么:(

            1 条回复 最后回复 回复 引用 分享 0
            • 1 / 1
            • First post
              Last post

            Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

            行为准则 | 用户协议 | 隐私权政策