# LVGL_RA_8.3.6_pack **Repository Path**: liunix61/lvgl-ra-8.3.6-pack ## Basic Information - **Project Name**: LVGL_RA_8.3.6_pack - **Description**: 这个一个LVGL FSP pack安装以及使用的仓库,你可以按照这个步骤添加LVGL pack到你的工程。通过stack对lvgl进行可视化配置,使能2D,touch,修改分辨率,选择不同LCD驱动等操作。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-03-13 - **Last Updated**: 2024-03-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LVGL_RA_8.3.6_pack #### 介绍 这是一个由e2studio自动生成的FSP pack。用户可以通过添加该pack,以可视化的形式添加和配置Little VGL,包括Little VGL的分辨率,色深,DPI以及官方的demo等进行配置。用户不用再做移植Little VGL的源代码,不用再繁琐的添加各个头文件。 本次实验所用硬件为EK-RA8D1,如下图。确保板子的SW1-7切换到 “ON” ![](Picture/board.jpg) #### 软件架构 通过pack生成的代码主要在ra->fsp->src->rm_lvgl_prot和ra->lvgl两个路径下 ![](Picture/ra_folder_architecture_1.jpg) ![](Picture/ra_folder_architecture_2.jpg) #### 安装教程 1. 打开e2studio菜单中“File”->“Import... ” ![](Picture/import_pack_step1.jpg) 2. 在弹出的“Import”对话框中,选择“General”->“CMSIS Pack”,点击“Next” ![](Picture/import_pack_step2.jpg) 3. 在弹出的“Import CMSIS Pack”对话框中,点击“Specify pack file”右侧“...”,指定需要添加的pack文件 ![](Picture/import_pack_step3.jpg) 4. “Specify device family”选择“RA”,点击Finish ![](Picture/import_pack_step4.jpg) #### 使用说明 1. 重新打开e2studio 2. 新建工程,新建工程步骤不再赘述,FSP版本选择5.1.0及以上,Board选择EK-RA8D1 3. 新建好工程后,添加LVGL的stack,这时候会提示GLCDC的时钟没有打开,切换到clocks选项卡,enable LCD的clock,选择PLL1P,让LCD时钟输出为240MHz即可。 ![](Picture/project_step1.png) 添加MIPI DSI driver, 左键点击 Add MIPI DSI Output(Optional)->New->MIPI Display(r_mipi_dsi): ![](Picture/add_MIPI_DSI.png) Note: Enable LCD的clock后,r_glcdc的红色提示会消失。 修改LVGL显示分辨率: 480*854,enable 2D: ![](Picture/add_resolutionx.jpg) 使能touch ![](Picture/project_step3.jpg) 修改glcdc的名字为g_display_lvgl: ![](Picture/project_step4.jpg) 4. 添加2D驱动,如果上述步骤没有enable 2D,此步骤可以跳过。 New Stack->Graphics->D/AVE 2D Port Interface ![](Picture/project_add2d.jpg) 添加完2D stack后,在BSP选项卡中修改heap为0x2000给2D使用,同时加大stack的值为0x2000: ![](Picture/add_stack_heap.jpg) 5. 添加i2c驱动 ![](Picture/project_add_i2c.jpg) 修改i2c的配置,Name:g_i2c_master1, Channel: 1, Slave address: 0x5D, Callback: g_i2c_master1_cb, Interrupt Priority Level:Priority 12 ![](Picture/project_add_i2c_conf.jpg) 6. 添加GPIO中断 修改irq的配置:Name:g_external_irq3,Channel:3,Callback:touch_irq_cb ![](Picture/project_add_irq.jpg) P510 设为input模式,IRQ选择为IRQ3 ![](Picture/set_pin_int.jpg) 7. 配置引脚 确认SDRAM的引脚驱动能力: PA00 -- H, PA08 -- H, PA09 -- HH, PA10 -- H, P404设为输出模式,初始化为高电平, PA01设为输出模式,初始化为高电平 8. 点击 Generate Project Content, 生成代码 10. 添加应用代码,做一个lvgl下拉控件。修改 hal_entry.c 如下: #include "hal_data.h" #include "dsi_layer.h" #include "lvgl.h" #include "lv_demos.h" FSP_CPP_HEADER void R_BSP_WarmStart(bsp_warm_start_event_t event); FSP_CPP_FOOTER #define RGB_565_REG (0x1F << 11) #define RGB_565_GREEN (0x3F << 5) #define RGB_565_BLUE (0x1F << 0) /* Global variable to keep track of requested application */ void SysTick_Handler(void); #define LVGL_TICK_MS 1U static volatile uint32_t s_tick = 0U; static volatile bool s_lvglTaskPending = false; #define LVGL_TASK_PERIOD_TICK 3U static void DEMO_SetupTick(void) { if (0 != SysTick_Config(SystemCoreClock / (LVGL_TICK_MS * 1000U))) { while (1) ; } } void SysTick_Handler(void) { s_tick++; lv_tick_inc(LVGL_TICK_MS); if ((s_tick % LVGL_TASK_PERIOD_TICK) == 0U) { s_lvglTaskPending = true; } } #if LV_BUILD_EXAMPLES static void event_handler(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t * obj = lv_event_get_target(e); if(code == LV_EVENT_VALUE_CHANGED) { char buf[32]; lv_dropdown_get_selected_str(obj, buf, sizeof(buf)); LV_LOG_USER("Option: %s", buf); } } void lv_example_dropdown_1(void) { /*Create a normal drop down list*/ lv_obj_t * dd = lv_dropdown_create(lv_scr_act()); lv_dropdown_set_options(dd, "Apple\n" "Banana\n" "Orange\n" "Cherry\n" "Grape\n" "Raspberry\n" "Melon\n" "Orange\n" "Lemon\n" "Nuts"); lv_obj_align(dd, LV_ALIGN_TOP_MID, 0, 20); lv_obj_add_event_cb(dd, event_handler, LV_EVENT_ALL, NULL); } #endif /*******************************************************************************************************************//** * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function * is called by main() when no RTOS is used. **********************************************************************************************************************/ void hal_entry(void) { /* TODO: add your own code here */ fsp_err_t err; /* Fill the Frame buffer with Blue, to zero out info from previous execution runs */ uint32_t count; uint16_t * p = (uint16_t *)&fb_background[0][0]; for (count = 0; count < sizeof(fb_background)/2; count++) { *p++ = RGB_565_REG; } DEMO_SetupTick(); lv_init(); lv_port_disp_init(); #if Touch_Enable lv_port_indev_init(); #endif lv_example_dropdown_1(); #if LV_USE_DEMO_WIDGETS // lv_demo_widgets(); #endif #if LV_USE_DEMO_STRESS lv_demo_stress(); #endif #if LV_USE_DEMO_BENCHMARK lv_demo_benchmark(); #endif #if LV_USE_DEMO_MUSIC lv_demo_music(); #endif // lv_task_handler(); /* handle the tasks of LVGL */ while(1) { while (!s_lvglTaskPending) { } s_lvglTaskPending = false; lv_task_handler(); } #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif } /*******************************************************************************************************************//** * This function is called at various points during the startup process. This implementation uses the event that is * called right before main() to set up the pins. * * @param[in] event Where at in the start up process the code is currently at **********************************************************************************************************************/ void R_BSP_WarmStart(bsp_warm_start_event_t event) { if (BSP_WARM_START_RESET == event) { #if BSP_FEATURE_FLASH_LP_VERSION != 0 /* Enable reading from data flash. */ R_FACI_LP->DFLCTL = 1U; /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */ #endif } if (BSP_WARM_START_POST_C == event) { /* C runtime environment and system clocks are setup. */ /* Configure pins. */ R_IOPORT_Open (&g_ioport_ctrl, &IOPORT_CFG_NAME); bsp_sdram_init(); //SDRAM pins need to be set to HIGH drive strength in pin configuration } } #if BSP_TZ_SECURE_BUILD FSP_CPP_HEADER BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable (); /* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */ BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable () { } FSP_CPP_FOOTER #endif 11. 编译,下载到EK-RA8D1,连接MIPI屏,会得到以下结果: ![](Picture/demo_1.jpg) 12. 下面我们配置FSP,把官方的demo使能起来: 打开configuration.xml,配置如下: ![](Picture/demo_widgets.jpg) 配置完成后,点击Generate Project Content。修改hal_entry.c: #include "hal_data.h" #include "dsi_layer.h" #include "lvgl.h" #include "lv_demos.h" FSP_CPP_HEADER void R_BSP_WarmStart(bsp_warm_start_event_t event); FSP_CPP_FOOTER #define RGB_565_REG (0x1F << 11) #define RGB_565_GREEN (0x3F << 5) #define RGB_565_BLUE (0x1F << 0) /* Global variable to keep track of requested application */ void SysTick_Handler(void); #define LVGL_TICK_MS 1U static volatile uint32_t s_tick = 0U; static volatile bool s_lvglTaskPending = false; #define LVGL_TASK_PERIOD_TICK 3U static void DEMO_SetupTick(void) { if (0 != SysTick_Config(SystemCoreClock / (LVGL_TICK_MS * 1000U))) { while (1) ; } } void SysTick_Handler(void) { s_tick++; lv_tick_inc(LVGL_TICK_MS); if ((s_tick % LVGL_TASK_PERIOD_TICK) == 0U) { s_lvglTaskPending = true; } } #if LV_BUILD_EXAMPLES static void event_handler(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t * obj = lv_event_get_target(e); if(code == LV_EVENT_VALUE_CHANGED) { char buf[32]; lv_dropdown_get_selected_str(obj, buf, sizeof(buf)); LV_LOG_USER("Option: %s", buf); } } void lv_example_dropdown_1(void) { /*Create a normal drop down list*/ lv_obj_t * dd = lv_dropdown_create(lv_scr_act()); lv_dropdown_set_options(dd, "Apple\n" "Banana\n" "Orange\n" "Cherry\n" "Grape\n" "Raspberry\n" "Melon\n" "Orange\n" "Lemon\n" "Nuts"); lv_obj_align(dd, LV_ALIGN_TOP_MID, 0, 20); lv_obj_add_event_cb(dd, event_handler, LV_EVENT_ALL, NULL); } #endif /*******************************************************************************************************************//** * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function * is called by main() when no RTOS is used. **********************************************************************************************************************/ void hal_entry(void) { /* TODO: add your own code here */ fsp_err_t err; /* Fill the Frame buffer with Blue, to zero out info from previous execution runs */ uint32_t count; uint16_t * p = (uint16_t *)&fb_background[0][0]; for (count = 0; count < sizeof(fb_background)/2; count++) { *p++ = RGB_565_REG; } DEMO_SetupTick(); //为lvgl提供心跳 lv_init(); lv_port_disp_init(); #if Touch_Enable lv_port_indev_init(); #endif // lv_example_dropdown_1(); #if LV_USE_DEMO_WIDGETS lv_demo_widgets(); #endif #if LV_USE_DEMO_STRESS lv_demo_stress(); #endif #if LV_USE_DEMO_BENCHMARK lv_demo_benchmark(); #endif #if LV_USE_DEMO_MUSIC lv_demo_music(); #endif // lv_task_handler(); /* handle the tasks of LVGL */ while(1) { while (!s_lvglTaskPending) { } s_lvglTaskPending = false; lv_task_handler(); } #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif } /*******************************************************************************************************************//** * This function is called at various points during the startup process. This implementation uses the event that is * called right before main() to set up the pins. * * @param[in] event Where at in the start up process the code is currently at **********************************************************************************************************************/ void R_BSP_WarmStart(bsp_warm_start_event_t event) { if (BSP_WARM_START_RESET == event) { #if BSP_FEATURE_FLASH_LP_VERSION != 0 /* Enable reading from data flash. */ R_FACI_LP->DFLCTL = 1U; /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */ #endif } if (BSP_WARM_START_POST_C == event) { /* C runtime environment and system clocks are setup. */ /* Configure pins. */ R_IOPORT_Open (&g_ioport_ctrl, &IOPORT_CFG_NAME); bsp_sdram_init(); //SDRAM pins need to be set to HIGH drive strength in pin configuration } } #if BSP_TZ_SECURE_BUILD FSP_CPP_HEADER BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable (); /* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */ BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable () { } FSP_CPP_FOOTER #endif 编译,下载。得到结果如下: ![](Picture/demo_widgets_display.png) 如果实验过程有问题,可以下载本仓库中e2studio_project\下的RA8D1_simple_demo 和 RA8D1_widgets_demo 两个完整的工程做对比。 基于RA8D1的lvgl FSP配置以及使用已经介绍完毕。