瑞萨RA8D1 MCU是业界首款基于ARM Cortex-M85内核的图形微控制器,内置Helium矢量扩展技术,集成了大容量内存、图形LCD控制器(GLCDC)、D/AVE 硬件2D图形加速器,可以轻松满足各种复杂图形和视觉AI应用。本文我们将使用CPKEXP-EKRA8x1扩展板上的LCD屏幕,基于FreeRTOS部署LVGL。
一、软硬件准备硬件部分
CPKCOR-RA8D1 核心板
CPKEXP-EKRA8x1 扩展板
软件部分
e²Studio 2025-12 (25.12.0)
Renesas FSP 6.3.0
J-Link RTT Viewer V8.92
二、硬件配置
跳线帽连接
CPKEXP-EKRA8x1 扩展板安装了一块 H0233S001 2.33英寸全接口LCD模组,支持MIPI-DSI/RGB666/SPI显示接口。H0233S001 的驱动IC型号是 ST7796U,本文我们选择通信方式选为MIPI-DSI。我们查看 ST7796U 的数据手册,可知通过IM0、IM1、IM2来进行模式选择。

接下来对照原理图,DSI-IM1和IM0是可以配置的,而IM2直接连接到了VCC。

我们通过J5来配置DSI-IM1和IM0。

最终的跳线帽配置如图:

在创建工程时,我们可以基于裸机工程,也可以基于Blinky的FreeRTOS工程模板。
Pin引脚Pin配置主要为MIPI引脚配置,比较繁琐容易出错,建议从官方扩展板例程中导出Pin配置,然后导入到本工程。
Stack配置我们通过 Graphics -> LVGL 选项引入LVGL。无论是裸机还是FreeRTOS工程,它们的底层硬件配置和图形Stack是一致的,主要区别如下:
1. 在裸机情况下,由SysTick定时器提供LVGL节拍,在主循环中执行屏幕刷新;
2. 在FreeRTOS情况下,由FreeRTOS系统节拍附带提供LVGL节拍,配备一个独立的屏幕刷新线程。
基于裸机的Stack配置:

基于FreeRTOS的Stack配置:

随后配置底层的GLCDC硬件,主要配置如下:

最后增大LVGL线程的堆栈,建议启用SDRAM,开启动态内存分配。
四、D/AVE 硬件2D图形加速器D/AVE 是一个独立于 CPU 的硬件模块,有自己的寄存器和 DMA 通道。当执行图形操作(如复制一张 PNG 到帧缓冲区并做 Alpha 混合)时,CPU 只需配置 D/AVE 的寄存器,然后 D/AVE 自主完成,几乎不占用 CPU 资源。LVGL8 以后,官方对 D/AVE 做了代码支持。在 LVGL9 中,它已经深度集成为 LVGL 的核心渲染后端之一。
D/AVE 2D 的工作原理LVGL 9 采用了新的 Draw Pipeline(绘图管线) 架构。其工作流程如下:
1. 任务拆分 (Task Dispatching)
当要填充一个区域或旋转一张图片时,LVGL 的 Draw Dispatcher 会遍历当前可用的绘图单元。
2. 硬件分配任务
当开启了 LV_USE_DRAW_DAVE2D后,系统会发现 D/AVE 2D 单元能够处理“旋转(Rotation)”或“带透明度的混合(Alpha Blending)”等操作。
3. 非阻塞渲染
LVGL 将绘图任务发送给 D/AVE 2D 硬件寄存器,硬件开始在后台异步执行。
4. CPU 并行
在硬件画图时,RA8 的 CPU 可以继续处理其他业务逻辑,从而提升系统图形效率。
五、UI设计本文我们使用GUI Guider进行UI设计,因为只是初步测试LVGL是否正常工作,所以UI比较简单。我们创建一个222x480分辨率的竖屏,设置背景色并添加一个label控件:Hello RA8。

导出代码,复制到src下新建的ui文件夹中。

最后在LVGL线程中初始化使用的UI,在循环中每秒更新label文本,确保LVGL正常工作。
完整代码如下:
#include "lvgl_thread.h"
#include <stdlib.h>
#include "board_init.h"
#include "ui/events_init.h"
#include "ui/gui_guider.h"
void vApplicationTickHook(void)
{
lv_tick_inc(1);
}
lv_ui guider_ui;
/* LVGL Thread entry function */
/* pvParameters contains TaskHandle_t */
void lvgl_thread_entry(void *pvParameters)
{
int i = 0, cnt = 0;
char label[10];
FSP_PARAMETER_NOT_USED (pvParameters);
lv_init();
board_init();
setup_ui(&guider_ui);
events_init(&guider_ui);
lv_timer_handler();
/* TODO: add your own code here */
while (1)
{
lv_timer_handler();
vTaskDelay (5);
if (i++ == 200) {
i = 0;
memset(label, 0, 25);
lv_label_set_text(guider_ui.screen_label_1, itoa(cnt++, label, 10));
}
}
}六、烧录运行烧录代码,可以看到屏幕开始计数:

至此,我们就在CPKCOR-RA8D1开发板上成功部署了FreeRTOS+LVGL的软件。但扩展板屏幕不支持触屏,接下来我将会在此基础上增加输入设备,敬请期待~