LVGL9 定时器模块
文章目录
- 前言
- 定时器系统概述
- 特点
- 定时器的创建
- 函数:`lv_timer_create`
- 函数:`lv_timer_create_basic`
- 定时器的控制
- 函数:`lv_timer_ready`
- 函数:`lv_timer_reset`
- 定时器的参数设置
- 函数:`lv_timer_set_cb`
- 函数:`lv_timer_set_period`
- 函数:`lv_timer_set_repeat_count`
- 定时器的启用与暂停
- 函数:`lv_timer_enable`
- 函数:`lv_timer_pause` 和 `lv_timer_resume`
- 异步调用
- 函数:`lv_async_call`
- 测量空闲时间
- 函数:`lv_timer_get_idle`
- 总结
前言
在嵌入式图形开发中,定时任务是一个非常常见的需求,通常用于实现周期性操作或延迟功能。LVGL 提供了内置的定时器(Timer)系统,允许开发者注册回调函数,并在指定的时间间隔内调用这些函数。本文将详细介绍 LVGL 定时器系统的功能、使用方法以及相关的 API。
定时器系统概述
LVGL 的定时器系统允许用户注册函数并在指定的时间间隔内周期性调用。所有定时器的回调函数由 lv_timer_handler() 函数统一调度,因此需要在程序中定期调用 lv_timer_handler()(通常在主循环中)。
特点
- 非抢占式:定时器无法中断其他定时器或任务,因此可以在定时器中安全调用任何 LVGL 函数。
- 灵活性:支持动态设置定时器周期、回调函数、重复次数等参数。
定时器的创建
函数:lv_timer_create
作用
创建一个新的定时器并指定其回调函数和调用周期。
原型
lv_timer_t * lv_timer_create(lv_timer_cb_t timer_cb, uint32_t period_ms, void * user_data);
参数
timer_cb:回调函数指针,格式为void (*lv_timer_cb_t)(lv_timer_t *)。period_ms:定时器的调用周期(毫秒)。user_data:用户自定义数据,可在回调函数中通过timer->user_data访问。
返回值
返回一个 lv_timer_t * 指针,用于管理创建的定时器。
示例代码
void my_timer_callback(lv_timer_t * timer) {uint32_t * user_data = timer->user_data;printf("Timer called, user data: %d\n", *user_data);
}static uint32_t my_data = 42;
lv_timer_t * timer = lv_timer_create(my_timer_callback, 1000, &my_data);
函数:lv_timer_create_basic
作用
创建一个基本定时器,不需要指定初始参数。
原型
lv_timer_t * lv_timer_create_basic(void);
返回值
返回一个未初始化的 lv_timer_t * 指针。可以稍后设置其参数。
示例代码
lv_timer_t * timer = lv_timer_create_basic();
lv_timer_set_cb(timer, my_timer_callback);
lv_timer_set_period(timer, 500);
定时器的控制
函数:lv_timer_ready
作用
使定时器在下次调用 lv_timer_handler() 时立即执行。
原型
void lv_timer_ready(lv_timer_t * timer);
参数
timer:目标定时器。
示例代码
lv_timer_ready(timer);
函数:lv_timer_reset
作用
重置定时器的周期,使其在指定的时间间隔后再次执行。
原型
void lv_timer_reset(lv_timer_t * timer);
参数
timer:目标定时器。
示例代码
lv_timer_reset(timer);
定时器的参数设置
函数:lv_timer_set_cb
作用
更改定时器的回调函数。
原型
void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t new_cb);
示例代码
lv_timer_set_cb(timer, new_timer_callback);
函数:lv_timer_set_period
作用
修改定时器的调用周期。
原型
void lv_timer_set_period(lv_timer_t * timer, uint32_t new_period);
示例代码
lv_timer_set_period(timer, 2000); // 修改周期为 2 秒
函数:lv_timer_set_repeat_count
作用
设置定时器的重复次数,自动删除达到次数的定时器。
原型
void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t count);
参数
count:重复次数,-1表示无限循环,0表示不重复。
示例代码
lv_timer_set_repeat_count(timer, 5); // 定时器运行 5 次后自动删除
定时器的启用与暂停
函数:lv_timer_enable
作用
启用或禁用定时器。
原型
void lv_timer_enable(lv_timer_t * timer, bool en);
示例代码
lv_timer_enable(timer, true); // 启用定时器
lv_timer_enable(timer, false); // 禁用定时器
函数:lv_timer_pause 和 lv_timer_resume
作用
暂停或恢复指定的定时器。
原型
void lv_timer_pause(lv_timer_t * timer);
void lv_timer_resume(lv_timer_t * timer);
示例代码
lv_timer_pause(timer); // 暂停定时器
lv_timer_resume(timer); // 恢复定时器
异步调用
函数:lv_async_call
作用
延迟调用一个函数,在下次调用 lv_timer_handler() 时执行。
原型
void lv_async_call(lv_async_cb_t async_cb, void * user_data);
示例代码
void cleanup_function(void * data) {lv_obj_delete((lv_obj_t *)data);
}lv_async_call(cleanup_function, lv_screen_active());
测量空闲时间
函数:lv_timer_get_idle
作用
获取 lv_timer_handler() 的空闲时间百分比。
原型
uint8_t lv_timer_get_idle(void);
返回值
一个 0-100 的值,表示空闲时间百分比。
示例代码
uint8_t idle = lv_timer_get_idle();
printf("Idle time: %d%%\n", idle);
总结
LVGL 的定时器系统提供了强大的功能,支持各种灵活的定时任务管理方式,从基本的周期调用到复杂的异步操作,都可以通过简单的接口实现。掌握这些 API,可以帮助开发者更高效地设计和实现图形界面的动态行为。
相关文章:
LVGL9 定时器模块
文章目录 前言定时器系统概述特点 定时器的创建函数:lv_timer_create函数:lv_timer_create_basic 定时器的控制函数:lv_timer_ready函数:lv_timer_reset 定时器的参数设置函数:lv_timer_set_cb函数:lv_time…...
Qt学习笔记第51到60讲
第51讲 记事本实现打开功能 回到第24个功能文件Notepad,给UI中的各个控件添加槽函数。 ①开始按钮 void Widget::on_btnOpen_clicked() {QString fileNameQFileDialog::getOpenFileName(this,tr("Open File"),"E:\\6_Qt Projects\\24_Notepad\\fi…...
网页设计--axios作业
根据以下mock地址中的json数据,使用axios异步方式获取并显示在页面中。 https://apifoxmock.com/m1/3761592-3393136-default/peotfindAll?apifoxApiId171582689 {"code": 1,"msg": "success","data": [{"id": …...
SpringBoot 整合 Avro 与 Kafka 详解
SpringBoot 整合 Avro 与 Kafka 详解 在大数据处理和实时数据流场景中,Apache Kafka 和 Apache Avro 是两个非常重要的工具。Kafka 作为一个分布式流处理平台,能够高效地处理大量数据,而 Avro 则是一个用于序列化数据的紧凑、快速的二进制数…...
若依 ruoyi VUE el-select 直接获取 选择option 的 label和value
1、最新在研究若依这个项目,我使用的是前后端分离的方案,RuoYi-Vue-fast(后端) RuoYi-Vue-->ruoyi-ui(前端)。RuoYi-Vue-fast是单应用版本没有区分那么多的modules 自己开发起来很方便,这个项目运行起来很方便,但是需要自定义的…...
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
修改MySQL存储路径
1.查看原路径 show variables like ‘%datadir%’; 2.停止MYSQL 以管理员身份运行命令提示符 net stop MySQL84 在服务中直接停止MySQL 3.编辑配置文件 可能会遇到无权限修改,可以先修改my.ini的权限。可以通过:右键my.ini → 属性 → 安全→ 编辑 …...
Git常用的命令【提交与回退】
git分布式版本控制系统 (SVN集中式版本控制系统)之间的对比 git有本地仓库和远程仓库,不同的开发人员可以分别提交自己的本地仓库并维护代码的版本控制。 然后多个人员在本地仓库协作的代码,可以提交到远程仓库中做整合。 git本…...
详解:HTTP/HTTPS协议
HTTP协议 一.HTTP是什么 HTTP,全称超文本传输协议,是一种用于分布式、协作式、超媒体信息系统的应用层协议。HTTP往往是基于传输层TCP协议实现的,采用的一问一答的模式,即发一个请求,返回一个响应。 Q:什…...
0.96寸OLED---STM32
一、简介 OLED:有机发光二极管 OLED显示屏:性能优异的新型显示屏,具有功耗低(相比LCD不需要背光源,每一个节点当度发光)、响应速度快、宽视角(自发光,从任何视角看都比较清晰&…...
保姆级教学 uniapp绘制二维码海报并保存至相册,真机正常展示图片二维码
一、获取二维码 uni.request({url: https://api.weixin.qq.com/wxa/getwxacode?access_token${getStorage("token")},responseType: "arraybuffer",method: "POST",data: {path: "/pages/index/index"},success(res) {// 转换为 Uint…...
常用Vim操作
vimrc配置 ctags -R * 生成tags文件 set number set ts4 set sw4 set autoindent set cindent set tag~/tmp/log/help/tags 自动补全: ctrln:自动补全 输入: a:从当前文字后插入i:从当前文字前插入s: 删除当前字…...
【C#】NET 9中LINQ的新特性-CountBy
前言 在 .NET 中,使用 LINQ 对元素进行分组并计算它们的出现次数时,需要通过两个步步骤。首先,使用 GroupBy方法根据特定键对元素进行分类。然后,再计算每个组元素包含个数。而随着 .NET 9 版本发布,引入了一些新特性。其中 LINQ 引入了一种新的方法 CountBy,本文一起来了…...
Trimble X9三维激光扫描仪高效应对化工厂复杂管道扫描测绘挑战【沪敖3D】
化工安全关系到国计民生,近年来随着化工厂数字化改革不断推进,数字工厂逐步成为工厂安全管理的重要手段。而化工管道作为工厂设施的重要组成部分,由于其数量多、种类繁杂,一直是企业管理的重点和难点。 传统的化工管廊往往缺乏详…...
【数据结构】文件和外部排序
外部排序 外存信息的存取 计算基本存储方式 内部存储(主存):断电后数据会丢失,访问速度快,成本高容量通常较小外部存储(辅存):断电后数据不会丢失,访问速度较慢&#x…...
新手学习:网页前端、后端、服务器Tomcat和数据库的基本介绍
首先一点,不管是那个框架开发的网页前端,最后都需要Build,构建完毕以后都是原始的HTML CSS JS 三样文件! 网页前端 目录结构 在开始开发网站之前,首先需要了解如何组织文件。一个简单的网页项目通常会有以下几个文件夹和文件&…...
机器学习贝叶斯模型原理
一、引言 在机器学习与数据分析的广袤天地中,贝叶斯模型犹如一颗璀璨的明星,闪耀着独特的光芒,为众多领域的分类、预测等任务提供了强大的理论支撑与实用解法。然而,对于许多初涉此领域的小伙伴而言,贝叶斯模型背后的…...
【C++】实现100以内素数的求解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯代码概览💯代码结构与逻辑分析1. 包含的头文件和命名空间2. 素数判断函数 isPrime功能输入与输出核心逻辑数学背景 3. 主函数 main功能核心逻辑输出示例 &#…...
Python 浏览器自动化新利器:DrissionPage,让网页操作更简单!
Python 浏览器自动化新利器:DrissionPage,让网页操作更简单! 文章目录 Python 浏览器自动化新利器:DrissionPage,让网页操作更简单!🚀 引言🌟 DrissionPage简介🛠️ 三大…...
Rust学习笔记_13——枚举
Rust学习笔记_10——守卫 Rust学习笔记_11——函数 Rust学习笔记_12——闭包 枚举 文章目录 枚举1. 定义1.1 无值变体1.2 有值变体1.3 枚举与泛型的结合 2. 使用2.1 和匹配模式一起使用2.2 枚举作为类型别名 3. 常用枚举类型 在Rust编程语言中,枚举(enum…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
