Skip to content

概念先知道

  • GPIO:芯片的“可编程引脚”,可以配置成输出(像开关,主动输出高/低电平)或输入(像探针,读取外部电平)。
  • 推挽输出:既能输出高电平(3.3V)又能输出低电平(0V)的输出方式,点亮 LED 用它最合适。
  • 高电平有效:本教程板载 RGB 灯是“高电平点亮”——引脚输出高电平时灯亮、低电平时灯灭。
  • 限流电阻:LED 本身电阻很小,直接接 3.3V 会烧坏;串一个 220Ω~1kΩ 电阻把电流限制在安全范围。

例程功能简介

本页对应博流官方 SDK 的 gpio_input_output 例程(examples/peripherals/gpio/gpio_input_output),演示 GPIO 最基本的输出输入功能:

  • IO12(红)/ IO14(绿)/ IO15(蓝) 配置为推挽输出(Ai-M61-32S-Kit / Ai-M62-32S-Kit 板载 RGB 灯,高电平点亮),循环点亮红、绿、蓝三色,每色 1 秒;
  • 同族例程examples/peripherals/gpio/):gpio_interrupt(外部中断)、gpio_output_with_input(输出与输入联动)、gpio_validation_cli(命令行验证)。

本页聚焦 GPIO 输出(点亮 LED);GPIO 输入(按键检测)见 GPIO输入(按键检测)

操作步骤

1
硬件准备

Ai-M61-32S-Kit 与 Ai-M62-32S-Kit 板载 RGB 灯:红灯接 IO12、绿灯接 IO14、蓝灯接 IO15,高电平点亮。本教程直接观察板载 RGB 灯即可,无需外接 LED。

2
进入例程目录

在终端进入 SDK 的 GPIO 例程目录(前提:已按快速开始(Linux)Windows搭建好环境):

cd examples/peripherals/gpio/gpio_input_output
3
修改例程输出引脚

例程默认用 GPIO_PIN_0 做输出,需要改成板载 RGB 灯的引脚。例如点亮红灯,把 bflb_gpio_initbflb_gpio_setbflb_gpio_reset 中的 GPIO_PIN_0 全部改成 GPIO_PIN_12;也可以同时初始化 GPIO_PIN_12/14/15 三个引脚,循环点亮红、绿、蓝三种颜色。

4
编译工程

执行编译命令。Ai-M62(BL616)与 Ai-M61(BL618)同属一个系列,统一填写引脚最少的 bl616 即可:

make CHIP=bl616 BOARD=bl616dk
5
烧录固件

用 USB 线连接开发板,按住 BOOT 键(Ai-M61-32S-Kit 为 IO2)不放、短按 EN/RST 进入下载模式,然后执行烧录(把串口号换成你电脑上的实际值):

make flash CHIP=bl616 COMX=/dev/ttyUSB0
6
运行验证

烧录完成后按一下复位键,打开串口助手(波特率 2000000)。例程让红、绿、蓝三色按 1 秒节奏循环点亮:红灯(IO12)→ 绿灯(IO14)→ 蓝灯(IO15),均为高电平点亮。

代码执行流程

例程从启动到运行的完整流程如下(图中的循环箭头表示反复执行):

例程调用的 API 介绍

bflb_device_get_by_name("gpio")

获取 GPIO 外设的设备句柄,后续所有 GPIO 操作都要通过该句柄进行。

参数

  • name:外设名称字符串,GPIO 固定传 "gpio"

返回值struct bflb_device_s * 设备句柄

bflb_gpio_init(gpio, pin, mode)

把指定引脚配置为输出或输入模式。

参数

  • gpio:GPIO 设备句柄
  • pin:引脚号,如 GPIO_PIN_0(GPIO0)
  • mode:模式组合,常用 GPIO_OUTPUT(推挽输出)、GPIO_INPUT(输入),可叠加 GPIO_PULLUP(内部上拉)、GPIO_SMT_EN(施密特触发)、GPIO_DRV_0(驱动强度)

返回值:成功返回 0;失败返回负值错误码

bflb_gpio_set(gpio, pin)

让指定输出引脚输出高电平(3.3V),LED 点亮。

参数

  • gpio:GPIO 设备句柄
  • pin:已配置为输出的引脚号

返回值:无

bflb_gpio_reset(gpio, pin)

让指定输出引脚输出低电平(0V),LED 熄灭。

参数

  • gpio:GPIO 设备句柄
  • pin:已配置为输出的引脚号

返回值:无

bflb_gpio_read(gpio, pin)

读取指定引脚当前的输入电平。

参数

  • gpio:GPIO 设备句柄
  • pin:已配置为输入的引脚号

返回值0 低电平;1 高电平

bflb_mtimer_delay_ms(ms)

软件延时指定毫秒数,让 LED 亮灭状态保持一段时间。

参数

  • ms:延时毫秒数,例程为 2000(2 秒)

返回值:无

完整代码

以下为 gpio_input_output/main.c 完整源码,与官方示例(examples/peripherals/gpio/gpio_input_output)一致;点灯引脚已适配 Ai-M61/62-32S-Kit 板载 RGB 灯,默认折叠,点击展开:

📜 点击展开 gpio_input_output/main.c 完整代码
c
#include "bflb_gpio.h"
#include "bflb_mtimer.h"
#include "board.h"

struct bflb_device_s *gpio;

/* Ai-M61-32S-Kit / Ai-M62-32S-Kit 板载 RGB 灯:IO12 红、IO14 绿、IO15 蓝,高电平点亮 */
#define LED_RED   GPIO_PIN_12
#define LED_GREEN GPIO_PIN_14
#define LED_BLUE  GPIO_PIN_15

int main(void)
{
    board_init();

    gpio = bflb_device_get_by_name("gpio");

    /* 三个引脚都配置为推挽输出 */
    bflb_gpio_init(gpio, LED_RED, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
    bflb_gpio_init(gpio, LED_GREEN, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
    bflb_gpio_init(gpio, LED_BLUE, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);

    while (1) {
        /* 红灯点亮 1 秒 */
        bflb_gpio_set(gpio, LED_RED);
        bflb_mtimer_delay_ms(1000);
        bflb_gpio_reset(gpio, LED_RED);

        /* 绿灯点亮 1 秒 */
        bflb_gpio_set(gpio, LED_GREEN);
        bflb_mtimer_delay_ms(1000);
        bflb_gpio_reset(gpio, LED_GREEN);

        /* 蓝灯点亮 1 秒 */
        bflb_gpio_set(gpio, LED_BLUE);
        bflb_mtimer_delay_ms(1000);
        bflb_gpio_reset(gpio, LED_BLUE);
    }
}

FAQ

LED 不亮

确认把例程的输出引脚改成了板载 RGB 对应引脚(红灯 GPIO_PIN_12、绿灯 GPIO_PIN_14、蓝灯 GPIO_PIN_15);确认 IO 未被其他外设占用;确认烧录成功且开发板已复位运行。

串口没有输出

串口助手波特率要设为 2000000(2M),并确认连接的是调试串口;如果输出乱码,检查波特率是否一致;如果完全没有输出,按一下复位键重启。

编译报错

确认已在例程目录下执行(examples/peripherals/gpio/gpio_input_output);确认已按快速开始教程安装好 RISC-V 交叉编译工具链并配置好环境变量。

相关最佳实践

遇到问题?

如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

Released under the MIT License. Build Time 2026-09-11 14:52:23