1.3寸AMOLED圆形屏+lvgl填坑记录(一)

开发环境

硬件:ESP32S3 + 1.3寸AMOLED(SPI接口,驱动芯片RM67162)
软件:Clion + ESP-IDF v5.0.1

序(墨迹)

之前在小黄鱼8块钱买了几片圆形AMOLED屏,无奈没有相关驱动资料智能在箱底吃灰,年初再次逛小黄鱼发现有个哥们儿卖这个屏并且提供驱动资料,看的我激动的立马下单买了10片,因为有资料所以屏幕也涨价了……
收到屏幕立马在ESP32上开始移植,加入了LVGL,亮屏,显示HelloWorld一切都是那么顺利,就当我以为完美驱动的时候,发现加入了spinner或者其他有关局部刷新的控件时候,屏幕显示错乱了,如图

之后我去找卖屏的哥们儿,哥们儿告诉我这个目前就是有这个问题,解决方法就是全屏刷新。这怎么能接受呢?全屏刷新帧率太低了,卡顿肯定很明显。无奈又无奈,找了很多地方,问了很多人,未果,这屏又去吃灰了……
前两天又想起来这个屏了,重新画了一个esp32的圆形屏板子
但是局部刷新问题还是没解决。在逛小黄鱼时候,另外一个哥们儿给我说git上有人提了issue已经解决问题了,找了又找还是没找到,最后在lvgl官方的文档中找到了解决办法。链接: lvgl doc.

具体原因和解决方法

原因

原因其实很简单,没看驱动芯片手册。驱动芯片手册中行列地址寄存器处有这么一段话,The SC[9:0] and EC[9:0]-SC[9:0]+1 must can be divisible by 2.什么意思呢?意思就是行列地址必须是偶数,这就一目了然了,只要保证写进2A和2B的值是偶数,这个问题就解决了么!

解决办法

解决办法就是在: lvgl doc.这里找到的。
使用disp_drv.rounder_cb回调去做一些关于行列地址的操作。

实现代码如下:
指定回调.

disp_drv.rounder_cb = example_rounder_cb;;

example_rounder_cb.

void example_rounder_cb(lv_disp_drv_t * disp_drv, lv_area_t * area)
{
    if(area->x1 % 2 != 0)
        area->x1 += 1;
    if(area->y1 % 2 != 0)
        area->y1 += 1;

    uint32_t w = (area->x2 - area->x1 + 1);
    uint32_t h = (area->y2 - area->y1 + 1);
    if(w % 2 != 0)
        area->x2 -= 1;
    if(h % 2 != 0)
        area->y2 -= 1;
}

目前我用的这种方法行得通。

总结

好了,至此目前的坑就算完美填上了,可以愉快的玩lvgl了。

说在最后:回过头来看,这个问题应该不是什么大问题,肯定有大佬遇到过并且早都解决了,可是在你遇到问题的时候就是找不到答案。水平有限,能力一般,给遇到同样问题的兄弟们提供个思路。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值