zl程序教程

您现在的位置是:首页 >  系统

当前栏目

十、Linux开发板控制LED灯设备

Linux设备控制 开发板 LED
2023-09-11 14:20:47 时间

控制LED灯设备

驱动程序

本质:为硬件设备创建相应的设备节点文件

创建设备文件时,规定好设备文件的使用方式。

应用程序

根据驱动程序规定的设备文件使用方式去控制硬件

控制硬件设备步骤

1、找出硬件设备所对应的设备节点文件

两个地方:

  • /dev目录下

    对驱动程序熟悉的工程师可以使用,一个设备节点文件控制硬件全部特性

  • /sys目录下

    业余工程师使用,一个设备节点文件只控制硬件的一个特性

    严格来说,它下面的文件是Linux内核导出到用户空间的硬件操作接口

2、找出驱动程序规定的设备文件使用方式

LED灯程序

设备节点文件:/sys/class/leds

往brightness文件写入一个数值,就能控制led灯的亮度

led亮度值:0~255

LED应用程序搭建步骤

1. 先将一个part_1复制到NFS服务器的共享文件夹中

sudo cp -r makefile/part_1 workdir

2. 然后查看Linux本地挂载目录,成功读取到

在这里插入图片描述

3. 找到LED设备的文件路径

在这里插入图片描述

4. 接下来在Ubuntu上编写代码

先创建好工程文件目录

在共享文件夹中创建part_1作为工程目录,添加头文件目录,源文件目录,Makefile文件。如下:
在这里插入图片描述
在module1中编写main.c文件

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

//ARM开发板LED设备的路径
#define RLED_DEV_PATH "/sys/class/leds/red/brightness"
#define GLED_DEV_PATH "/sys/class/leds/green/brightness"
#define BLED_DEV_PATH "/sys/class/leds/blue/brightness"

int main(int argc, char *argv[])
{
    int res = 0;
    int r_fd, g_fd, b_fd;
    printf("This is the led demon\r\n");
    //获取红灯的设备文件描述符
    r_fd = open(RLED_DEV_PATH, O_WRONLY);
    if(r_fd < 0)
    {
        printf("Fail to open %s device\r\n", RLED_DEV_PATH);
    }
    //获取绿灯的设备文件描述符
    g_fd = open(GLED_DEV_PATH, O_WRONLY);
    if(g_fd < 0)
    {
        printf("Fail to open %s device\r\n", GLED_DEV_PATH);
    }
    //获取蓝灯的设备文件描述符
    b_fd = open(BLED_DEV_PATH, O_WRONLY);
    if(b_fd < 0)
    {
        printf("Fail to open %s device\r\n", BLED_DEV_PATH);
    }
 	while (1)
    {
        //红灯
        write(r_fd, "255", 3);
        sleep(1);
        write(r_fd, "0", 1);
		//绿灯
        write(g_fd, "255", 3);
        sleep(1);
        write(g_fd, "0", 1);
		//蓝灯
        write(b_fd, "255", 3);
        sleep(1);
        write(b_fd, "0", 1);
    }
}

再编写Makefile文件,这里用之前的加以修改

ARCH ?= x86

ifeq ($(ARCH),x86)
        CC=gcc
else
		#在开发板上编译
        CC=arm-linux-gnueabihf-gcc
endif
#程序名改为led
TARGET=led

#编译路径
BUILD_DIR=build
#源文件路径
SRC_DIR=module1
#头文件路径
INC_DIR=include

CFLAGS=$(patsubst %,-I%,$(INC_DIR))
INCLUDES=$(foreach dir,$(INC_DIR),$(wildcard $(dir)/*.h))

SOURCES=$(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))
OBJS=$(patsubst %.c,$(BUILD_DIR)/%.o,$(notdir $(SOURCES)))

#让make在当前目录找不到的情况下,到所指定的目录中去找寻文件
VPATH=$(SRC_DIR)

$(BUILD_DIR)/$(TARGET):$(OBJS)
        $(CC) $^ -o $@

$(BUILD_DIR)/%.o:%.c $(INCLUDES) | creat_build
        $(CC) -c $< -o $@ $(CFLAGS)

.PHONY:clean create_build

clean:
        sudo rm -r $(BUILD_DIR)

creat_build:
        sudo mkdir -p $(BUILD_DIR)

5. 在MobaX上,将存放在本地挂载目录中的part_1工程复制到开发板的 /home/user 目录下,进行编译。在开发板里面编译程序之前,需要提前安装gcc和make工具。

sudo apt install gcc/make

6. 在编译后执行程序时出现了如下错误,表示无法打开设备文件

在这里插入图片描述

7. 这里一般要给root权限才能正常打开设备文件,如下所示:

在这里插入图片描述

8. 之后便可以正常执行,led灯三种颜色交替闪烁。