LVGL 定时器

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。

三、使用案例

  1. 案例一
    重复运行定时器

    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个滴答时钟
    }
    
  2. 案例二
    运行指定次数的定时器

    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);
    }
    
    
posted @ 2022-10-27 08:57  浇筑菜鸟  阅读(6552)  评论(0)    收藏  举报