点亮LED
创始人
2025-05-29 21:56:13
0

目录

一、LED 硬件控制方式

二、LED 应用程序

1、定义宏

2、main函数

①、打开文件

 ②、操作设备

三、测试


一、LED 硬件控制方式

        开发板底板上有一颗可被用户控制的 LED 灯,对开发板出厂系统来说, 此 LED 设备使用的是 Linux 内核标准 LED 驱动框架注册而成, 在/dev 目录下并没有其对应的设备节点,其实现使用 sysfs 方式控制。

        进入到/sys/class目录下,如下所示:

         系统中的所有设备根据其功能分类组织到了/sys/class 目录下,所以/sys/class/目录下便存放了所有的 LED 类设备。进入查看

        从上图可以看到该目录下有一个 sys-led 文件夹, 这个便是底板上的用户 LED 设备文件夹,进入到该目录下,如下所示:

         这里我们主要关注便是 brightness、 max_brightness 以及 trigger 三个文件,这三个文件都是 LED 设备的属性文件

①brightness: 翻译过来就是亮度的意思, 该属性文件可读可写;所以这个属性文件是用于设置 LED的亮度等级或者获取当前 LED 的亮度等级,譬如 brightness 等于 0 表示 LED 灭, brightness 为正整数表示 LED 亮,其值越大、 LED 越亮;

        对于 PWM 控制的 LED 来说, 这通常是适用的,因为它存在亮度等级的问题,不同的亮度等级对应不同的占空比,自然 LED 的亮度也是不同的;

        但对于 GPIO控制(控制 GPIO 输出高低电平)的 LED 来说,通常不存在亮度等级这样的说法,只有 LED 亮(brightness 等于 0)和 LED 灭(brightness 为非 0 值的正整数)两种状态,这里开发板上的这颗 LED 就是如此,所以自然就不存在亮度等级一说,只有亮和灭两种亮度等级

②max_brightness: 该属性文件只能被读取,不能写,用于获取 LED 设备的最大亮度等级

③trigger: 触发模式,该属性文件可读可写,读表示获取 LED 当前的触发模式,写表示设置 LED 的触发模式。不同的触发模式其触发条件不同, LED 设备会根据不同的触发条件自动控制其亮、灭状态。

        cat 命令查看该属性文件,可获取 LED 支持的所有触发模式以及 LED 当前被设置的触发模式

         方括号([heartbeat])括起来的表示当前 LED 对应的触发模式,这个就是心跳呼吸模式, LED 模仿人的心跳呼吸那样亮灭变化;none是无触发、 mmc0是当对 mmc0 设备发起读写操作的时候 LED 会闪烁、 timer是LED 会有规律的一亮一灭,被定时器控制住

二、LED 应用程序

1、定义宏

        既然led灯是受trigger(模式触发)文件和brightness(开关方式)文件来控制,那么在应用上面,我们就可以利用这俩个文件进行对led灯的操作,由上面分析可以知道这两个文件的路径,下面就先定义这俩个文件路径的宏,方便后续直接操作,如下

 下面再定义一个错误提示的宏函数

         宏函数名字为USAGE,内容是一个fprintf(),这是格式化输出函数,函数原型如下

int fprintf(FILE *stream, const char *format, ...);

         fprintf()函数用于将格式化数据写入到指定的文件中,使用 FILE 指针指定对应的文件,将格式化数据写入到由 FILE 指针指定的文件中,这里FILE指指向的是stderr(标准错误文件),最后格式化输出错误信息。

2、main函数

①、打开文件

        在mian函数里面,我们需要先打开这两个文件,采用可读可写的方式打开,不然要操作led灯的时候不能把想要的操作字符写到对应的文件里面去

         第一个if,如果传入的参数少于两个,就提示输入错误信息并退出

        第二、三个if,如果打开文件错误报错并退出

 ②、操作设备

         打开设备文件之后,就开操作led灯了,这里默认设定是“on”是开灯,“off”是关灯

41、46、51行,都使用了用于字符串比较的函数 strcmp(),原型如下所示

int strcmp(const char *s1, const char *s2)

s1: 进行比较的字符串 1。
s2: 进行比较的字符串 2。

返回值:
⚫ 如果返回值小于 0,则表示 str1 小于 str2
⚫ 如果返回值大于 0,则表示 str1 大于 str2
⚫ 如果返回值等于 0,则表示字符串 str1 等于字符串 str2

 使用传进来的参数比较,如果出现少于或者大于,不管正负,取反就会等于0,则不执行对应的内容,如果等于0,就说明两个字符串相等,就会执行对应的内容,执行对应内容时,先调用 write()将"none"写入到 trigger 属性文件中,也就是设置为无触发,把灯先关了,接着再向 brightness 属性文件中写入"1"点亮 LED或者“0”关闭LED

需要注意的,51行,这里判断是不是选择直接输入trigger(触发模式),因为这个需要额外多输入一个字符串设置模式的,所以需要传进三个参数

53-57行就是要判断,如果是选择了输入trigger(触发模式),就判断它是不是传进三个参数,否则报错

58-60行,经过判断确实是按要求传进了三个参数,就把第三个参数写进trigger(触发模式)文件里面

最后,如果输入的都不符合上面的条件,直接报错信息

三、测试

用交叉编译器编译文件之后发送到开发板上执行

故意输入错误试试

 可以看到就提示错误信息了

开灯,关灯,使用定时器模式闪烁

 开发板上的灯都对应执行操作来亮

相关内容

热门资讯

Altium Designer... 目录Altium Designer(AD)软件使用记录15-PCB布线部分之优化和DRC处理一、线路...
通俗易懂了解Hadoop(更新... 从本书第5、6、7、8章,学习云计算开发相关知识 这是第五章 文章目录Hadoo...
LeetCode-198. 打... 目录暴力递归动态规划 题目来源 198. 打家劫舍 暴力递归 class Solution {pub...
js学习11(客户端存储) 目录 web storage IndexDB   web storage ### 前言࿱...
target.closest妙... 首先看下MDN:Element.closest() - Web APIs | MDN ...
并发编程(一)-Thread ... 一、什么是线程线程(英语:thread)是操作系统能够进行...
小白学Pytorch系列--T... 小白学Pytorch系列–Torch API (9) Spectral Ops stft 短时傅立...
Java二叉树的前中后序遍历 Java二叉树的前中后序遍历1.前序遍历1.1前序遍历概念1.2前序遍历习题2.中序遍历2.1中序遍...
遗传算法原理及案例解析 一、遗传算法原理 遗传算法—进化算法(Genetic Algorithm GA...
朴素贝叶斯学习报告 报告 朴素贝叶斯算法描述公式:  案例计算步骤: 一个数据集中有两个样本...
算法小课堂(一)暴力枚举 、 目录 一、概念 1.1相关概念 1.2应用场景 1.3局限性 二、相关问题 2.1例题1:统计 ...
OpenHarmony之doc... Docker使用示例 docker移植至OpenHarmony的过程可参考:https...
懒人专用高并发:Actor模型 传统多线程实现方式 public class MultiThreadExample implemen...
WEB安全 HTML基础 1.简单的HTML页面架构 charset  编码 gbk gbk2...
算法基础---基础算法(二) 文章目录 高精度         高精度加法高精度减法高精度乘法高精度除法前缀和 一维前缀和二维前缀...
【Docker】镜像的原理定制... 文章目录镜像是什么UnionFS(联合文件系统)Docker镜像加载原理...
vue3常用 Composit... 二、常用 Composition API 官方文档 1.拉开序幕的setup语法糖 理解࿱...
【MySQL】实验二 简单查询 目录 1. 查询课程代号为1301的成绩不及格的成绩信息 2. SQL查询:查询employee的j...
spring启动时加载外部配置... 平常同学们使用spring搭建工程时一些应用配置信息(例如数据库的连接配置、中间件的连...
《他是谁》爆火,优酷的成功并非... 今年国产电视剧市场又进入了新一轮的爆款时代,观众在前面刚送走《三体》《狂飙》ÿ...