0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于RA8D1的LVGL FSP配置以及使用介绍

瑞萨MCU小百科 来源:瑞萨嵌入式小百科 作者:GJ Huang 2024-03-13 13:48 次阅读

1

介绍

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

de325496-e0f6-11ee-a297-92fbcf53809c.png

2

软件架构

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

de4f733c-e0f6-11ee-a297-92fbcf53809c.png

de62df3a-e0f6-11ee-a297-92fbcf53809c.png

3

安装教程

1

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

de67cb1c-e0f6-11ee-a297-92fbcf53809c.png

2

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

de717c98-e0f6-11ee-a297-92fbcf53809c.png

3

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

de79f620-e0f6-11ee-a297-92fbcf53809c.png

4

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

de897dc0-e0f6-11ee-a297-92fbcf53809c.png

4

使用说明

1

重新打开e2 studio

2

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

3

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

de9875fa-e0f6-11ee-a297-92fbcf53809c.png

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

dea38fbc-e0f6-11ee-a297-92fbcf53809c.png

NOTE

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

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

dead71bc-e0f6-11ee-a297-92fbcf53809c.png

使能touch

deb1ef30-e0f6-11ee-a297-92fbcf53809c.png

修改glcdc的名字为g_display_lvgl

dece0c92-e0f6-11ee-a297-92fbcf53809c.png

4

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

ded5eb4c-e0f6-11ee-a297-92fbcf53809c.png

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

deed65c4-e0f6-11ee-a297-92fbcf53809c.png

5

添加I2C驱动

def5c4b2-e0f6-11ee-a297-92fbcf53809c.png

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

defd211c-e0f6-11ee-a297-92fbcf53809c.png

6

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

df2ed5cc-e0f6-11ee-a297-92fbcf53809c.png

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

df332636-e0f6-11ee-a297-92fbcf53809c.png

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_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
"
"Banana
"
"Orange
"
"Cherry
"
"Grape
"
"Raspberry
"
"Melon
"
"Orange
"
"Lemon
"
"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

10

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

df3f5bcc-e0f6-11ee-a297-92fbcf53809c.png

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

df595ec8-e0f6-11ee-a297-92fbcf53809c.png

配置完成后,点击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
"
                            "Banana
"
                            "Orange
"
                            "Cherry
"
                            "Grape
"
                            "Raspberry
"
                            "Melon
"
                            "Orange
"
                            "Lemon
"
                            "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

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

df72b904-e0f6-11ee-a297-92fbcf53809c.png

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

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



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CMSIS
    +关注

    关注

    0

    文章

    40

    浏览量

    11903
  • MIPI
    +关注

    关注

    11

    文章

    310

    浏览量

    48624
  • 时钟输出
    +关注

    关注

    0

    文章

    4

    浏览量

    5634
  • I2C驱动
    +关注

    关注

    0

    文章

    9

    浏览量

    7058
  • LVGL
    +关注

    关注

    1

    文章

    83

    浏览量

    2968

原文标题:基于RA8D1 MIPI DSI实现LVGL

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RA8D1加密引擎功能体验和实践

    本次实践完成了RA8D1芯片AES密钥封装和芯片上加解密功能验证
    的头像 发表于 11-23 01:01 337次阅读
    <b class='flag-5'>RA8D1</b>加密引擎功能体验和实践

    RA8D1试用活动】RA8D1B-CPKCOR开发板移植linux

    RA8D1试用活动】RA8D1B-CPKCOR开发板移植linux
    的头像 发表于 11-16 01:02 228次阅读
    【<b class='flag-5'>RA8D1</b>试用活动】<b class='flag-5'>RA8D1</b>B-CPKCOR开发板移植linux

    【瑞萨RA8D1 CPK开发板】RA8D1移植ThreadX操作系统

    首先感谢[RA生态工作室](瑞萨 RA MCU 生态社区)提供的瑞萨RA8D1 CPK开发板。 一、硬件介绍 瑞萨电子 RA8D1 MCU
    发表于 10-20 20:22

    【瑞萨RA8D1 CPK开发板试用】开箱与点灯

    安全加密、不带操作系统的,因此需参考“RA8D1 Group User\'s Manual:Hardware_Rev.1.00 Aug 2023.pdf”文档中的第四章节介绍,将下载地址改成不带安全加密
    发表于 10-08 01:04

    如何优雅的在OpenMV上使用LVGL

    板级适配得益于官方团队对RA8D1-VisionBoard的SDK贴心地维护,对于板级配置文件configuration.xml板载的摄像头、SDRAM、LCD、TOUCH等众多外设都已经配置好了
    的头像 发表于 07-31 08:36 1066次阅读
    如何优雅的在OpenMV上使用<b class='flag-5'>LVGL</b>

    RA MCU CANFD在FSP中的配置详解

    RA MCU CANFD在FSP中的配置详解
    的头像 发表于 06-19 08:06 535次阅读
    <b class='flag-5'>RA</b> MCU CANFD在<b class='flag-5'>FSP</b>中的<b class='flag-5'>配置</b>详解

    RA Overwrite模式在FSP中的支持

    前面介绍了MCUboot的基础知识,您可通过上方链接回顾,本章将着重介绍其中的Overwrite模式,以及FSP中如何配置、如Flash怎
    的头像 发表于 06-13 10:52 543次阅读
    <b class='flag-5'>RA</b> Overwrite模式在<b class='flag-5'>FSP</b>中的支持

    基于Arm Cortex-CM85内核的RA8D1作为控制器 通过MIPI DSI实现LVGL显示

    方案使用了瑞萨电子新一代基于Arm Cortex-CM85内核的RA8D1作为控制器,通过MIPI驱动程序和2D引擎加速显示,方案使用了适用于GUI的流行且免费的LVGL,创建了具有视觉吸引力的用户显示界面。
    的头像 发表于 06-07 15:20 1970次阅读
    基于Arm Cortex-CM85内核的<b class='flag-5'>RA8D1</b>作为控制器 通过MIPI DSI实现<b class='flag-5'>LVGL</b>显示

    基于瑞萨电子RA系列的野火耀阳RA8D1开发板产品简介

    野火耀阳RA8D1开发板是一款功能强大的开发板,适用于各种嵌入式应用开发。它采用瑞萨电子的RA系列R7FA8D1BHECBD微控制器作为主控,具有高性能和低功耗的特点。
    的头像 发表于 05-29 14:19 832次阅读
    基于瑞萨电子<b class='flag-5'>RA</b>系列的野火耀阳<b class='flag-5'>RA8D1</b>开发板产品简介

    【Vision Board创客营连载体验】RA8D1 Vision Board Camera 初体验

    Interface接口如下: LCD接口如下: 2 RA8D1 Camera与LCD配置 接下来配置Camera与LCD,只需要简单配置就可使用。双击工程中的
    发表于 04-27 08:50

    【Vision Board创客营连载体验】RA8D1 Vision Board 实现 FAL 同时调用片上以及外挂 Flash

    手册 【Vision Board创客营连载体验】RA8D1 Vision Board上的SPI实践(作者:大菠萝Alpha) 2.1 配置 RT-Thread Settings 英国威廉希尔公司网站 :Drivers
    发表于 04-24 17:31

    【Vision Board创客营连载体验】RA8D1 Vision Board初体验

    1 RA8D1 Vision Board简介 Vision-Board 开发板是 RT-Thread 推出基于瑞萨 Cortex-M85 架构 RA8D1 芯片,拥有Helium和TrustZone
    发表于 04-23 21:53

    RA8D1_数据手册

    RA8D1_数据手册
    发表于 03-19 17:43 1次下载

    瑞萨RA8D1 CEU介绍与使用说明

    RA8D1 MCU集成了高性能CM85内核和大内存,以及丰富的外设集,包括带并行RGB和MIPI-DSI接口的高分辨率TFT-LCD控制器、2D绘图引擎、16位摄像头接口和多个外部内存接口,经过优化可满足各种图形和视觉AI应用的
    的头像 发表于 02-20 12:15 2446次阅读
    瑞萨<b class='flag-5'>RA8D1</b> CEU<b class='flag-5'>介绍</b>与使用说明

    RA8D1微控制器组评估套件快速入门指南

    电子发烧友网站提供《RA8D1微控制器组评估套件快速入门指南.pdf》资料免费下载
    发表于 01-31 10:15 1次下载
    <b class='flag-5'>RA8D1</b>微控制器组评估套件快速入门指南