Skip to content

概念先知道

  • DBI(Type B):一种接 LCD 屏的并行/类并口接口(数据、时钟、控制线多根),常用于中小尺寸屏。
  • 像素/颜色格式:屏幕由像素点组成,每个像素用 lcd_color_t 表示颜色;颜色格式不一致会花屏。
  • DMA 刷图:把整块图像数据交给 DMA 搬给屏幕,CPU 不参与,适合动画/视频类刷新。

例程功能简介

本页对应博流官方 SDK 的 lcd_type_b 例程(examples/peripherals/dbi/lcd_type_b),演示 DBI(Type B)接口 LCD 显示:

  • 初始化 LCD 并注册异步刷新完成回调(lcd_async_callback_register);
  • 清屏后绘制 ASCII 字符串(16 号字体)、三色矩形边框;
  • 循环用 DMA 非阻塞方式刷新 4 个色块(lcd_draw_picture_nonblocking),每次刷新完成打印日志。

操作步骤

1
硬件准备

需要一块 Type B(DBI)接口的 LCD 屏,按 lcd.h/板级配置把数据/时钟/控制引脚接到开发板对应引脚(VCC 3.3V、GND 共地)。

2
进入例程目录

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

cd examples/peripherals/dbi/lcd_type_b
3
编译工程

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

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

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

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

打开串口助手(波特率 2000000)。屏幕应显示红色/绿色文字的 Hello World !dbi lcd test.,外框为红/绿/蓝三色矩形;随后 4 个色块区域循环刷新,串口打印 lcd async int come, cnt: Nlcd flush done

代码执行流程

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

例程调用的 API 介绍

lcd_init()

初始化 LCD 控制器与 DBI 接口(分辨率由 lcd.hLCD_W/LCD_H 定义)。

参数:无

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

lcd_async_callback_register(cb)

注册异步刷新完成回调,DMA 刷新完成时调用。

参数

  • cb:回调函数

返回值:无

lcd_draw_str_ascii16 / lcd_draw_rectangle / lcd_draw_picture_nonblocking(...)

绘制 16 号 ASCII 字符串、矩形框,以及 DMA 非阻塞刷新图片区域。

参数:坐标、颜色(LCD_COLOR_RGB(r,g,b))、缓冲区等

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

lcd_draw_is_busy / lcd_clear(...)

查询刷新是否忙、全屏清屏。

参数:颜色(清屏时)

返回值lcd_draw_is_busy 返回忙状态;其余成功返回 0

完整代码

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

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

#include "lcd.h"

#define DBG_TAG "MAIN"
#include "log.h"

#define LCD_TEST_W (100)
#define LCD_TEST_H (20)

lcd_color_t lcd_test_buff[LCD_TEST_W * LCD_TEST_H];

lcd_color_t lcd_test_color[] = {
    LCD_COLOR_RGB(0xff, 0xff, 0xff),

    LCD_COLOR_RGB(0xff, 0x00, 0x00),
    LCD_COLOR_RGB(0x00, 0xff, 0x00),
    LCD_COLOR_RGB(0x00, 0x00, 0xff),

    LCD_COLOR_RGB(0xff, 0xff, 0x00),
    LCD_COLOR_RGB(0x00, 0xff, 0xff),
    LCD_COLOR_RGB(0xff, 0x00, 0xff),
};

void color_fill_buff(lcd_color_t color)
{
    for (int i = 0; i < sizeof(lcd_test_buff) / sizeof(lcd_color_t); i++) {
        lcd_test_buff[i] = color;
    }
}

void flush_async_callback()
{
    static uint32_t cnt;
    cnt += 1;

    /* lcd async int come */
    LOG_I("lcd async int come, cnt: %d\r\n", cnt);
}

int main(void)
{
    int color_num = 0;

    board_init();

    LOG_I("DBI lcd test\r\n");

    /* lcd init */
    lcd_init();

    /* register async callback */
    lcd_async_callback_register(flush_async_callback);

    /* clean lcd */
    lcd_clear(LCD_COLOR_RGB(0x00, 0x00, 0x00));

    /* disp font */
    lcd_draw_str_ascii16(20, 20, LCD_COLOR_RGB(0xff, 0x00, 0x00), LCD_COLOR_RGB(0x00, 0x00, 0x00), (uint8_t *)"Hello World !", 100);
    lcd_draw_str_ascii16(20, 40, LCD_COLOR_RGB(0x00, 0xff, 0x00), LCD_COLOR_RGB(0x00, 0x00, 0x00), (uint8_t *)"dbi lcd test.", 100);

    lcd_draw_rectangle(0, 0, LCD_W - 1, LCD_H - 1, LCD_COLOR_RGB(0xff, 0x00, 0x00));
    lcd_draw_rectangle(5, 5, LCD_W - 6, LCD_H - 6, LCD_COLOR_RGB(0x00, 0xff, 0x00));
    lcd_draw_rectangle(10, 10, LCD_W - 11, LCD_H - 11, LCD_COLOR_RGB(0x00, 0x00, 0xff));

    while (1) {
        for (int i = 0; i < 4; i++) {
            /* fill buff */
            uint8_t n = (color_num + i) % (sizeof(lcd_test_color) / sizeof(lcd_color_t));
            color_fill_buff(lcd_test_color[n]);

            /* draw picture (DMA non-blocking) */
            lcd_draw_picture_nonblocking(30, (80 + (LCD_TEST_H + 5) * i), (30 + LCD_TEST_W - 1), (80 + (LCD_TEST_H + 5) * i + LCD_TEST_H - 1), lcd_test_buff);
            /* wait flush done */
            while (lcd_draw_is_busy()) {
            };
            LOG_I("lcd flush done\r\n");

            if (color_num >= sizeof(lcd_test_color) / sizeof(lcd_color_t)) {
                color_num = 0;
            }
        }

        color_num ++ ;
        bflb_mtimer_delay_ms(1000);
    }
}

FAQ

屏幕无显示

确认屏为 DBI/Type B 接口且接线正确(数据/时钟/控制线、背光、VCC/GND);确认 lcd.h 中分辨率与屏参数一致;检查背光引脚是否使能。

画面花屏/颜色不对

检查像素格式与颜色位宽是否匹配(lcd_color_t 定义),确认屏的驱动 IC 与 lcd 组件一致,必要时调整初始化序列。

刷新卡住,一直 busy

异步刷新依赖 DMA 完成中断与回调;确认 lcd_async_callback_register 已调用,且 DMA 通道未被其他外设占用。

遇到问题?

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

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