三.设置心跳
在main.c文件中添加头文件:
#include "lvgl.h"//LVGL头文件引用
#include "lv_port_disp.h"//LVGL显示支持
#include "lv_port_indev.h"// LVGL的触摸支持
然后就可以在主函数中写入初始化代码了:
lv_init(); // LVGL 初始化
lv_port_disp_init(); // 注册LVGL的显示任务
lv_port_indev_init(); // 注册LVGL的触屏检测任务
心跳:lv_tick_inc(),LVGL内一个时基函数,它的所有任务调度都要依靠这个函数,所以这个函数必须要被间隔精确地调用。
增加LVGL的内部时间戳。
该时间戳用于计算动画的进度、定时器触发、任务调度等。
任务处理函数:lv_timer_handler()。
执行所有已注册的定时器回调函数。
处理 LVGL 的内部任务,例如动画、定时器重绘等。
1.赋予LVGL心跳
首先我们使用TIM创建一个定时器,以中断来为LVGL赋予心跳。笔者的开发平台是STM32F407,这里选择TIM6基本定时器。
由于TIM6挂载在APB1总线上,所以最高频率为84MHz, 所以PSC设置为84-1,同时ARR设置为1000-1,计算出来定时周期为1ms。
同时使能中断,并设置优先级为0(最高优先级):
然后生成文件,更新工程。在mian()主函数中,LVGL初始化之后调用定时器启动函数HAL_TIM_Base_Start_IT(&htim6)。
在main.c下面的用户代码区添加中断回调函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)
{
lv_tick_inc(1);//心跳函数
}
}
在回调函数中,我们调用lv_tick_inc(1)即设置1ms的心跳。
如果设置TIM产生2ms的中断,也可以写lv_tick_inc(2)。
2.开启任务调度
向main()主函数的while循环中添加5ms轮询调用:
while (1)
{
#ifdef USE_LVGL
static uint8_t LVGL_Timer_5ms = 0;//任务调度函数的5ms定时
HAL_Delay(1-1);
if(LVGL_Timer_5ms++ >= 5)
{
lv_timer_handler();//任务调度函数
LVGL_Timer_5ms = 0;
}
#else
#endif
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
这里为什么在主函数中调用而不在定时器中断里调用呢?主要是因为 lv_timer_handler()这个函数十分消耗资源,若在定时器中调用的话可能会霸占整个中断资源,我们初学时就知道不能在中断中处理过于复杂的任务,所以我们不在中断里去处理LVGL的任务调用。
编译后无错误:
至此,我们整个移植过程完全结束,接下来就可以进行功能地编写调试,开启真正的LVGL框架学习。