[ARM入门] 【每周分享】【瑞萨RA8D1 LVGL/LWIP评测】8、lvgl显示时间信息

[复制链接]
41|0
EPTmachine 发表于 2026-2-4 20:58 | 显示全部楼层 |阅读模式

@21小跑堂、#申请原创
【每周分享】【RA生态工作室-CPKRA8D1】1、开发板MIPI DSI运行Lvgl
https://bbs.21ic.com/icview-3503866-1-1.html
(出处: 21ic电子技术开**坛)

文中使用CPKRA8D1上的MIPI DSI屏幕运行lvgl示例程序,在此基础上,使用lvgl设计和代码生成工具GUI-Guider设计用于显示日历、天气和时间的lvgl界面。

1、GUI-Guider设计界面

使用GUI-Guider添加用于显示天气信息、时间信息和日历信息的控件,并生成代码。

GUI_Guider_panel_design.png

将生成的代码中的 customgenerated文件夹中的代码复制到e2studio工程中的 src文件夹。并在工程设置的 Paths and Symbols中的 GNU C页面中添加 customgeneraterd文件夹路径,将其中的代码加入到工程管理中。

add_path_to_project_settings.png

由于 clockcalender控件的使用,需要在 lvgl_conf_user.h中开启以下配置。

#ifndef LV_CONF_USER_H_
#define LV_CONF_USER_H_

#define LV_USE_PRIVATE_API 1

#endif /* LV_CONF_USER_H_ */

在代码中添加中以下代码调用用于在屏幕上显示时间、日历和天气标签控件。

#include "lvgl.h"

#include "gui_guider.h"
#include "events_init.h"
#include "custom.h"

lv_ui guider_ui;

/* New Thread entry function */
/* pvParameters contains TaskHandle_t */
void mipi_dsi_lvgl_thread_entry(void *pvParameters)
{
    FSP_PARAMETER_NOT_USED (pvParameters);

    /* TODO: add your own code here */

    lv_init();
    board_init();

    setup_ui(&guider_ui);
    events_init(&guider_ui);
    custom_init(&guider_ui);

    while (1)
    {
        lv_timer_handler();
        vTaskDelay(1);
    }
}

编译并烧录到开发板上的效果如下。

lvlg_effect.png

upload 附件:RA8D1_08_LVGL_Calendar.zip

2、结合lwip获取时间、天气信息显示

【每周分享】【瑞萨RA8D1 LVGL/LWIP评测】7、接入心知天气并显示天气信息
https://bbs.21ic.com/icview-3505577-1-1.html
(出处: 21ic电子技术开**坛)

上帖中的工程实现lwip使用HTTP获取天气信息和SNTP获取时间信息。在此基础上,添加lvgl显示功能的FreeRTOS线程,添加的过程中需要修改FreeRTOS的Heap内存堆大小。

inc_FreeRTOS_heap_size.png

创建用于传递时间信息的队列和任务同步的信号量。

FSP_add_tm_queueandbinary.png

其余的步骤和lvgl例程中的过程一致。lwip和lvgl线程同步的代码如下,在完成天气JSON数据的解析后,释放信号量,lvgl得到信号量得以运行。

void lwip_app_thread_entry(void *pvParameters)
{
    ....
    parse_weather_json(ret_data,weather_str);

    xSemaphoreGive(g_dataupdate_binary_semaphore);

}

void lvgl_app_thread_entry(void *pvParameters)
{
    FSP_PARAMETER_NOT_USED (pvParameters);
    xSemaphoreTake(g_dataupdate_binary_semaphore,portMAX_DELAY);
}

通过队列在SNTP信息更新函数中发送时间信息到lvgl线程中。

void sntp_set_system_time_us(uint32_t sec,uint32_t us)
{
    FSP_PARAMETER_NOT_USED(us);
    time_t ut;

    ut=(time_t)(sec-NTP_TIMESTAMP_DIFF);

    localtime_r(&ut,&sntp_tm);
    strftime(buf,sizeof(buf),"%d.%m.%Y %H:%M:%S",&sntp_tm);
    set_rtc_calendar_time(buf);
    printf("SNTP TIME:%s\r\n",buf);
    xQueueSend(g_tm_queue,&sntp_tm,portMAX_DELAY);
}

运行在lvgl线程的 setup_scr_screen.cvoid setup_scr_screen(lv_ui *ui)函数中添加异步获取时间信息、设置时钟控件和日历信息。在标签上显示天气信息的代码。

#include "time.h"

static struct tm g_set_time;

extern char weather_str[100];
static volatile uint16_t t_year;
static volatile int8_t   t_month;
static volatile int8_t   t_day;

void setup_scr_screen(lv_ui *ui)
{
    xQueueReceive(g_tm_queue, &g_set_time, portMAX_DELAY);

    ....
    t_year=(uint16_t)g_set_time.tm_year;
    t_month=(int8_t)g_set_time.tm_mon;
    t_day=(int8_t)g_set_time.tm_mday;

    t_month  +=  MON_ADJUST_VALUE;
    t_year +=  YEAR_ADJUST_VALUE;

    screen_calendar_1_today.year = t_year;
    screen_calendar_1_today.month = t_month;
    screen_calendar_1_today.day = t_day;
    lv_calendar_set_today_date(ui->screen_calendar_1, screen_calendar_1_today.year, screen_calendar_1_today.month, screen_calendar_1_today.day);
    ....

    //Write codes screen_digital_clock_1
    screen_digital_clock_1_min_value = g_set_time.tm_min;
    screen_digital_clock_1_hour_value = g_set_time.tm_hour;
    screen_digital_clock_1_sec_value = g_set_time.tm_sec;
    ....

}

编程并烧录代码到开发板。程序运行时出现卡死的问题,这时关闭FSP中的 Dcache选项。但是屏幕会出现花屏,数据不更新的问题,暂时没有解决办法。不过数据已经渲染到内存中,可以使用e2studio的Memory工具对内存数据进行查看和渲染。

Memory_tools.png

可以看到内存中已经有可用的显示数据,但由于未知原因,显示出现一些问题。

upload 附件:RA8D1_08_LWIP_LVGL_SNTP_RTC_HTTP.zip

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

1082

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部
0