一、图片文件准备
1、下载GIF图片

从百度上搜索"太空人旋转动图",我是从这里下载的:
6c0db251ade468170dfc5e3306770ed95936bcc6.gif (350×350)
gif文件是350*350,分辨率相对屏幕略大。
2、gif图片按帧分割成静态图片
可以访问这个网站:
Ezgif - free online animated GIF editor
通过其中的Split功能可以将该gif分割成173个静态图片,

其中有重复的动作,前29个图片可以表示一个完整的旋转动作

3、修改图片大小
用画图就可以修改,调整为220*220

修改29个文件太麻烦,并且图片占用空间较大,最好做下取舍。取其中4张图片就是一个完整的旋转周期。
4、图片文件转换为LVGL格式
访问:Image Converter — LVGL

转换为LVGL格式:

二、程序部分
1、增加rtc配置

设置中断回调函数名及中断优先级

2、RTC程序部分
rtc初始化:
fsp_err_t rtc_init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_RTC_Open(&g_rtc0_ctrl, &g_rtc0_cfg);
return err;
}
设置每1秒进入一次periodic中断
fsp_err_t set_rtc_periodic_rate(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_RTC_PeriodicIrqRateSet(&g_rtc0_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND);
return err;
}
中断回调函数中修改标识
void rtc_callback(rtc_callback_args_t *p_args)
{
if(RTC_EVENT_ALARM_IRQ == p_args->event)
{
g_alarm_irq_flag = SET_FLAG;
}
else
{
g_periodic_irq_flag = SET_FLAG;
}
}
设置RTC当前时间:
fsp_err_tR_RTC_CalendarTimeSet (rtc_ctrl_t * const p_ctrl, rtc_time_t * const p_time)
{
fsp_err_t err = FSP_SUCCESS;
rtc_instance_ctrl_t * p_instance_ctrl = (rtc_instance_ctrl_t *) p_ctrl;
FSP_ASSERT(NULL != p_instance_ctrl);
FSP_ASSERT(p_time);
FSP_ERROR_RETURN(RTC_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN);
FSP_ERROR_RETURN(FSP_SUCCESS == r_rtc_time_and_date_validate(p_time), FSP_ERR_INVALID_ARGUMENT);
FSP_PARAMETER_NOT_USED(p_ctrl);
r_rtc_start_bit_update(0U);
R_RTC->RSECCNT = rtc_dec_to_bcd((uint8_t) p_time->tm_sec);
R_RTC->RMINCNT = rtc_dec_to_bcd((uint8_t) p_time->tm_min);
R_RTC->RHRCNT = rtc_dec_to_bcd((uint8_t) p_time->tm_hour) & RTC_RHRCNT_HOUR_MASK;
R_RTC->RWKCNT = rtc_dec_to_bcd((uint8_t) p_time->tm_wday);
R_RTC->RDAYCNT = rtc_dec_to_bcd((uint8_t) p_time->tm_mday);
R_RTC->RMONCNT = rtc_dec_to_bcd((uint8_t) (p_time->tm_mon + 1));
R_RTC->RYRCNT = rtc_dec_to_bcd((uint8_t) (p_time->tm_year - RTC_C_TIME_OFFSET));
if (RTC_CLOCK_SOURCE_SUBCLK == p_instance_ctrl->p_cfg->clock_source)
{
r_rtc_error_adjustment_set(p_instance_ctrl->p_cfg->p_err_cfg);
}
r_rtc_start_bit_update(1U);
return err;
}
3、太空人旋转动画部分
声明了4个IMG图片,并建立数组,通过frames_animing函数每500ms改变图片显示。
#include "lvgl.h"
LV_IMG_DECLARE(frame_000_delay_0)
LV_IMG_DECLARE(frame_008_delay_0)
LV_IMG_DECLARE(frame_016_delay_0)
LV_IMG_DECLARE(frame_024_delay_0)
const lv_img_dsc_t *frame_group[] = {
&frame_000_delay_0,
&frame_008_delay_0,
&frame_016_delay_0,
&frame_024_delay_0,
};
void frames_animing(void)
{
lv_obj_t* animimg1=lv_animimg_create(lv_scr_act());
lv_animimg_set_src(animimg1,frame_group,4);
lv_obj_align(animimg1, LV_ALIGN_CENTER, -20, 0);
lv_animimg_set_duration(animimg1,500);
lv_animimg_set_repeat_count(animimg1,LV_ANIM_REPEAT_INFINITE);
lv_animimg_start(animimg1);
}
4、更新时间显示函数
void update_Time_disp(void)
{
R_RTC_CalendarTimeGet(&g_rtc0_ctrl, &g_present_time);
rtc_date_readability_update(&g_present_time);
lv_label_set_text_fmt(label, "%02d:%02d:%02d",g_present_time.tm_hour,g_present_time.tm_min,g_present_time.tm_sec);
lv_obj_set_size(label, 256, 50);
lv_obj_align(label, LV_ALIGN_TOP_MID, 20, 110);
static lv_style_t style;
lv_style_init(&style);
lv_style_set_text_font(&style, &lv_font_montserrat_48);
lv_style_set_text_color(&style, lv_color_hex(0xFFFFFF));
lv_obj_add_style(label, &style, 0);
}
5、hal_entry函数
void hal_entry(void)
{
lv_init();
board_init();
static lv_style_t style_screen;
lv_style_init(&style_screen);
lv_style_set_bg_color(&style_screen, lv_color_hex(0x000000));
lv_style_set_bg_opa(&style_screen, LV_OPA_COVER);
lv_obj_add_style(lv_scr_act(), &style_screen, 0);
frames_animing();
rtc_init();
g_set_time.tm_hour=12;
g_set_time.tm_min=30;
g_set_time.tm_sec=30;
g_set_time.tm_year=2025;
g_set_time.tm_mon=10;
g_set_time.tm_yday=11;
R_RTC_CalendarTimeSet(&g_rtc0_ctrl, &g_set_time);
set_rtc_periodic_rate();
lv_obj_t *scr = lv_scr_act();
label= lv_label_create(scr);
while (1)
{
lv_timer_handler();
if(g_periodic_irq_flag==SET_FLAG)
{
g_periodic_irq_flag=RESET_FLAG;
update_Time_disp();
}
R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_MILLISECONDS);
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}