本章内容对应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 命令用程序实现。
更多内容:哔哩哔哩搜索北京迅为即可看更多实战内容。
|