查看: 3713|回复: 3

[分享] 【i.MX6UL】 GPIO控制程序

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3873

    主题

    7477

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39278
    最后登录
    2025-7-21
    发表于 2021-7-23 13:44:28 | 显示全部楼层 |阅读模式
    本文使用的i.MX6UL开发板,带有两个LED,可以用来进行GPIO的输出实验。

    目标:了解Qt应用程序如何控制GPIO,实现通用的输出控制。
    功能:通过点击触摸屏上的按钮,实现LED不同的效果(开/关、心跳灯、硬盘灯)。

    应用程序放在ubuntu系统/opt/work/qt-application/002_gpio_ctrl目录下。

    i.MX6UL开发板的板载LED的硬件原理图如下所示:
    11.png
    从原理图可以看出,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设置为输出。
    #通知系统导出控制的GPIO引脚编号
    echo  130  >  /sys/class/gpio/export
    #控制为输出
    echo  "out"  >  /sys/class/gpio/gpio130/direction
    #输出为高电平
    echo  "1"  >  /sys/class/gpio/gpio130/value
    #输出为低电平
    echo  "0"  >  /sys/class/gpio/gpio130/value
    #通知系统取消导出
    echo  130  >  /sys/class/gpio/unexport

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

    我们不使用以上的方式进行控制,因为内核驱动里面,已经把这两个GPIO的资源用作LED控制,如果强行使用以上方式进行GPIO控制,则系统会提示Device or resource busy,如下图所示:
    12.png
    对于TQ-i.MX6UL平台,由于内核已经封装好LED的驱动程序,并且向应用层提供了LED的控制接口(在 /sys/devices/platform/leds/leds/ 目录下的LED1和LED2),因此,应用程序可以基于这个接口,对相应的LED进行控制。


    下面以LED1为例:

    /sys/devices/platform/leds/leds/LED1 目录下的文件节点如下图所示:
    13.png
    这里关注两个节点: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

    以下是GPIO应用程序的开发过程

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


    2、双击打开“widget.ui”文件,构建界面,构建后的界面如下图所示:
    14.png
    3、关于LED的具体操作,在编写代码的时候,使用面向对象的思想,我们使用一个类进行封装,这个类封装了各种关于LED控制的方法。(具体细节请下载源码),如下图所示:
    15.png
    4、在Linux系统中一切皆文件,所以,我们可以用普通访问文件的方法来进行LED的控制,在Qt中,可以使用QFile类进行文件访问控制。
    16.png
    5、代码编写完成后,编译,并下载到开发板运行。


    qiandao qiandao
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-10 23:03
  • 签到天数: 1502 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4688

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10080
    最后登录
    2025-7-2
    发表于 2021-7-23 17:03:48 | 显示全部楼层
    Qt编写程序还是挺方便的嘛
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-5-20 10:16
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    0

    主题

    18

    帖子

    0

    注册会员

    Rank: 2

    积分
    130
    最后登录
    2021-9-4
    发表于 2021-7-27 10:26:25 | 显示全部楼层
    Qt yyds, Qt集成了很多linux的驱动在其中,比如操作串口的时候就直接调Qt中关于串口的函数即可操作linux中串口设备,当然也包括一些复杂的wifi应用编程,不过驱动还是要自己移植,哈哈
    干活啦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-5-20 10:16
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    0

    主题

    18

    帖子

    0

    注册会员

    Rank: 2

    积分
    130
    最后登录
    2021-9-4
    发表于 2021-7-27 10:27:48 | 显示全部楼层
    Qt中也可以直接调shell点亮小灯,不过本质上都是操作文件
    干活啦
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 03:04 , Processed in 0.088771 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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