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

    文章

    37

    浏览量

    11767
  • MIPI
    +关注

    关注

    10

    文章

    276

    浏览量

    47769
  • 时钟输出
    +关注

    关注

    0

    文章

    4

    浏览量

    5587
  • I2C驱动
    +关注

    关注

    0

    文章

    9

    浏览量

    7005
  • LVGL
    +关注

    关注

    0

    文章

    75

    浏览量

    2403

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

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

收藏 人收藏

    评论

    相关推荐

    【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

    【Vision Board创客营连载体验】RA8D1 Vision Board上的SPI实践

    Vision-Board 开发板是 RT-Thread 推出基于瑞萨 Cortex-M85 架构 RA8D1 芯片,为工程师们提供了一个灵活、全面的开发平台,助力开发者在机器视觉领域获得更深
    发表于 04-22 23:56

    RA8D1_User’s Manual.pdf

    *附件:RA8D1_User’s Manual.pdf
    发表于 03-20 15:20

    RA8D1_Datasheet.pdf

    *附件:RA8D1_Datasheet.pdf
    发表于 03-20 14:19

    瑞萨RA8D1 CEU介绍与使用说明

    RA8D1 MCU集成了高性能CM85内核和大内存,以及丰富的外设集,包括带并行RGB和MIPI-DSI接口的高分辨率TFT-LCD控制器、2D绘图引擎、16位摄像头接口和多个外部内存接口,经过优化可满足各种图形和视觉AI应用的需求。
    的头像 发表于 02-20 12:15 1443次阅读
    瑞萨<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>微控制器组评估套件快速入门指南

    瑞萨电子宣布推出RA8D1微控制器(MCU)产品群

    2023年12月12日,瑞萨电子宣布推出RA8D1微控制器(MCU)产品群。RA8D1产品群作为瑞萨RA8系列的第二款产品,RA8是基于Arm® Cortex®-M85处理器的首款MC
    的头像 发表于 12-15 15:58 574次阅读
    瑞萨电子宣布推出<b class='flag-5'>RA8D1</b>微控制器(MCU)产品群

    RA MCU CANFD在FSP中的配置详解

    在瑞萨RA系列MCU产品中,目前RA4E2、RA4T1、RA6E2、RA6T2和RA6T3搭载了
    的头像 发表于 10-20 14:46 629次阅读
    <b class='flag-5'>RA</b> MCU CANFD在<b class='flag-5'>FSP</b>中的<b class='flag-5'>配置</b>详解

    使用FSP配置RA的CAN模块(下)

    使用FSP配置RA的CAN模块
    的头像 发表于 08-05 08:08 141次阅读
    使用<b class='flag-5'>FSP</b><b class='flag-5'>配置</b><b class='flag-5'>RA</b>的CAN模块(下)

    使用FSP配置RA的CAN模块(上)

    使用FSP配置RA的CAN模块
    的头像 发表于 08-05 08:08 154次阅读
    使用<b class='flag-5'>FSP</b><b class='flag-5'>配置</b><b class='flag-5'>RA</b>的CAN模块(上)

    使用瑞萨e² studio FSP基于RA2E1定时器配置PWM输出

    使用瑞萨e² studio FSP基于RA2E1定时器配置PWM输出
    的头像 发表于 08-01 00:13 176次阅读
    使用瑞萨e² studio <b class='flag-5'>FSP</b>基于<b class='flag-5'>RA</b>2E1定时器<b class='flag-5'>配置</b>PWM输出

    瑞萨MCU RA6T2的16位模数转换器操作 [4] 配置RA6T2 ADC模块 (1)

    顾 《RA6T2硬件用户手册》 (HW UM) 中指定的以及/或者可使用灵活配置软件包 (FSP) API进行配置的ADC外设的
    的头像 发表于 07-24 17:45 640次阅读
    瑞萨MCU <b class='flag-5'>RA</b>6T2的16位模数转换器操作 [4] <b class='flag-5'>配置</b><b class='flag-5'>RA</b>6T2 ADC模块 (1)

    【瑞萨RA MCU创意氛围赛】1. PWM驱动LED以及STLINK下载配置

    启明RA6M5的原理图,查看LED线路连接: LED1 --> P400 LED2 --> P403 LED3 --> P404 打开数据手册查看这三个引脚连接
    发表于 05-26 10:01

    【瑞萨FPB-RA6E1快速原型板】开箱&amp;开发环境配置

    ,选择正确的IDE。 既然有FPB-RA6E1,那我就不好意思了,直接选择,哈哈,工作summary如下。 本次主要是点灯,FPB-RA6E1带2个LED。 可以看出在P407和P408上,那就配置
    发表于 05-22 23:23