赞
踩
文章版本7.10,LVGL更新极快,不同版本配置方法可能存在差异
踩坑指南03里说到LVGL有一个内部的tick,需要Arduino定期执行lv_tick_inc()告知LVGL过去了多少时间。就这都能有个大坑(尤其是用ESP32并且要用到wifi的小伙伴们),前后换了三种方式才保证了时间准确和运行稳定,这篇文章就按照前后尝试的顺序写吧。
void loop()
{
/*
上边是其他语句
*/
lv_tick_inc(5);
delay(5);
}
这无疑是最简单的方式了,但是如此简单粗暴会导致LVGL的定时非常不准确;lv_tick_inc(5)这一语句执行的间隔是肯定大于5ms的,loop函数要是有别的事要干会更加严重。这样会导致运行时LVGL的画面卡顿,帧率完全上不去。
代码就不上了,Arduino使用定时器很方便,ESP32的定时器和其他开发板略有不同,想用百度即可。
用定时器每5ms触发一次中断执行lv_tick_inc(5),这种方法很完美啊,既精准又不影响其他函数的执行。没错,如果你没用到ESP32和Wifi库的话确实非常完美了。我一开始用了几天,那时候没上wifi,所以没有出现任何问题。后来加了WiFi库就出问题了:系统会随机重启。它可能在任何时间下突然白屏,然后反复重启,串口疯狂打印错误信息。
上百度查了一下,当时没注意串口打印的错误代码,就直接百度ESP32反复重启问题。有一位博主有类似经历并表示是电源带不动了。为了排除问题我重新画了一块板子,直接堆上3A的DCDC电源方案。新板子跑起来以后白屏重启的频率确实少了一些,但没有彻底解决而是更加随机了,你完全猜不到它什么时候就会犯病。
这时候注意到串口打印的是错误是Cache disabled but cached memory region accessed,按描述是Cache锁定期间有函数进行了访问导致ESP32核心发生严重错误并重启,Cache在中断期间是锁定的,所以我感觉和定时器中断有些关系。删掉定时器代码后确实再也没有重启过了。个人推测是定时器中断执行lv_tick_inc()的时候,wifi库跑去访问Cache了,直接把ESP32搞懵了。因为中断执行时间极短所以这种错误会随机出现。
定时器也用不了了,接下来就上第三种方法。
Arduino提供了一个神器:millis()函数,能够返回系统运行时间(ms)。
先上代码:
void loop()
{
long last_time = millis();
/*
中间是其他语句
*/
delay(5);
lv_tick_inc(int(millis() - last_time));
}
使用millis函数,我们就可以在执行lv_tick_inc()前实时计算出过去了多少时间,再传给LVGL,尽可能保证给LVGL的时间是准确的。LVGL的理论最大帧率会受lv_tick_inc()执行间隔限制,所以尽量别让loop()执行地太慢吧。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。