【STM32MP157应用编程】1.控制LED

目录

LED文件

​编辑

指令操作LED

程序操作LED

程序说明

程序代码

1_LED.c

启动交叉编译工具

编译

拷贝到开发板

测试

LED文件

在/sys/class/leds目录下存放了所有的LED类设备。

 

 sys-led对应板子上的DS0,user-led对应板子上的DS1。

 

       brightness:是亮度的意思,该属性文件可读可写;这个属性文件是用于设置LED的亮度等级或者获取当前LED的亮度等级,譬如brightness等于0表示LED灭,brightness为正整数表示LED亮,其值越大、LED越亮;对于PWM控制的LED来说,这通常是适用的,因为它存在亮度等级的问题,不同的亮度等级对应不同的占空比,自然LED的亮度也是不同的。

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

       trigger:触发模式,该属性文件可读可写,读表示获取LED当前的触发模式,写表示设置LED的触发模式。不同的触发模式其触发条件不同,LED设备会根据不同的触发条件自动控制其亮、灭状态,通过cat命令查看该属性文件,可获取LED支持的所有触发模式以及LED当前被设置的触发模式。

 常用的触发模式:

none无触发。
mmc0当对mmc0设备发起读写操作的时候LED会闪烁。
timerLED会有规律的一亮一灭,被定时器控制住。
heartbeat心跳呼吸模式,LED模仿人的心跳呼吸那样亮灭变化。

指令操作LED

将LED触发模式设置为timer。

echo timer > trigger

 

 将LED触发模式设置为none。

echo none > trigger

 

 点亮LED。

echo 1 > brightness

 

 熄灭LED。

echo 0 > brightness

程序操作LED

程序说明

./可执行文件名 参数1 参数2

参数1:LED的选择。

        SysLED:DS0LED。

        UserLED:DS1LED。

参数2:LED的亮灭。

        liang:LED亮。

        mie:LED灭。

./可执行文件名 参数1 --ChuFaMoShi 参数2

参数1:LED的选择。

        SysLED:DS0LED。

        UserLED:DS1LED。

--ChuFaMoShi:触发模式。

参数2:常用的触发模式。

程序代码

1_LED.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define USER_LED_TRIGGER "/sys/class/leds/user-led/trigger"
#define USER_LED_BRIGHTNESS "/sys/class/leds/user-led/brightness"
#define SYS_LED_TRIGGER "/sys/class/leds/sys-led/trigger"
#define SYS_LED_BRIGHTNESS "/sys/class/leds/sys-led/brightness"
#define USAGE() fprintf(stderr, "usage:\n"                \
                                " %s <on|off>\n"          \
                                " %s <trigger> <type>\n", \
                        argv[0], argv[0])
int main(int argc, char *argv[])
{
    int UserLED_fd1, UserLED_fd2, SysLED_fd1, SysLED_fd2;

    /* 校验传参 */
    if (2 > argc)
    {
        USAGE();
        exit(-1);
    }

    /* 打开文件 */
    UserLED_fd1 = open(USER_LED_TRIGGER, O_RDWR);
    if (0 > UserLED_fd1)
    {
        perror("open error");
        exit(-1);
    }
    UserLED_fd2 = open(USER_LED_BRIGHTNESS, O_RDWR);
    if (0 > UserLED_fd2)
    {
        perror("open error");
        exit(-1);
    }
    SysLED_fd1 = open(SYS_LED_TRIGGER, O_RDWR);
    if (0 > SysLED_fd1)
    {
        perror("open error");
        exit(-1);
    }
    SysLED_fd2 = open(SYS_LED_BRIGHTNESS, O_RDWR);
    if (0 > SysLED_fd2)
    {
        perror("open error");
        exit(-1);
    }

    /* 根据传参控制 LED */
    if (!strcmp(argv[1], "SysLED"))
    {
        if (!strcmp(argv[2], "liang"))
        {
            write(SysLED_fd1, "none", 4); //先将触发模式设置为 none
            write(SysLED_fd2, "1", 1);    //点亮 LED
        }
        else if (!strcmp(argv[2], "mie"))
        {
            write(SysLED_fd1, "none", 4); //先将触发模式设置为 none
            write(SysLED_fd2, "0", 1);    //熄灭 LED
        }
        else if (!strcmp(argv[2], "--ChuFaMoShi"))
        {
            if (argc != 4)
            {
                USAGE();
                exit(-1);
            }
            if(write(SysLED_fd1, argv[3], strlen(argv[3]))<0){
                perror("xie error");
                exit(-1);
            }
        }
        else
        {
            USAGE();
        }
    }
    else if(!strcmp(argv[1], "UserLED")){
        if (!strcmp(argv[2], "liang"))
        {
            write(UserLED_fd1, "none", 4); //先将触发模式设置为 none
            write(UserLED_fd2, "1", 1);    //点亮 LED
        }
        else if (!strcmp(argv[2], "mie"))
        {
            write(UserLED_fd1, "none", 4); //先将触发模式设置为 none
            write(UserLED_fd2, "0", 1);    //熄灭 LED
        }
        else if (!strcmp(argv[2], "--ChuFaMoShi"))
        {
            if (argc != 4)
            {
                USAGE();
                exit(-1);
            }
            if (write(UserLED_fd1, argv[3], strlen(argv[3])) < 0)
            {
                perror("xie error");
                exit(-1);
            }
        }
        else
        {
            USAGE();
        }
    }
    else{
        USAGE();
    }
    return 0;
}

启动交叉编译工具

source /opt/st/stm32mp1/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

编译

${CC} -o 1_LED 1_LED.c

拷贝到开发板

scp 1_LED root@10.3.22.219:/home/root/Linux_C_YingYong_BianCheng/JiaoCheng/1_LED/

 

测试

点亮DS0。

./1_LED SysLED liang

 

 熄灭DS1。

./1_LED UserLED mie

 

 将DS0触发模式设置为heartbeat。

./1_LED SysLED --ChuFaMoShi heartbeat

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

因心,三人水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值