搜索
bottom↓
回复: 28

嵌入式Linux应用程序开发-(2)i.MX6UL GPIO控制程序

[复制链接]

出0入0汤圆

发表于 2019-4-4 13:53:41 | 显示全部楼层 |阅读模式
本帖最后由 广轻电气091 于 2019-4-4 14:45 编辑

i.MX6UL GPIO控制程序

TQ-i.MX6UL的底板带有两个LED,可以用来进行GPIO的输出测试实验。
目标:了解Qt应用程序如何控制GPIO,实现通用的输出控制。
功能:通过点击触摸屏上的按钮,实现LED不同的效果(开/关、心跳灯、硬盘灯)。
我们把GPIO控制程序放在ubuntu系统的/opt/work/qt-application/002_gpio_ctrl目录下。

TQ-i.MX6UL的板载LED的硬件原理图如下所示:

从原理图可以看出,TQ-i.MX6UL使用了GPIO5_IO2和GPIO5_IO7这两个IO口进行LED的驱动,LED为高电平点亮。

一般情况下,如果使用通用的方法,进行嵌入式Linux的GPIO控制,可以通过访问/sys/class/gpio路径下的文件,控制GPIO的方向(输入还是输出),状态(高电平还是低电平)。
以控制GPIO5_IO2为例:
1. 计算对应sys/class/gpio的值GPIOn_IOx = (n-1)*32 + x
GPIO5_IO2=(5 -1)*32 + 2 = 130

2. 将GPIO5_IO2设置为输出。
  1. echo  130  >  /sys/class/gpio/export      #用于通知系统需要导出控制的GPIO引脚编号
  2. echo  "out"  >  /sys/class/gpio/gpio130/direction       #控制为输出
  3. echo  "1"  >  /sys/class/gpio/gpio130/value           #输出为高电平
  4. 或者echo  "0"  >  /sys/class/gpio/gpio130/value      #输出为低电平
  5. echo  130  >  /sys/class/gpio/unexport               #通知系统取消导出
复制代码


3. 将GPIO5_IO2设置为输入。
  1. echo  130  >  /sys/class/gpio/export       #用于通知系统需要导出控制的GPIO引脚编号
  2. echo  "in"  >  /sys/class/gpio/gpio130/direction      #控制为输入
  3. 这时给该引脚接高电平,输入即为高电平,反之为低电平
  4. echo 130  >  /sys/class/gpio/unexport       #通知系统取消导出
复制代码


我们不使用以上的方式进行控制,因为内核驱动里面,已经把这两个GPIO的资源用作LED控制,如果强行使用以上方式进行GPIO控制,则系统会提示Device or resource busy


对于TQ-i.MX6UL平台,由于内核已经封装好LED的驱动程序,并且向应用层提供了LED的控制接口(在 /sys/devices/platform/leds/leds/ 目录下的LED1和LED2),因此,应用程序可以基于这个接口,对相应的LED进行控制,下面以LED1为例:
/sys/devices/platform/leds/leds/LED1目录下的文件节点如下图所示:

这里关注两个节点:brightness 和 trigger 。
brightness节点用来控制LED的亮灭,通过对brightness节点写入0或1,可以控制LED的亮灭状态。由于TQ-i.MX6UL的LED接口不是使用PWM方式驱动,因此,brightness节点不支持亮度调节,只支持亮灭控制。
trigger节点用来控制LED不同的触发方式,通过对trigger节点写入不同的状态值,LED可以在不同的状态下进行亮灭显示。trigger支持的状态值有:rc-feedback, nand-disk, mmc0, timer, oneshot, heartbeat, backlight, gpio.

1、先用Qt Creator构建一个工程,命名为:002_gpio_ctrl,关于如何构建工程,请参考嵌入式Linux应用程序开发-(1)第一个嵌入式QT应用程序的具体内容。

2、双击打开“widget.ui”文件,构建界面,构建后的界面如下图所示:


3、关于LED的具体操作,在编写代码的时候,使用面向对象的思想,我们使用一个类进行封装,这个类封装了各种关于LED控制的方法。(具体细节请下载源码),如下图所示:
  1. class Led_Ctrl : public QWidget
  2. {
  3.     Q_OBJECT

  4. public:
  5.     Led_Ctrl();
  6.     ~Led_Ctrl();

  7.     void led1_ctrl(unsigned char state);
  8.     void led2_ctrl(unsigned char state);
  9.     void led_trigger(const char *p_trigger);
  10. private slots:
  11. private:
  12. };
复制代码


4、在Linux系统中一切皆文件,所以,我们可以用普通访问文件的方法来进行LED的控制,在Qt中,可以使用QFile类进行文件访问控制。
  1. void Led_Ctrl::led1_ctrl(unsigned char state)
  2. {
  3.     QFile led1_file(LED1_BRIGHTNESS);

  4.     led1_file.open(QIODevice::ReadWrite);

  5.     if(led1_file.isOpen())
  6.     {
  7.         if(state == LED_ON)
  8.         {
  9.             led1_file.write("0");
  10.         }
  11.         else if(state == LED_OFF)
  12.         {
  13.             led1_file.write("1");
  14.         }
  15.         else
  16.         {

  17.         }
  18.     }
  19.     led1_file.close();
  20. }
复制代码


5、代码编写完成后,编译,并下载到开发板运行,可以实现如下效果。
点击这里,查看实验效果

点击这里,下载工程源码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出590入992汤圆

发表于 2019-4-4 13:58:58 | 显示全部楼层
表示打不开.swf格式。几个播放器一闪而过,不知道是什么。

出0入0汤圆

 楼主| 发表于 2019-4-4 14:07:55 | 显示全部楼层
SUPER_CRJ 发表于 2019-4-4 13:58
表示打不开.swf格式。几个播放器一闪而过,不知道是什么。

我直接换成youku的链接吧,不过要忍受几十秒的广告,比较难受。请问有什么方法可以把视频内嵌到网页中吗?

出0入0汤圆

发表于 2019-4-4 14:19:23 | 显示全部楼层
广轻电气091 发表于 2019-4-4 14:07
我直接换成youku的链接吧,不过要忍受几十秒的广告,比较难受。请问有什么方法可以把视频内嵌到网页中吗 ...

用gif的方式。

出0入0汤圆

发表于 2019-4-4 14:26:31 | 显示全部楼层
持续关注,谢谢分享!

出0入0汤圆

 楼主| 发表于 2019-4-4 14:29:10 | 显示全部楼层

视频20秒以上的时间,转换成gif ,文件比较大,而且显示会失真

出0入8汤圆

发表于 2019-4-4 14:35:29 | 显示全部楼层
支持楼主,讲的很详细!


一个led用三极管驱动,有点奢侈吧。。。


建议这些也用代码格式排版:

  1. echo  130  >  /sys/class/gpio/export      #用于通知系统需要导出控制的GPIO引脚编号
  2. echo  "out"  >  /sys/class/gpio/gpio130/direction       #控制为输出
  3. echo  "1"  >  /sys/class/gpio/gpio130/value           #输出为高电平
  4. 或者echo  "0"  >  /sys/class/gpio/gpio130/value      #输出为低电平
  5. echo  130  >  /sys/class/gpio/unexport               #通知系统取消导出
复制代码

出0入0汤圆

 楼主| 发表于 2019-4-4 14:38:16 | 显示全部楼层
Jmhh247 发表于 2019-4-4 14:35
支持楼主,讲的很详细!

感谢支持,谢谢您的建议。

出0入0汤圆

发表于 2019-4-4 14:50:22 | 显示全部楼层
我想知道,imx6ul控制gpio中速度最快的方式是什么,现在我用内存直接访问,还是感觉不够快

出0入0汤圆

发表于 2019-4-4 14:58:26 | 显示全部楼层
顶一个!

出0入0汤圆

发表于 2019-4-4 15:01:41 | 显示全部楼层
广轻电气091 发表于 2019-4-4 14:29
视频20秒以上的时间,转换成gif ,文件比较大,而且显示会失真

视频打包,以附件形式上传,这样最清晰。

出0入0汤圆

 楼主| 发表于 2019-4-4 15:12:45 | 显示全部楼层
887799 发表于 2019-4-4 15:01
视频打包,以附件形式上传,这样最清晰。

好的,下个例程以这种方式上传

出0入0汤圆

 楼主| 发表于 2019-4-4 15:13:14 | 显示全部楼层

感谢关注!

出0入0汤圆

发表于 2019-4-4 15:55:04 | 显示全部楼层
谢谢分享。。。。

出590入992汤圆

发表于 2019-4-4 18:23:40 | 显示全部楼层
广轻电气091 发表于 2019-4-4 14:07
我直接换成youku的链接吧,不过要忍受几十秒的广告,比较难受。请问有什么方法可以把视频内嵌到网页中吗 ...

看到了,优秀,最近正在学习qt

出0入0汤圆

 楼主| 发表于 2019-4-4 18:58:22 | 显示全部楼层
SUPER_CRJ 发表于 2019-4-4 18:23
看到了,优秀,最近正在学习qt

感谢支持!

出0入0汤圆

 楼主| 发表于 2019-4-4 19:01:19 | 显示全部楼层
zyqcome 发表于 2019-4-4 14:50
我想知道,imx6ul控制gpio中速度最快的方式是什么,现在我用内存直接访问,还是感觉不够快
...

如果对IO的实时性要求比较高,建议使用单片机处理的方式。因为Linux是非实时操作系统,IO操作会有一定的延时

出0入0汤圆

发表于 2019-4-4 19:23:18 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

 楼主| 发表于 2019-4-9 11:50:34 | 显示全部楼层

感谢关注

出0入0汤圆

 楼主| 发表于 2019-4-9 13:53:06 | 显示全部楼层
本章节pdf下载:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-4-10 09:20:34 | 显示全部楼层
楼主更新挺快的

出0入0汤圆

 楼主| 发表于 2019-4-10 09:30:11 | 显示全部楼层

其实是以前一直有记录,不过没好好整理和发布出来

出0入0汤圆

发表于 2019-4-28 07:38:43 | 显示全部楼层

感谢楼主分享

出0入0汤圆

 楼主| 发表于 2019-4-28 08:27:52 | 显示全部楼层

感谢关注

出0入0汤圆

发表于 2019-4-28 08:45:43 | 显示全部楼层
感谢楼主分享,搞个板子给在伙玩玩...

出0入0汤圆

 楼主| 发表于 2019-4-28 08:55:28 | 显示全部楼层
CHEN1986 发表于 2019-4-28 08:45
感谢楼主分享,搞个板子给在伙玩玩...

感谢关注和支持

出0入0汤圆

 楼主| 发表于 2019-4-29 13:56:31 | 显示全部楼层
源码下载路径已更改:点击这里

出0入0汤圆

发表于 2019-8-17 18:38:29 | 显示全部楼层
视频还是传到哔哩哔哩吧,没广告。

出0入0汤圆

 楼主| 发表于 2019-8-18 18:26:33 | 显示全部楼层
meirenai 发表于 2019-8-17 18:38
视频还是传到哔哩哔哩吧,没广告。

好的,感谢建议!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 21:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表