[STM32MP2] 【STM32MP257学习笔记】4.控制LED

[复制链接]
342|0
yuyy1989 发表于 2025-9-12 22:16 | 显示全部楼层 |阅读模式
在 Linux 系统中,绝大多数硬件设备都有非常成熟的驱动框架,对于LED设备,Linux提供了LED子系统驱动框架,使用了 LED 子系统驱动的设备,会被展现在/sys/class/leds 目录下,可在主机和开发板使用如下命令查看,命令的输出可能会因为硬件环境不同而不一样:
  1. ls /sys/class/leds/
屏幕截图 2025-09-10 212913.png
可以看到这个板子上有个蓝色的心跳指示灯,这是个指向/sys/devices/platform/gpio-leds/leds/blue:heartbeat的链接,进入到blue:heartbeat看看里面都有什么
屏幕截图 2025-09-10 213712.png
max_brightness 文件:表示 LED 灯的最大亮度值。
屏幕截图 2025-09-10 213937.png
brightness 文件:表示当前 LED 灯的亮度值,它的可取值范围为 [0~max_brightness],一些LED 设备不支持多级亮度,直接以非 0 值来表示 LED 为点亮状态, 0 值表示灭状态。
trigger 文件:指示了 LED 灯的触发方式,查看该文件的内容时,该文件会列出它的所有可用触方式,而当前使用的触发方式会以“[]”符号括起。
屏幕截图 2025-09-10 214033.png
常见的触发方式如下表所示
none 无触发方式
disk-activity 硬盘活动
nand-disk nand flash 活动
mtd mtd 设备活动
timer 定时器
heartbeat 系统心跳

在终端中可以用下面的命令直接控制LED
  1. echo none > trigger //切换为无触发方式
  2. echo 1 > brightness //打开LED
  3. echo 0 > brightness //关闭LED
屏幕截图 2025-09-10 214405.png
接下来实现编程控制LED
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <errno.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <stdlib.h>

  9. #define LED_PATH_BRI "/sys/class/leds/blue:heartbeat/brightness"
  10. #define LED_PATH_TRI "/sys/class/leds/blue:heartbeat/trigger"
  11. //ledtest 0
  12. //ledtest 1
  13. //ledtest 2 heartbeat
  14. int main(int argc,char **argv)
  15. {
  16.     int fd;
  17.     if(argc < 2)
  18.     {
  19.         printf("need led commmand 0:close 1:open 2:trigger \n");
  20.         return -1;
  21.     }
  22.     if(strlen(argv[1]) == 1)
  23.     {
  24.         if(argv[1][0] == '0' || argv[1][0] == '1')
  25.         {
  26.             fd = open(LED_PATH_BRI,O_RDWR);
  27.             write(fd,argv[1],1);
  28.         }
  29.         else if(argv[1][0] == '2')
  30.         {
  31.             if(argc < 3)
  32.             {
  33.                 printf("need trigger \n");
  34.                 return -1;
  35.             }
  36.             fd = open(LED_PATH_TRI,O_RDWR);
  37.             write(fd,argv[2],strlen(argv[2]));
  38.         }
  39.         else
  40.         {
  41.             printf("led commmand error 0:close 1:open 2:trigger \n");
  42.             return -1;
  43.         }
  44.     }
  45.     else
  46.     {
  47.         printf("led commmand error 0:close 1:open 2:trigger \n");
  48.         return -1;
  49.     }
  50.     close(fd);
  51.     return 0;
  52. }
编译后上传到开发板执行以下命令
  1. ./ledtest 1 //打开LED
  2. ./ledtest 0 //关闭LED
  3. ./ledtest 2 heartbeat //修改LED触发方式为系统心跳
效果如下
video_20250910_221542 00_00_00-00_00_30.gif
接下来做个有UI的,通过按钮切换LED状态
  1. #include <gtk/gtk.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. #include <stdlib.h>

  10. #define LED_PATH_BRI "/sys/class/leds/blue:heartbeat/brightness"
  11. #define LED_PATH_TRI "/sys/class/leds/blue:heartbeat/trigger"

  12. static void led_ctrl(uint8_t cmd,char *trigger)
  13. {
  14.     int fd;
  15.     if(cmd < 3)
  16.     {
  17.         if(cmd < 2)
  18.         {
  19.             fd = open(LED_PATH_BRI,O_RDWR);
  20.             write(fd,cmd==0?"0":"1",1);
  21.         }
  22.         else
  23.         {
  24.             if(strlen(trigger) < 1)
  25.             {
  26.                 g_print("need trigger \n");
  27.                 return ;
  28.             }
  29.             fd = open(LED_PATH_TRI,O_RDWR);
  30.             write(fd,trigger,strlen(trigger));
  31.         }
  32.     }
  33.     else
  34.     {
  35.         g_print("led commmand error 0:close 1:open 2:trigger \n");
  36.         return -1;
  37.     }
  38.     close(fd);
  39. }

  40. static void gw_led_off(GtkWidget *widget,gpointer data)
  41. {
  42.     led_ctrl(0,NULL);
  43. }

  44. static void gw_led_on(GtkWidget *widget,gpointer data)
  45. {
  46.     led_ctrl(1,NULL);
  47. }

  48. static void gw_led_trigger_heartbeat(GtkWidget *widget,gpointer data)
  49. {
  50.     led_ctrl(2,"heartbeat");
  51. }

  52. static void gw_led_trigger_none(GtkWidget *widget,gpointer data)
  53. {
  54.     led_ctrl(2,"none");
  55. }

  56. static void  activate (GtkApplication *app,gpointer user_data)
  57. {
  58.     GtkWidget *window;
  59.     GtkWidget *button0;
  60.     GtkWidget *button1;
  61.     GtkWidget *button2;
  62.     GtkWidget *button3;
  63.     GtkWidget *button_box;

  64.     window = gtk_application_window_new (app);
  65.     gtk_window_set_title (GTK_WINDOW (window), "LED Test");
  66.     gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  67.     button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
  68.     gtk_container_add (GTK_CONTAINER (window), button_box);

  69.     button0 = gtk_button_new_with_label ("LED Off");
  70.     g_signal_connect (button0, "clicked", G_CALLBACK (gw_led_off), NULL);
  71.     gtk_container_add (GTK_CONTAINER (button_box), button0);

  72.     button1 = gtk_button_new_with_label ("LED On");
  73.     g_signal_connect (button1, "clicked", G_CALLBACK (gw_led_on), NULL);
  74.     gtk_container_add (GTK_CONTAINER (button_box), button1);

  75.     button2 = gtk_button_new_with_label ("heartbeat");
  76.     g_signal_connect (button2, "clicked", G_CALLBACK (gw_led_trigger_heartbeat), NULL);
  77.     gtk_container_add (GTK_CONTAINER (button_box), button2);

  78.     button3 = gtk_button_new_with_label ("trigger none");
  79.     g_signal_connect (button3, "clicked", G_CALLBACK (gw_led_trigger_none), NULL);
  80.     gtk_container_add (GTK_CONTAINER (button_box), button3);

  81.     gtk_widget_show_all (window);
  82. }

  83. int main (int argc, char **argv)
  84. {
  85.     GtkApplication *app;
  86.     int status;

  87.     app = gtk_application_new ("org.gtk.ledtest", G_APPLICATION_DEFAULT_FLAGS);
  88.     g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  89.     status = g_application_run (G_APPLICATION (app), argc, argv);
  90.     g_object_unref (app);

  91.     return status;
  92. }
运行效果
video_20250911_211748 00_00_00-00_00_30.gif

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

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

168

主题

826

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部