当前位置: 首页 > news >正文

立创泰山派linux------(led流水灯)

1、触发器使得LED闪烁

有些开发板的 LED 会硬件层面被配置成呼吸灯或心跳灯,通过 PWM 或定时器直接驱动 GPIO,不需要任何用户程序。即使你kill掉所有进程,它还是会闪。

你可以查看 LED 的触发器状态:

bash

cat /sys/class/leds/rgb-led-r/trigger cat /sys/class/leds/rgb-led-g/trigger cat /sys/class/leds/rgb-led-b/trigger

如果输出里有heartbeattimer,说明 LED 被内核的 LED 触发器控制着,所以一直在闪烁。

root@RK356X:/# cat /sys/class/leds/rgb-led-r/trigger none rfkill-any rfkill-none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock mmc2 mmc0 [timer] rfkill0 mmc1 rfkill1 rfkill2

2、内核已经注册好了 LED 设备,可以直接操作。

当你执行ls /sys/class/leds/看到下面这行时:

rgb-led-b rgb-led-g rgb-led-r

就代表内核已经成功注册了 LED 设备。它干了三件事:

  1. 识别了硬件:内核知道 GPIO 40、41、42 这三个引脚上接着 LED。

  2. 创建了标准接口:在/sys/class/leds/下为你创建了三个“控制面板”(目录),里面包含brightnesstrigger等文件。

  3. 提供了操作方法:你往这些文件里写10,内核驱动就会自动去翻转 GPIO 引脚的电平,点亮或熄灭 LED。

你完全不需要关心 GPIO 编号是怎么计算的(比如 GPIO1_B0 对应 40),也不需要用echo 40 > export手动去申请这个引脚——因为内核已经帮你把这一切都做好了。


🆚 对比一下“没注册”是什么感觉

如果你把 LED 接在一个内核不认识的 GPIO 引脚上(比如某个空闲的引脚),那就没有注册这回事。你需要做的流程是:

  1. echo 100 > /sys/class/gpio/export手动申请。

  2. echo out > direction设置方向。

  3. 再用echo 1 > value控制电平。

而现在因为内核“注册”了它,前两步都给你省了,直接跳到第三步,甚至能用nonetimer这种高级模式。

分别实现点亮和关闭led的命令:

可以看到led返回值:

3、实现led交通闪烁:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define LED_RED "/sys/class/leds/rgb-led-r" #define LED_GREEN "/sys/class/leds/rgb-led-g" #define LED_BLUE "/sys/class/leds/rgb-led-b" void disable_trigger(const char *led_path); void set_led(const char *led_path, int on); void write_file(const char *path, const char *value); int main(void) { int i; const char *leds[] = {LED_RED, LED_GREEN, LED_BLUE}; const char *colors[] = {"红色", "绿色", "蓝色"}; printf("RGB LED 流水灯启动!按 Ctrl+C 停止。\n"); // 先禁用所有 LED 的触发器,停止闪烁 for (i = 0; i < 3; i++) { disable_trigger(leds[i]); set_led(leds[i], 0); // 先全部熄灭 } while (1) { for (i = 0; i < 3; i++) { // 点亮当前 LED set_led(leds[i], 1); printf("点亮 %s LED\n", colors[i]); // 熄灭其他两个 LED int j; for (j = 0; j < 3; j++) { if (j != i) { set_led(leds[j], 0); } } usleep(500000); // 延时 500ms } } return 0; } // 设置 LED 触发器为 none(停止自动闪烁) void disable_trigger(const char *led_path) { char path[256]; snprintf(path, sizeof(path), "%s/trigger", led_path); write_file(path, "none"); } // 设置 LED 亮灭 void set_led(const char *led_path, int on) { char path[256]; snprintf(path, sizeof(path), "%s/brightness", led_path); write_file(path, on ? "1" : "0"); } // 写入文件函数 void write_file(const char *path, const char *value) { FILE *fp = fopen(path, "w"); if (fp == NULL) { perror("fopen"); return; } fprintf(fp, "%s", value); fclose(fp); }

http://www.jsqmd.com/news/1292907/

相关文章:

  • 雨花业主必看!2026长沙本地化防水,告别反复渗漏/漏水 - 吉林同城获客
  • 2026 青岛崂山包包回收盘点:爆款包保值率高,旧包出手干货整理 - 奢侈品回收探店ing
  • Qt QMessageBox、QDialogButtonBox中英文翻译动态切换
  • 2026中小服装品牌找羽绒服代工厂:哈哈贝尔实力口碑解析 - 汇聚至此
  • 同一条物料三个系统三种叫法:跨系统数据关联怎么打通
  • 系统设计概述
  • 程序员感觉工作没有成长,怎么破局?
  • 2026推荐靠谱的淮安装修公司 3类需求对应选择 - 博客万
  • Kruskal算法详解:从最小生成树到并查集优化
  • 大坝和边坡,为什么有了监测还是出事?——水利数字孪生如何填平四个坑
  • 【厦门市】2026CPPM采购经理报考指南|正规机构甄选产业适配全攻略 - 中采供培
  • 淤泥层钻孔桩土工布袋作用及主流品牌选型指南 - 博客万
  • 2026嘉兴下水道堵塞最全解决方法/马桶地漏反水反臭积水倒灌专业修缮指南 - 宅安选房屋修缮
  • Go语言反射与并发编程深度解析:从原理到实战应用
  • XUnity.AutoTranslator:打破语言障碍,让Unity游戏瞬间本地化
  • Blender MMD Tools终极安装指南:解决所有兼容性问题快速上手
  • Unity渲染深度调试实战:RenderDoc核心原理与GPU疑难杂症精准定位
  • 红黑树原理与STL map/set实现详解
  • 源城区业主必看!2026宅仕达本地化防水,告别反复渗漏/漏水 - 吉林同城获客
  • “面试造飞机,上岗拧螺丝“?软件测试岗面试真题超全面整理
  • FPGA设计实战:从需求分析到调试的四大核心权衡点
  • 2026年浙江地区想找缠绕膜源头厂家有哪些参考方向 - 起跑123
  • 2026国标铸铝门头部制造企业,金诗盾工程集采经销商合作实力全解析 - 行业分析师
  • 动画制作技术解析:从骨骼绑定到实时渲染的工程实践
  • Dell服务器iDRAC配置全攻略:从网络规划到安全加固与自动化运维
  • 探索BetterJoy:让Switch手柄在PC上焕发新生的完整解决方案
  • 为什么大批传统囤货卖家转型抖音小店,纷纷转向轻资产一件代发模式真实原因 - 抖掌柜
  • 2026年恒温恒湿试验箱供应厂家:步入式/可程式/高低温湿热试验箱品牌实力甄选 - 优企名品
  • 城区业主必看!2026宅仕达本地化防水,告别反复渗漏/漏水 - 吉林同城获客
  • 2026年,成都那周到的高度近视眼镜究竟有啥特别之处? - 企业推荐官