基于RA8D1MIPIDSI实现LVGL

原创 瑞萨MCU小百科 2024-03-13 12:03


1

介绍


本文介绍由e2 studio自动生成的FSP LVGL pack的使用说明,Pack的生成方法可以参考前面的介绍文章。用户可以通过添加该pack,以可视化的形式添加和配置Little VGL,包括Little VGL的分辨率、色深、DPI以及官方的demo等进行配置。用户不用再做移植Little VGL的源代码,不用再繁琐的添加各个头文件。本次实验所用硬件为EK-RA8D1,如下图。确保板子的SW1-7切换到“ON”



Pack下载链接

复制网址到浏览器中打开:

https://gitee.com/recn-mcu-ae/lvgl-ra-8.3.6-pack/tree/master/internal/projectgen/ra/packs


2

软件架构


通过pack生成的代码主要在ra→fsp→src→rm_lvgl_prot和ra→lvgl两个路径下


3

安装教程


1

打开e2 studio菜单中“File”→“Import... ”


2

在弹出的“Import”对话框中,选择“General”→“CMSIS Pack”,点击“Next”


3

在弹出的“Import CMSIS Pack”对话框中,点击“Specify pack file”右侧“...”,指定需要添加的pack文件


4

“Specify device family”选择“RA”,点击Finish


4

使用说明


1

重新打开e2 studio

2

新建工程,新建工程步骤不再赘述,FSP版本选择5.1.0及以上,Board选择EK-RA8D1

3

新建好工程后,添加LVGL的stack,这时候会提示GLCDC的时钟没有打开,切换到clocks选项卡,enable LCD的clock,选择PLL1P,让LCD时钟输出为240MHz即可。


添加MIPI DSI driver,左键点击Add MIPI DSI Output(Optional)→New→MIPI Display(r_mipi_dsi):


NOTE

Enable LCD的clock后,r_glcdc的红色提示会消失。


修改LVGL显示分辨率:480*854,enable 2D


使能touch


修改glcdc的名字为g_display_lvgl


4

添加2D驱动,如果上述步骤没有enable 2D,此步骤可以跳过。New Stack→Graphics→D/AVE 2D Port Interface


添加完2D stack后,在BSP选项卡中heap给2D使用,同时加大stack的值为0x2000


5

添加I2C驱动


修改I2C的配置,Name: g_i2c_master1, Channel: 1, Slave address: 0x5D, Callback: g_i2c_master1_cb, Interrupt Priority Level:Priority 12


6

添加GPIO中断,修改irq的配置:Name:g_external_irq3,Channel:3,Callback:touch_irq_cb


P510设为input模式,IRQ选择为IRQ3


7

配置引脚,改变SDRAM的引脚驱动能力:PA00 -- H, PA08 -- H, PA09 -- HH, PA10 -- H, P404设为输出模式,初始化为高电平,PA01设为输出模式,初始化为高电平

8

点击Generate Project Content,生成代码

9

添加应用代码,做一个LVGL下拉控件。修改 hal_entry.c如下:

上下滑动查看更多

左右滑动查看完整代码内容

#include "hal_data.h"#include "dsi_layer.h"#include "lvgl.h"#include "lv_demos.h"
FSP_CPP_HEADERvoid 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 1Ustatic volatile uint32_t s_tick        = 0U;static volatile bool s_lvglTaskPending = false;#define LVGL_TASK_PERIOD_TICK 3Ustatic 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 functionis 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_Enablelv_port_indev_init();#endif
lv_example_dropdown_1();#if LV_USE_DEMO_WIDGETS//       lv_demo_widgets();#endif
#if LV_USE_DEMO_STRESSlv_demo_stress();#endif#if LV_USE_DEMO_BENCHMARKlv_demo_benchmark();#endif#if LV_USE_DEMO_MUSIClv_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 iscalled 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 andC 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_HEADERBSP_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

10

编译,下载到EK-RA8D1,连接MIPI屏,会得到以下结果:


至此,已经完成LVGL的移植以及测试。下面我们直接配置FSP,把官方的demo使能起来:打开configuration.xml,配置如下:


配置完成后,点击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


编译,下载。得到结果如下:


如果实验过程有问题,可以下载本仓库中e2studio_project\下的RA8D1_simple_demo和RA8D1_widgets_demo两个完整的工程做对比。


基于RA8D1的LVGL FSP配置以及使用已经介绍完毕。


您可识别下方二维码或复制网址到浏览器中打开进入瑞萨技术论坛:

https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/


1

END

1


推荐阅读

RA8D1 CEU介绍与使用说明

LVGL Pack自动生成指导手册(上)

LVGL Pack自动生成指导手册(下)

更多精彩内容,请点击

评论 (0)
  •   有效数据智能分拣系统详解   北京华盛恒辉有效数据智能分拣系统融合人工智能、大数据分析与机器学习等前沿技术,实现海量数据自动化分类、筛选、整理及分配。凭借强大的数据处理效能,助力企业精准提取关键信息,优化决策流程,提升运营效率。以下从系统架构、核心功能、技术特性、应用场景及发展趋势展开解读。   应用案例   目前,已有多个有效数据智能分拣系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润有效数据智能分拣系统。这些成功案例为有效数据智能分拣系统的推广和应用提供了有力支持。
    华盛恒辉l58ll334744 2025-04-21 16:46 100浏览
  •   海上安全事件应急处置系统解析   北京华盛恒辉海上安全事件应急处置系统是为应对船舶碰撞、火灾等海上突发事件打造的综合管理体系,通过技术与协同机制,实现快速响应救援、优化资源配置,守护海上生命、财产与环境安全。以下从系统构成、功能、技术、应用及趋势展开阐述。   应用案例   目前,已有多个海上安全事件应急处置系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润海上安全事件应急处置系统。这些成功案例为海上安全事件应急处置系统的推广和应用提供了有力支持。   一、系统构成
    华盛恒辉l58ll334744 2025-04-21 15:50 68浏览
  •   有效数据智能分拣系统平台深度解析   一、系统概述   北京华盛恒辉有效数据智能分拣系统平台融合人工智能、机器视觉、物联网及大数据分析技术,为物流包裹、数据信息等提供高效精准的智能化分拣处理方案。通过自动化设备与智能算法协同运作,取代传统人工分拣模式,显著提升分拣效率、降低错误率,满足电商、快递及供应链不断增长的业务需求。   应用案例   目前,已有多个有效数据智能分拣系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润有效数据智能分拣系统。这些成功案例为有效数据智能分
    华盛恒辉l58ll334744 2025-04-21 16:22 117浏览
  •   海上安全事件应急处置系统平台深度解析   一、平台概述   北京华盛恒辉海上安全事件应急处置系统平台融合现代信息技术、通信技术、GIS、大数据分析及 AI 等技术,旨在快速响应船舶碰撞、火灾、溢油等海上突发事件,实现科学决策与高效资源调配,保障海上生命财产安全、减少环境污染。   应用案例   目前,已有多个海上安全事件应急处置系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润海上安全事件应急处置系统。这些成功案例为海上安全事件应急处置系统的推广和应用提供了有力支持
    华盛恒辉l58ll334744 2025-04-21 15:21 85浏览
  • 导读在当今快速发展的智能通讯领域,时间敏感网络(TSN)已成为确保网络通信高可靠性和低延迟的关键技术。IEEE 802.1 Qci作为TSN的一个重要组成部分,提供了一套强大的机制来管理网络流量,确保关键数据流的优先级和带宽得到保障。本文将深入探讨IEEE 802.1 Qci协议的基本概念、工作原理以及虹科提供的Qci解决方案,帮您理解如何通过精确的流量控制来提升网络的稳定性和效率。虹科TSN解决方案01# 技术简介时间敏感网络(TSN)通过IEEE 802.1 Qci标准定义了一种关
    虹科工业智能互联 2025-04-21 16:17 74浏览
  •   电磁信号模拟平台解析   北京华盛恒辉电磁信号模拟平台作为模拟复杂电磁环境的系统,在无线通信、电子对抗等多领域广泛应用。以下从功能、技术特性、应用场景及发展趋势展开详细解读。   应用案例   目前,已有多个电磁信号模拟平台在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁信号模拟平台。这些成功案例为电磁信号模拟平台的推广和应用提供了有力支持。   一、核心功能   复杂电磁环境建模:构建贴近真实的电磁环境,涵盖各类干扰因素。   多通道信号模拟:模拟多通道电磁信号
    华盛恒辉l58ll334744 2025-04-21 15:10 91浏览
  • 导读在智能汽车技术发展浪潮中,车辆控制系统的智能化、网络化已成为行业发展的必然趋势。虹科PEAK智行定位车控系统,集成了尖端科技,能够实现车辆全方位监控与控制。从实时GPS定位到CAN/CAN FD信号处理,虹科方案不仅提升了车辆的智能化水平,更在安全性和效率上迈出了革命性的一步。虹科PEAK智行定位车控系统,通过CAN/CAN FD信号实现车辆的精准控制,包括加减速、转弯、倒退等动作,模拟真实车辆平台的动态表现。该系统搭载了虹科各型号设备,通过紧密协作,实时反映车辆位置、总线报文等信息,实现车
    虹科汽车智能互联 2025-04-21 16:04 72浏览
  • 导读Linux驱动程序领域再添新成员,PLIN驱动程序现已正式发布。这一新驱动程序为使用LIN接口的用户提供了一个便捷、高效的解决方案。本文将展示如何安装PLIN驱动程序,以及如何在Linux环境下进行基本的PLIN通信操作,确保您能够快速掌握并应用这一新工具。继我们在Linux环境下成功推出CAN/CAN FD接口驱动程序后,现在我们为LIN接口带来了同样兼容Linux的驱动程序。免费软件包中不仅包含了驱动程序本身,还提供实用工具和一份易于理解的快速入门指南。用户下载后,需要根据当前使用的Li
    虹科汽车智能互联 2025-04-21 14:56 58浏览
  • 导读在汽车测试和现代工业领域,功耗控制与效率优化是工程师们不断追求的目标。虹科PCAN Router系列设备以其卓越的性能和灵活性,为CAN/CAN FD网络中的报文转换提供了高效解决方案。本文将探讨虹科PCAN Router系列设备如何在保持高效工作的同时,通过低功耗模式和高效唤醒功能,满足对能耗有严格要求的应用场景。虹科PCAN Router系列网关1 低功耗模式的优势与实现在实际的工作场景中,可能会出现一些对功耗要求存在限制的情况。鉴于此,可以灵活设置虹科PCAN Router系
    虹科汽车智能互联 2025-04-21 15:45 62浏览
  • 精益生产咨询师证/精益管理专业人员证/精益生产工程师证虽然在名称上有一些差异,但其实实际区别并不大,目前类似的证书以ILSSI-CLMP较为得到国际上的认可,当然,你不会因为有一张精益生产咨询师证,而会有人马上请你做咨询师,因为除了知识之外,你还要有充足经验、热诚、沟通能力等等,这些也是我们招聘咨询师的基本要求。那么,有没有必要取得CLMP证书呢?这主要取决于你自己对职业发展的规划和自我提升的意志。CLMP是什么?CLMP的全称是Certified Lean Management Profess
    优思学院 2025-04-21 14:29 42浏览
  • 北京贞光科技有限公司作为紫光同芯授权代理商,深耕电子元器件领域数十载,专为汽车与工业客户提供车规级安全芯片及配套服务。公司整合硬件供应、软件SDK与技术支持为一体,配备专业团队提供选型咨询与现场指导,助力客户实现完整的芯片应用解决方案。在全球芯片供应链重构的大背景下,我国车规级芯片产业正迎来前所未有的发展机遇。北京贞光科技有限公司作为紫光同芯授权代理商,深耕电子元器件领域数十载,专为汽车与工业客户提供车规级安全芯片及配套服务。公司整合硬件供应、软件SDK与技术支持为一体,配备专业团队提供选型咨询
    贞光科技 2025-04-21 16:10 71浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦