基于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自动生成指导手册(下)

更多精彩内容,请点击

评论
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 171浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 72浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 176浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 166浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 79浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 122浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 87浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 110浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 90浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 71浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 93浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 48浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 76浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦