• 实验分享丨迅为IMX6ULL开发板点亮第一个led灯


    本章内容对应IMX6ULL开发板视频讲解链接(在线观看):

    我们学 linux 、单片机的第一个操作硬件就是点亮第一个 led 灯。
    在单片机上我们点亮一个 led 灯非常的简单,直接操作引脚就可以了。虽然 linux 听着比较高大上,但是点亮一个 led 灯是非常容易的。我们甚至不用去写驱动,直接命令操作就可以了,因为 linux 系统本身有好多成熟的驱动框架,使用这些框架的好处就是当我们更换平台的时候,比如换到 RK3399 平台,我们应用程序可以不用做任何改变,就可以直接在新的平台上运行。但是如果你在单片机上写一个点灯程序,比如说我在 32 上写了一个点灯我现在想把它移植到 51 上那这个移植过程是比较麻烦的,如果说用寄存器写的就要改寄存器,如果说用库函数写的移植到 51 上也要写对应的库函数,这就比较麻烦了,但是在 linux 上直接使用命令就可以了。对于 led 设备,linux 提供的是 led 子系统框架。
    31.1 前置知识
    1. 怎么控制 led 灯的亮灭?
    以 IMX6ULL 终结者开发板为例,原理图如下图所示,我们给管脚 GPIO_3 低电平,电路导通,led2 亮,给 GPIO_3 高电平,电路不导通,led2 灭。R80 为限流电阻,保护 led 灯不被烧毁。


    2. echo > 重定向命令
    举例:
    echo hello > test.txt
    将字符串输出重定向,当前目录没有 test.txt,则创建 text.txt ,并将字符串输出到 test.txt 文件中。和直接使用 vi 编辑器打开 test.txt 然后输入 hello 的效果是一样的。如下图所示。


    31.2 led 子系统的使用
    我们在超级终端上使用命令 “cd /sys/class/leds/”即可进到被 led 子系统所展现的设备下。在这个目录下面都是以 led 设备命令的设备。其中 sys-led 就是我们要操作的用户灯,对应底板的 led2。如下图所示。

    然 后 我 们 进 到 sys-led 这 个 具 体 的 设 备 下 面 。 如 图 31.2.2 所 示 , 在 这 个 图 中 , 我 们 需 要关心”brightness”, ”trigger”这几个参数,分别对应亮度,触发方式。

    开发板上的 led2 默认的触发方式是 heartbeat,我们可以使用 cat 命令来查看,用”[]”圈出来的则为当前的触发方式。如下图所示。

    我们使用命令 “echo none > trigger” 可以把触发方式设置成没有触发,led2 也就熄灭了。如下图所示。

    点亮 led2 我们只需要设置 brightness 参数就可以了,设置为 1,则打开 led2 ,设置为 0,则关闭 led2。
    打开 led2:
    echo 1 > /sys/class/leds/sys-led/brightness
    关闭 led2:
    echo 0 > /sys/class/leds/sys-led/brightness


    使用 led 子系统我们可以很方便的控制 led 灯,不管是什么平台,包括 3399 、4418/6818 、i.MX6ull都可以使用这个方法,这个方法是通用的。在单片机上是使用程序来控制的,我们在这里使用命令,其实我们也可以使用程序来控制,因为我们有的时候是在程序上点灯,而不是需要我们去手动输入命令。

    31.3 使用 c 语言调用 shell 命令控制 led 灯
    用命令来控制 led 灯没有感觉,那可以使用程序来控制,让程序帮我们输入这些命令,我们可以使用system 函数来完成。
    头文件:#include
    格式:system(要执行的命令)

    代码实现:
    #include
    void main(void)
    {
    system(“echo none > /sys/class/leds/sys-led/trigger”);//设置触发方式
    while(1)
    {
    system(“echo 1 > /sys/class/leds/sys-led/brightness”);//点亮 led2
    sleep(5);
    system(“echo 0 > /sys/class/leds/sys-led/brightness”);//关闭 led2
    sleep(5);
    }
    }
    我们来写一下这个程序,我们进到 samba 指定的这个路径下,我们在这个路径下创建 c 程序,名为 led.c,然后用 source insight 打开这个文件,因为这个程序非常简单,我直接复制程序,我们在进入 while 循环之前先设置了下 led 触发方式,把它设置成没有触发,这个就有点类似于 32 单片机上对管脚的初始化,也就是我们先初始化一下管脚,我们再进行管脚的操作,然后我们进入到 while 循环,我们不断的给 led2 进行置 0 置 1 ,我们把这个延迟改小一点,改成 1 秒,然后保存,如下图所示。

    打开 ubuntu,进到 samba 指定的这个路径下,我们就可以在 samba 这个路径看到 .c 文件了,如下图所示。

    然后我们把 .c 文件从 samba 指定的目录把它考到 ubuntu 的目录下,然后我们进到这个目录,如下图所示。

    我们直接使用交叉编译器编译下 led.c ,因为是在开发板上运行的,所以就不能使用 gcc 了。我们使用静态编译,这样就得到了 led 这个可执行的程序。如下图所示。

    把这个可执行文件拷贝到开发板,我们可以使用 U 盘或者 TF 卡也可以使用 NFS ,这个依据自己的习惯来就可以了,我这里使用 nfs 。进到开发板的控制终端,然后给开发板连下网,我先配置下无线密码,然后联网,因为我这里要使用 nfs, 然后我们来挂载下这个目录,然后我们把 led 这个可执行文件拷贝到 nfs共享的目录,这样就可以在开发板上看到 led 这个可执行文件了,我这里给他拷贝到开发板上,进到 opt 这个目录下,如下图所示。

    ls 看一下,如下图所示。

    我们来运行下这个可执行文件,如下图所示。

    可以看到开发板现在 led2 这个灯的状态,来执行下这个可执行文件,这个灯就是一闪一闪的了,如下图所示。

    使用 ctrl+c 打断这个程序的运行,这个灯现在已经不亮了,如下图所示。

    然后我们在运行下,这样我们就使用程序成功控制了一个灯并实现了一个闪灯的程序,其实这个程序里面的方法和我们直接使用命令的方法是一样的,只不过我们是使用 c 语言来调用我们的 shell 命令来实现,就不用再人为的输入了。
    在 led 设备的这个目录下,还有一个叫 beep 的蜂鸣器设备,蜂鸣器我们也可以使用这个方法来打开和关闭蜂鸣器,这就作为一个作业大家自己来试下,方法和点亮一个 led 灯方法是一样的,我们可以先用命令来试下,然后再用 system 调用 shell 命令用程序实现。


    更多内容:哔哩哔哩搜索北京迅为即可看更多实战内容。

  • 相关阅读:
    初探并行线程的三种写法
    Revit2017二次开发-打印机配置
    test错误记录
    自行车出租系统错误集2
    错误记录-spring+mybatis
    Windows(64位IIS)未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
    sqlDeveloper连接oracle
    Apriori算法-java
    Apriori算法-位运算-C语言
    Apriori算法-数组-C语言
  • 原文地址:https://www.cnblogs.com/liyue3/p/15233201.html
Copyright © 2020-2023  润新知