学习开发板的第一步,必然是先点灯(当然,你也可以点亮一个电阻,点亮一个u,至于没人说你,除了钱包)

点灯前,我们要做好

配置开发环境——需要从幸狐的网上下好交叉编译工具

写入一个系统——需要从幸狐的网上下好系统并写入,本次使用buildroot

首先,我们在开发环境创建个文件ledlearn.c

然后文件如下

代码结构

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

头文件

  • stdio.h: 标准输入输出函数
  • stdlib.h: 标准库函数
  • unistd.h: 提供sleep等系统调用

主函数

int main() {
    int gpio_pin;
  
    // 获取用户输入的GPIO引脚号
    printf("Please enter the GPIO pin number: ");
    scanf("%d", &gpio_pin);

这个我不必多做解释了

1. 导出GPIO引脚

    // 打开GPIO导出文件
    FILE *export_file = fopen("/sys/class/gpio/export", "w");
    if (export_file == NULL) {
        perror("Failed to open GPIO export file");
        return -1;
    }
    // 写入要导出的GPIO引脚号
    fprintf(export_file, "%d", gpio_pin);
    fclose(export_file);

这个是导出引脚,是为了能让引脚可用

然后就是我们要用哪个引脚

幸狐给了个公式,可以为我们计算引脚号

GPIO 引脚编号计算公式:pin = bank * 32 + number GPIO 组内编号计算公式:number = group * 8 + X 综上:pin = bank * 32 + (group * 8 + X)

当然,你懒得计算,下面的图你直接用,浅蓝色的数字就是引脚号

既然有了图,我们直接说吧

这里的gpio分组,很像stm32的方式,虽然有所差别,但是不像stm32标准库配置那样的配置方法

写完了记得解除占用,以免后续报错

2. 设置GPIO方向为输出

    // 构造方向文件路径
    char direction_path[50];
    snprintf(direction_path, sizeof(direction_path), 
             "/sys/class/gpio/gpio%d/direction", gpio_pin);
  
    // 打开方向文件
    FILE *direction_file = fopen(direction_path, "w");
    if (direction_file == NULL) {
        perror("Failed to open GPIO direction file");
        return -1;
    }
    // 设置为输出模式
    fprintf(direction_file, "out");
    fclose(direction_file);

这里的就是配置是输入还是输出,这里的点亮LED肯定是输出

写入输出输入很简单,写入的时候就写out/in

3. 控制GPIO引脚电平

    // 构造值文件路径和cat命令
    char value_path[50];
    char cat_command[100];
    snprintf(value_path, sizeof(value_path), 
             "/sys/class/gpio/gpio%d/value", gpio_pin);
    snprintf(cat_command, sizeof(cat_command), "cat %s", value_path);
  
    // 打开值文件
    FILE *value_file = fopen(value_path, "w");
    if (value_file == NULL) {
        perror("Failed to open GPIO value file");
        return -1;
    } 

    // 循环3次,每次设置高电平1秒,低电平1秒
    for (int i = 0; i < 3; i++) {
        // 设置高电平
        fprintf(value_file, "1");
        fflush(value_file);
        system(cat_command);  // 显示当前值
        sleep(1);

        // 设置低电平
        fprintf(value_file, "0");
        fflush(value_file);
        system(cat_command);  // 显示当前值
        sleep(1);
    }

    fclose(value_file);

这里一看就是设置高低电平的

fprintf(value\_file, "1");就是设置高电平的,但要想让电平设置立刻有效,必须fflush(value\_file);

4. 取消导出GPIO引脚

    // 打开取消导出文件
    FILE *unexport_file = fopen("/sys/class/gpio/unexport", "w");
    if (unexport_file == NULL) {
        perror("Failed to open GPIO unexport file");
        return -1;
    }
    // 写入要取消导出的GPIO引脚号
    fprintf(unexport_file, "%d", gpio_pin);
    fclose(unexport_file);

    return 0;
}

用完一定要取消导出哦

工作流程

  1. 获取用户输入的GPIO引脚号
  2. 导出该GPIO引脚(使其在用户空间可用)
  3. 设置GPIO方向为输出
  4. 循环3次:

    • 设置GPIO为高电平(1)
    • 显示当前值
    • 等待1秒
    • 设置GPIO为低电平(0)
    • 显示当前值
    • 等待1秒
  5. 取消导出GPIO引脚(释放资源)

你会看到灯会闪烁的

如果灯还没有闪烁,可能是接的位置不对,数接口要把usb接口朝上开始数的

源码

https://cdn.mitsuha.top/usr/picgoledlearn.c

最后修改:2025 年 12 月 19 日
如果觉得我的文章对你有用,请随意赞赏