MX6LL|GPIO子系统实战

2023年 9月 26日 37.8k 0

一.什么是GPIO子系统

GPIO(General Purpose Input/Output)子系统是嵌入式系统中的一个重要组件。它是操作系统内核提供的一个软件接口,用于控制和管理硬件上的通用输入输出引脚。

GPIO子系统允许开发人员通过软件控制和配置硬件的输入和输出引脚。每个GPIO引脚可以用作输入或输出,可以用于读取外部设备的输入信号(例如按钮、传感器等)或控制外部设备的输出信号(例如LED、继电器等)。

GPIO子系统通常提供以下功能:

  • 配置引脚的工作模式:将引脚设置为输入模式或输出模式。
  • 读取输入引脚状态:读取输入引脚的电平状态,以检测按钮按下或传感器信号。
  • 控制输出引脚状态:设置输出引脚的电平状态,以控制LED亮灭或控制外部设备。
  • 中断处理:可以使用中断来监听引脚状态的变化,当引脚状态发生变化时触发相应的中断处理函数。
  • 不同的操作系统和开发环境可能会提供不同的GPIO子系统接口和函数库。例如,在Linux系统中,可以使用sysfs文件系统或GPIO字符设备接口来访问和控制GPIO引脚。而在嵌入式开发中,可能需要使用特定的硬件抽象层(HAL)或驱动程序来操作GPIO引脚。
    通过GPIO子系统,开发人员可以在嵌入式系统中灵活地使用和控制硬件上的通用输入输出引脚,实现各种应用和功能。

    二.demo

    beep.c

    #include 
    #include 
    #include 
    #include 
    #include 
    
    int beep_init(void)
    {
        //1.产生19引脚文件
        int fd;
        fd = open("/sys/class/gpio/export", O_WRONLY);
        if (fd < 0)
            return 1;
        write(fd, BEEP_CPIO_INDX, strlen(BEEP_CPIO_INDX));
        close(fd);
    
        //2.设置为输出模式
        char buf[128]={0};
        sprintf(buf,"/sys/class/gpio/gpio%s/direction", BEEP_CPIO_INDX);
        fd = open(buf, O_WRONLY);
        if (fd < 0)
            return 2;
        write(fd, "out", strlen("out"));
        close(fd);
        return 0;
    }
    
    int beep_deinit(void)
    {
        int fd;
        fd = open("/sys/class/gpio/unexport", O_WRONLY);
        if (fd < 0)
            return 1;
        write(fd, BEEP_CPIO_INDX, strlen(BEEP_CPIO_INDX));
        close(fd);
        return 0;
    }
    
    int beep_on(void)
    {
        int fd;
        char buf[128]={0};
        sprintf(buf,"/sys/class/gpio/gpio%s/value", BEEP_CPIO_INDX);
        fd = open(buf, O_WRONLY);
        if (fd < 0)
            return 1;
        write(fd, "1", 1);
        close(fd);
        return 0;
    }
    
    int beep_off(void)
    {
        int fd;
        char buf[128]={0};
        sprintf(buf,"/sys/class/gpio/gpio%s/value", BEEP_CPIO_INDX);
        fd = open(buf, O_WRONLY);
        if (fd < 0)
            return 1;
        write(fd, "0", 1);
        close(fd);
        return 0;
    }
    
    

    main.c

    #include 
    #include 
    #include 
    
    int main(int argc, char const *argv[])
    {
     
        char buf[10] = {0};
        int res;
        printf("This is the beep demo\n");
        res = beep_init();
        if (res)
        {
            printf("beet init error,code = %d\n", res);
            return 0;
        }
    
        while (1)
        {
            printf("Please input the value :0--off 1--on q--exir\n");
            scanf("%10s", buf);
            switch (buf[0])
            {
            case '0':
                beep_off();
                break;
            case '1':
                beep_on();
                break;
            case 'q':
                beep_deinit();
                break;
            default:
                break;
            }
        }
    
        return 0;
    }
    
    

    include.h

    #ifndef _BSP_BEEP_H
    #define _BSP_BEEP_H
    #include 
    //DPIO引脚号
    //imx6ll计算方式,GPIOn_IOx
    //(n-1)*32+x
    
    #define BEEP_CPIO_INDX "19"
    extern int beep_init(void);
    extern int beep_deinit(void);
    extern int beep_on(void);
    extern int beep_off(void);
    
    
    #endif
    

    Makefile

    ARCH ?= x86

    ifneq ($(ARCH),x86)
    CC=gcc
    else
    CC=arm-linux-gnueabihf-gcc
    endif

    #TARGET 目标生成文件
    TARGET=beep

    #生成目录
    BUILD_DIR=build

    #存放.c的目录
    SRC_DIR=beepc

    #存放所有的.c文件,包含路径
    SOURCES=$(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))

    #存放所有的.o文件
    OBJS=$(patsubst %.c,$(BUILD_DIR)/%.o,$(notdir $(SOURCES)))

    #定义额外的搜索路径
    VPATH=$(SRC_DIR)

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

    $(BUILD_DIR)/%.o:%.c | create_build
    $(CC) -c $

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论