LVGL 8.0 以后好像取消了自定义任务模块,想要使用多线程只能使用系统的线程。
一、定时器结构体
typedef struct _lv_timer_t {
uint32_t period; // 定时器运行的频率
uint32_t last_run; // 定时器上次运行的时间
lv_timer_cb_t timer_cb; // 定时器注册的回调函数
void * user_data; // 用户自定义数据
int32_t repeat_count; // 重复次数,-1为永久重复,0为关闭,大于0为重复次数。
uint32_t paused : 1; // 定时器运行状态
} lv_timer_t;
二、常用函数
/* 创建定时器 */
lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data);
/* 删除定时器 */
void lv_timer_del(lv_timer_t * timer);
/* 使定时器挂起 */
void lv_timer_pause(lv_timer_t * timer);
/* 使定时器进入运行状态 */
void lv_timer_resume(lv_timer_t * timer);
/* 设置定时器的回调函数 */
void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t timer_cb);
/* 设置定时器的运行频率 */
void lv_timer_set_period(lv_timer_t * timer, uint32_t period);
/* 这里应该是读取定时器上次运行的时间 */
void lv_timer_ready(lv_timer_t * timer);
/* 设置定时器运行的次数 */
void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count);
/* 重置定时器运行的频率 */
void lv_timer_reset(lv_timer_t * timer);
/* 启用或禁用整个定时器处理 */
void lv_timer_enable(bool en);
/* 获取定时器空闲百分比 */
uint8_t lv_timer_get_idle(void);
/* 遍历定时器 */
lv_timer_t * lv_timer_get_next(lv_timer_t * timer);
注意: 这里定时器使用的滴答时钟是移植时运行lv_tick_inc()的时间,比如我10ms运行一次lv_tick_inc(),那么lvgl的周期设置为100时,对应的是 100*10ms = 1s。
三、使用案例
-
案例一
重复运行定时器lv_timer_t * lvgl_task1 = NULL; void lvgl_task1_cb(lv_timer_t * tmr) { LV_LOG_USER("timer test ......"); } void lvgl_gui_test(void) { lv_obj_t *test_label = lv_label_create(lv_scr_act()); lv_label_set_text(test_label, LV_SYMBOL_OK); // 正常显示,则应显示一个 ✓ 字符。 lv_obj_align(test_label, LV_ALIGN_CENTER, 0, 0); lvgl_task1 = lv_timer_create(lvgl_task1_cb, 1000, 0); // 运行周期为lvgl的1000个滴答时钟 }
-
案例二
运行指定次数的定时器lv_timer_t * lvgl_task1 = NULL; void lvgl_task1_cb(lv_timer_t * tmr) { LV_LOG_USER("timer test ......"); } void lvgl_gui_test(void) { lv_obj_t *test_label = lv_label_create(lv_scr_act()); lv_label_set_text(test_label, LV_SYMBOL_OK); // 正常显示,则应显示一个 ✓ 字符。 lv_obj_align(test_label, LV_ALIGN_CENTER, 0, 0); lvgl_task1 = lv_timer_create(lvgl_task1_cb, 1000, 0); // 运行周期为lvgl的1000个滴答时钟 lv_timer_set_repeat_count(lvgl_task1, 5); }