电子网首页 > 开源与设计

【瑞萨RA8D1 LVGL/LWIP评测】RA8D1部署FreeRTOS+LVGL

2026-02-07 01:10 | 来源:电子世界报

      瑞萨RA8D1 MCU是业界首款基于ARM Cortex-M85内核的图形微控制器,内置Helium矢量扩展技术,集成了大容量内存、图形LCD控制器(GLCDC)、D/AVE 硬件2D图形加速器,可以轻松满足各种复杂图形和视觉AI应用。本文我们将使用CPKEXP-EKRA8x1扩展板上的LCD屏幕,基于FreeRTOS部署LVGL。

一、软硬件准备

硬件部分

  1. CPKCOR-RA8D1 核心板

  2. CPKEXP-EKRA8x1 扩展板

软件部分

  1. e²Studio 2025-12 (25.12.0)

  2. Renesas FSP 6.3.0

  3. 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来进行模式选择。

mode.JPG

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

111.png

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

222.png

最终的跳线帽配置如图:

board2.jpeg

三、FSP图形化配置

     在创建工程时,我们可以基于裸机工程,也可以基于Blinky的FreeRTOS工程模板。

Pin引脚

     Pin配置主要为MIPI引脚配置,比较繁琐容易出错,建议从官方扩展板例程中导出Pin配置,然后导入到本工程。

Stack配置

     我们通过 Graphics -> LVGL 选项引入LVGL。无论是裸机还是FreeRTOS工程,它们的底层硬件配置和图形Stack是一致的,主要区别如下:

1. 在裸机情况下,由SysTick定时器提供LVGL节拍,在主循环中执行屏幕刷新;

2. 在FreeRTOS情况下,由FreeRTOS系统节拍附带提供LVGL节拍,配备一个独立的屏幕刷新线程。

基于裸机的Stack配置:

基于FreeRTOS的Stack配置:

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

glcdc.jpg

最后增大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。

ui.jpg

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

ui-src.jpg

最后在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));
        }
    }
}
六、烧录运行

     烧录代码,可以看到屏幕开始计数:

v22.gif

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


阅读全文

推荐技术

返回顶部