【开发环境】
1、mdk
2、mdk下面的lvgl pak安装包
【前提】
在前面的一篇文章中,我详细介绍了如何驱动st7796LCD屏,在其基础之上进行lvgl移植。
【RA-Eco-RA6M4开发板评测】驱动ST7796LCD屏 - 瑞萨单片机论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛!
【lvgl安装包】
*附件:LVGL.lvgl.8.3.10.pack.zip
下载后直接安装即可
【添加lvgl】
打开工程之后,点击包管理:

添加lvgl的Essential、porting到工程中。
添加后lvgl分组如下:

在我框选的文件为porting模块,这个模块才能给用户修改。
【代码修改】
1、首先需要lv_config_cmsis.h中添加屏的长与宽。

2、修改lv_port_tempalate.c
首先把if 0修改为if 1开户代码。
添加lcd的头文件引用,我这里是使用st7796.h
在lv_port_disp_init中注释掉如下所示,我这里采用单缓冲。

在disp_init中添加st7796_init初始化LCD屏。
3、修改disp_flush函数,其代码如下:
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
if(disp_flush_enabled) {
st7796_set_window((uint16_t)area->x1, (uint16_t)area->y1, (uint16_t)area->x2, (uint16_t)area->y2);
DC_SET;
uint32_t pix_cont = (uint32_t)( (area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1));
R_SPI_Write(&g_spi0_ctrl, (uint16_t *)color_p, pix_cont, SPI_BIT_WIDTH_16_BITS);
SPIWaitgtc();
}
lv_disp_flush_ready(disp_drv);
}
这个函数首先设置要刷新的区域,然后把缓存传给屏。
【测试函数】
在hal_entry中添加一个测试函数:
void LvglTest()
{
lv_obj_t * label1 = lv_label_create(lv_scr_act());
lv_label_set_long_mode(label1, LV_LABEL_LONG_SCROLL_CIRCULAR);
lv_label_set_recolor(label1, true);
lv_label_set_text(label1, "#0000ff Hello World# RA6M4 LVGL #");
lv_obj_set_width(label1, 240);
lv_obj_set_style_text_align(label1, LV_TEXT_ALIGN_CENTER, 0);
lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0);
}
然后在主程中添加lvgl初始以及调用示例,在while中每一毫秒刷新一下lvgl的tick
void hal_entry(void)
{
lv_init();
lv_port_disp_init();
LvglTest();
while(1)
{
lv_tick_inc(1);
lv_task_handler();
R_BSP_SoftwareDelay(1u, BSP_DELAY_UNITS_MILLISECONDS);
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
【实现效果】


【总结】
在mdk环境中,可以直接使用lvgl的包,这样不用手工添加N多的函数以及文件的引用,只需要修改少量代码即可以实现lvgl的屏的功能。