天天看点

龙芯+RT-Thread+LVGL实战笔记(5)——一个呼吸灯定时器

作者:南耿先生

过去的大半年时间,一直带着学生备战全国职业院校技能大赛“嵌入式系统应用开发”赛项。由于是首次参加该赛项,很多东西都是从0到1的摸索和积累。作为指导教师,备赛期间除了给予学生必要的指导,自己也花了不少精力研究了大赛指定的龙芯1B200嵌入式开发板,并尝试使用RT-Thread操作系统和LVGL图形组件,实现了样题的几十项任务,大大小小的版本也写了30多个,也算磕出点名堂了,部分效果如图1所示。

龙芯+RT-Thread+LVGL实战笔记(5)——一个呼吸灯定时器

图1 带两级任务按钮和部分功能(实时光照曲线)的效果

本着分享和开源精神,也为了给以后的参赛学生循序渐进的指导,于是就有了这个实战笔记系列。希望自己摸索的过程能给更多的嵌入式学习者一些指引,也为国产嵌入式处理器和国产嵌入式操作系统的推广助一点力。

由于个人能力和精力的限制,再加上龙芯嵌入式的开发资料十分有限,很多问题没法像STM32那样深入到库文件和寄存器的程度,还希望有见解的网友在这些问题上能给与点评和分享。最后,我想说的是,这个实战笔记不是面向0基础的朋友,起码得有龙芯嵌入式裸机的开发经验,了解RT-Thread操作系统的线程、定时器、信号量、邮箱等相关知识,知道LVGL图形用户界面开发的基本套路。

上一篇我们通过一个二级子线程 task1_thread 和一个三级子线程 rgb_blink_thread,搞定了“子任务1.1”的三色闪烁灯效果,也为任务和线程的规划构建了一个雏形。这一篇,我们延续这个套路,让“子任务1.2”呈现呼吸灯的效果,如图2所示。其利用的是RT-Thread中的软件定时器,除了线程,它也是一大利器。

龙芯+RT-Thread+LVGL实战笔记(5)——一个呼吸灯定时器

图2 “子任务1.2”实现呼吸灯效果

一、工程文件和线程框架

照例还是回看一下图3所示的工程文件和线程的整体脉络,并把上一次整个工程复制另存一份,作为1.3的版本,如图4所示,没有新增文件。

龙芯+RT-Thread+LVGL实战笔记(5)——一个呼吸灯定时器

图3 工程文件和线程的框架

龙芯+RT-Thread+LVGL实战笔记(5)——一个呼吸灯定时器

图4 复制另存新工程

二、编写源码

本工程新增的代码都补充在 task1.c 文件中,至于呼吸灯的实现原理,就不在这里科普了。如果在裸机程序中,延时和硬件定时器可以做到 us 级别的控制,呼吸灯的变化可以控制的很丝滑。但现在我们是放在RT-Thread的软件定时器中来实现,时钟节拍默认是 1/RT_TICK_PER_SECOND 秒。打开工程的 ./include/rtconfig.h 文件,可以看到 RT_TICK_PER_SECOND 默认为1000,如代码清单1所示,那么时钟节拍就是1ms。

龙芯+RT-Thread+LVGL实战笔记(5)——一个呼吸灯定时器

代码清单1 rtconfig.h文件中配置时钟节拍的宏

这个精度用来做呼吸灯控制也够了,但要控制好PWM的周期和同一组占空比的时长。本人是这么规划的,如图5所示,PWM周期为10ms,共9档亮度(占空比),每次累加10%(1ms)到90%,每档亮度维持250ms,这样走完呼气(由暗变亮)耗时约2.25s,吸气(由亮变暗)亦是如此。

龙芯+RT-Thread+LVGL实战笔记(5)——一个呼吸灯定时器

图5 呼吸灯相关时间控制示意图

2.1 呼吸灯定时器相关源码

这里把与呼吸灯定时器相关的控制块、启动标志、回调函数和初始化补充在 task1.c 文件中,如代码清单2所示。呼吸过程的控制在定时器的回调函数中,可以结合上面的图5来阅读源码。

龙芯+RT-Thread+LVGL实战笔记(5)——一个呼吸灯定时器

代码清单2 在task1.c中补充的呼吸灯定时器相关源码

2.2 任务1子线程入口函数的修改

由于新增了“子任务1.2”,且它与“子任务1.1”两者只能运行一个,因此启动其中一个的同时要退出另一个,与之相关的修改如代码清单3所示。

龙芯+RT-Thread+LVGL实战笔记(5)——一个呼吸灯定时器

代码清单3 在task1.c中修改任务1子线程入口函数

三、编译与测试

编译并下载程序后,其效果如下面的视频所示,同时,在串口终端还可以通过list_timer命令查看当前正在运行的线程和定时器,如图6所示。

龙芯+RT-Thread+LVGL实战笔记(5)——一个呼吸灯定时器

图7 查看运行的线程和定时器

视频加载中...

(本文完)