Chinaunix首页 | 论坛 | 博客
  • 博客访问: 807615
  • 博文数量: 281
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2770
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:45
个人简介

邮箱:zhuimengcanyang@163.com 痴爱嵌入式技术的蜗牛

文章分类
文章存档

2020年(1)

2018年(1)

2017年(56)

2016年(72)

2015年(151)

分类: LINUX

2017-02-20 13:14:31

1. LED模块

点亮一个 LED 灯
    本节介绍如何使用命令行或 C 程序来控制 LED 灯点亮或熄灭。开发板上的可控 LED 灯
    通常都是一端接高电平或 GND,另一端接 GPIO。通过操作 GPIO 来控制其点亮和熄灭。
    两个 LED 是由发光二极管组成,一端接高电平,另一端若接入高电平,
    则二极管不导通, LED 不会发光。另一端若接入低电平,则二极管导通, LED 发光。高低
    电平一般由 GPIO 输出。

1.1 LED 的操作接口
    LED 操作接口位于/sys/class/leds 目录下。此目录下包含了关于 LED 操作的目录,如下所示:
    root@EasyARM-iMX283 /# ls /sys/class/leds/
    beep     led-err  led-run
    其中 led-err 目录是 ERR LED 的操作接口, led-run 目录是 RUN LED 的操作接口。以
    RUN LED 为例,进入 led-run 目录,该目录的内容为:
        root@EasyARM-iMX283 /sys/class/leds# ls
        beep     led-err  led-run
        root@EasyARM-iMX283 /sys/class/leds# ls led-run/
        brightness      max_brightness  subsystem       uevent
        device          power           trigger

    各个文件作用介绍如表 1.1所示。
            表 1.1 LED 属性文件用途
        文件名                         作用
        ---------------------------------
        brightness             用于控制 LED 亮灭(需要将 LED 灯设置为用户控制)
        subsystem             符号链接,指向父目录。
        
        trigger
                            写入“ none”可以将 LED 设置为用户控制
                            写入“ heartbeat”可以将 LED 设置为心跳灯
                            写入“ mmc0”可以将 LED 设置为 TF 卡检测指示灯
                            写入“ nand-disk”可以将 LED 设置为 NAND Flash 读写指示灯
                            
        power                 设备供电方面的相关信息
    
1.2 LED 控制
    以 led_run 灯为例,点亮命令如下:
    # echo none > /sys/class/leds/led-run/trigger         #将 LED RUN 设置为用户控制
    # echo 1     > /sys/class/leds/led-run/brightness     #控制 LED 点亮
    # echo 0     > /sys/class/leds/led-run/brightness     #控制 LED 熄灭
    
1.3 在 C 程序中操作 LED
    C 程序中操作 LED,首先需要设置 trigger 属性。如下代码片段,将 LED 灯设置为用户控制方式:
    
        #define TRIGGER_NONE "none"
        int fd = open(path, O_RDWR); //path 为 trigger 路径
        ...
        ret = write(fd, TRIGGER_NONE, strlen(TRIGGER_NONE));
        ...
    
    然后操作 brightness 属性, 设置 LED 点亮或熄灭:
        char data[2];
        int fd;
        ...
        fd = open(path, O_WRONLY); //path 为 brightness 路径
        data[0] = '0';
        ret = write(fd, data, 1); //熄灭 LED
        
    下面给出的程序清单 1.1,首先设置 LED trigger 属性为“ none”,然后设置 brightness
    属交替为 0 和 1。实现了 LED 每隔 1s 点亮一次。
    

点击(此处)折叠或打开

  1. #include <stdio.h>
  2.     #include <sys/types.h>
  3.     #include <sys/stat.h>
  4.     #include <fcntl.h>
  5.     #include <string.h>
  6.     
  7.     #define TRIGGER "trigger"
  8.     #define LED_PATH "/sys/class/leds/"
  9.     #define LED_STATUS "brightness"
  10.     #define TRIGGER_NONE "none"
  11.     
  12.     int main(int argc,char **argv)
  13.     {
  14.         char path[20],data[2];
  15.         int fd, ret, flag;
  16.         if(argv[1] == NULL) {
  17.             printf("usage : ./led led-run"); // 注意:这里应该是 led-run ,而不是 led_run
  18.             return 0;
  19.         }
  20.         strcpy(path, LED_PATH);
  21.         strcat(path, argv[1]); // 追加路径"/sys/class/leds/argv[1]" = /sys/class/leds/led_run
  22.         strcat(path, "/" TRIGGER); // 追加路径 /sys/class/leds/led_run/trigger
  23.         fd = open(path, O_RDWR);
  24.         if(fd < 0) {
  25.             perror("open");
  26.             return -1;
  27.         }
  28.         // 1. 设置LED_RUN为用户控制
  29.         ret = write(fd, TRIGGER_NONE, strlen(TRIGGER_NONE));
  30.         if(ret < 0) {
  31.             perror("write");
  32.             return -1;
  33.         }
  34.         close(fd);
  35.         
  36.         // 2. 设置brightness
  37.         strcpy(path, LED_PATH);
  38.         strcat(path, argv[1]);
  39.         strcat(path, "/" LED_STATUS);
  40.         fd = open(path, O_WRONLY);
  41.         if(fd < 0) {
  42.             perror("open");
  43.             return -1;
  44.         }
  45.         
  46.         for(;;)
  47.         {
  48.             // 每一秒亮灭一次
  49.             data[0] = flag ? '0': '1';
  50.             ret = write(fd, data, 1);
  51.             if(ret < 0) {
  52.                 perror("write");
  53.                 return -1;
  54.             }
  55.             flag = !flag;
  56.             sleep(1);
  57.         }
  58.         return 0;
  59.     }


  
阅读(1304) | 评论(0) | 转发(0) |
0

上一篇:sizeof和strlen

下一篇:2nd_gpio编程

给主人留下些什么吧!~~