@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添加用于显示天气信息、时间信息和日历信息的控件,并生成代码。

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

由于 clock和 calender控件的使用,需要在 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);
}
}
编译并烧录到开发板上的效果如下。

附件: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内存堆大小。

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

其余的步骤和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.c中 void 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工具对内存数据进行查看和渲染。

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