2-9-1_LVGL的定时器(lv_timer)-入门(上)
2-9-1_LVGL的定时器(lv_timer)-入门(上)
知识部分
Timers(定时器)
Create a timer(创建定时器) Ready and Reset(准备与重置) Set parameters(参数设置) Repeat count(设置重复次数)
Enable and Disable(启用和禁用) Pause and Resume(暂停和恢复) Measure idle time(测量空闲时间)
Timer handler resume callback(定时器处理程序恢复回调) Asynchronous calls(异步调用)
实践部分
问题1:
知识部分
Timers(定时器)
显示原文
LVGL有一个内置的定时器系统。您可以注册一个函数,让它定期被调用。这些定时器在 lv_timer_handler() 函数中进行处理和调用,该函数需要每隔几毫秒调用一次。更多信息请参阅 Porting 。
定时器是非抢占式的,这意味着一个定时器不能中断另一个定时器。因此,您可以在定时器中调用任何与LVGL相关的函数。
显示原文
要创建一个新定时器,使用 lv_timer_create(timer_cb, period_ms, user_data)。这将创建一个 lv_timer_t * 类型的变量,之后可以使用这个变量来修改定时器的参数。 lv_timer_create_basic() 也可以使用。这允许您在不指定任何参数的情况下创建一个新定时器。
定时器回调函数的原型应该是 void (*lv_timer_cb_t)(lv_timer_t *) 。
例如:
void my_timer(lv_timer_t * timer)
{
/*Use the user_data*/
uint32_t * user_data = timer->user_data;
printf("my_timer called with user data: %d\n", *user_data);
/*Do something with LVGL*/ if(something_happened) {
something_happened = false; lv_button_create(lv_screen_active(), NULL);
}
}
...
static uint32_t user_data = 10;
lv_timer_t * timer = lv_timer_create(my_timer, 500, &user_data);
/*可以通过 lv_timer_create 返回的定时器句柄 ”timer“ 变量,修改定时器的参数。
timer_cb:定时器回调函数原型:void (*lv_timer_cb_t)(lv_timer_t *)
period_ms:定时器执⾏周期,以毫秒(ms)为单位
user_data:⽤⼾数据,void *类型的指针*/
显示原文
lv_timer_ready(timer) 使定时器在下一次调用 lv_timer_handler() 函数时运行。直接去执行对应的timer不需要时间等待。


lv_timer_reset(timer) 重置定时器的周期。在定义的毫秒周期过去后,它将再次被调用。
Set parameters(参数设置)
显示原文
您可以稍后修改一些定时器参数:
lv_timer_set_cb(timer, new_cb) (设置新的回调函数)
lv_timer_set_period(timer, new_period) (设置新的时间周期)
lv_timer_set_user_data(timer, new_user_data); (设置新的⽤⼾数据)
显示原文
你可以使用 lv_timer_set_repeat_count(timer, count) 来让一个定时器只重复给定的次数。当定时器在被调用指定次数后将自动被删除。将计数设置为 -1 表示无限重复。
显示原文
你可以使用 lv_timer_enable(en) 来启用或禁用一个定时器。
显示原文
lv_timer_pause(timer) 暂停指定的定时器。
lv_timer_resume(timer) 恢复指定的定时器。
显示原文
您可以使用 lv_timer_get_idle 函数获取 lv_timer_handler() 函数的空闲百分比时间。 请注意,它并不测量整个系统的空闲时间,仅测量 lv_timer_handler() 的空闲时间。 如果您使用操作系统并在定时器中调用 lv_timer_handler() ,这可能会产生误导,因为它实际上不能测量操作系统在空闲线程中的消耗时间。
Timer handler resume callback(定时器处理程序恢复回调)
显示原文
lv_timer_handler 被停止后,如果你想要关注 lv_timer_handler 的唤醒时机,你可以使用 lv_timer_handler_set_resume_cb(cb, user_data) 来设置一个恢复回调函数。 回调函数的原型应该是 void (lv_timer_handler_resume_cb_t)(void)。
Asynchronous calls(异步调用)
显示原文
在某些情况下,您不能立即执行某个操作。例如,你不能删除一个对象,因为还有其他东西正在使用它,或者你现在不想阻塞执行。 对于这些情况,可以使用 lv_async_call(my_function, data_p) 在下一次调用 lv_timer_handler() 时调用 my_function 。 data_p``将在函数被调用时传递给该函数。请注意,只保存数据指针,因此您需要
确保在调用函数时变量仍然有效。 它可以是 *静态*、全局或动态分配的数据。如果您想要取消异步调 用,请调用 :cpp:expr: lv_async_call_cancel(my_function, data_p) , 它将清除与
``my_function 和 data_p 匹配的所有异步调用。
例如:
void my_screen_clean_up(void * scr)
{
/*释放与`scr`相关的一些资源*/
/*最后删除屏幕*/ lv_obj_delete(scr);
}
...
/*在当前屏幕上执行一些操作*/
/*在下一次调用`lv_timer_handler`时删除屏幕,而不是立即删除。*/ lv_async_call(my_screen_clean_up, lv_screen_active());
/*屏幕仍然有效,因此您可以对其进行其他操作*/
lv_bar_t * bar = lv_bar_create(lv_scr_act()); lv_obj_set_size(bar, 200, 20); lv_obj_center(bar);
lv_obj_set_style_anim_duration(bar, 1000, LV_PART_MAIN);
lv_bar_set_value(bar, 0, LV_ANIM_ON);
lv_timer_create(timer1, 1000, bar);
如果您只想删除一个对象,而不需要在 my_screen_cleanup 中进行任何清理操作, 可以直接使用 lv_obj_delete_async() ,它将在下一次调用 lv_timer_handler() 时删除该对象。
实践部分
在每次用定时器处理函数是不是必须要先得到对应的控件
/**********************
* STATIC FUNCTIONS
**********************/
static void timer1(lv_timer_t * timer)
{
lv_bar_t *bar = lv_timer_get_user_data(timer); static int value = 0;
value += 20; if(value > 100) {
value = 0;
}
lv_bar_set_value(bar, value, LV_ANIM_ON);
}

通过我的创建定时器的函数里第三个参数把我想操作的对应的变量来直接传进来,然后得到它操作即可这样更加方便。

浙公网安备 33010602011771号