概念先知道
- 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),每次刷新完成打印日志。
操作步骤
需要一块 Type B(DBI)接口的 LCD 屏,按 lcd.h/板级配置把数据/时钟/控制引脚接到开发板对应引脚(VCC 3.3V、GND 共地)。
在终端进入 SDK 的 DBI 例程目录(前提:已按快速开始(Linux)或Windows搭建好环境):
cd examples/peripherals/dbi/lcd_type_b执行编译命令。Ai-M62(BL616)与 Ai-M61(BL618)同属一个系列,统一填写引脚最少的 bl616 即可:
make CHIP=bl616 BOARD=bl616dk用 USB 线连接开发板,按住 BOOT 键(Ai-M61-32S-Kit 为 IO2)不放、短按 EN/RST 进入下载模式,然后执行烧录(把串口号换成实际值):
make flash CHIP=bl616 COMX=/dev/ttyUSB0打开串口助手(波特率 2000000)。屏幕应显示红色/绿色文字的 Hello World ! 与 dbi lcd test.,外框为红/绿/蓝三色矩形;随后 4 个色块区域循环刷新,串口打印 lcd async int come, cnt: N 与 lcd flush done。
代码执行流程
例程从启动到运行的完整流程如下(图中的循环箭头表示反复执行):
例程调用的 API 介绍
lcd_draw_str_ascii16 / lcd_draw_rectangle / lcd_draw_picture_nonblocking(...)
绘制 16 号 ASCII 字符串、矩形框,以及 DMA 非阻塞刷新图片区域。
参数:坐标、颜色(LCD_COLOR_RGB(r,g,b))、缓冲区等
返回值:成功返回 0;失败返回负值错误码
完整代码
以下为 lcd_type_b/main.c 完整源码,与官方示例(examples/peripherals/dbi/lcd_type_b)一致;点灯引脚已适配 Ai-M61/62-32S-Kit 板载 RGB 灯,默认折叠,点击展开:
📜 点击展开 lcd_type_b/main.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

