Hi3861移植LVGL教程

描述

一、前言

给 Hi3861 适配了硬件 spi ,master 模式下最高 spi 速率可以达到 40M,用来驱动 oled 屏幕。适配过程遇到了一个芯片bug,困扰了很久,clk 管脚驱动能力差,需要外接一个上拉电阻才能正常运行。适配完成移植 lvgl 8,分享适配的过程。

LVGL

二、LVGL移植

上lvgl开源仓搞代码,https://github.com/lvgl/lvgl

2.1 适配 Porting 层

关键点在于将 oled 的画点函数和 lvgl 代码 disp_flush 关联起来。参考如下我的移植,此处 draw point 将画点数据放到一个软件 buff 里面不会刷新硬件,硬件的刷新我单独创建一个线程干这活,所以使用 for 循环遍历,简单!

LVGL

因为只有一个显示,没有适配输入以及文件系统,这两个 port 的适配之后再做。

2.2 头文件适配

因为是 oled,只有单色,所以颜色我选了最低8 位色,同时将 lvgl 字体调整为 8 位。

除此之外就是调整 lv_conf.h 里面的屏幕宽度了,其他的可以再后续修改。

LVGL

2.3 liteos 线程适配

首先适配 lvgl tick 心跳,创建一个软件定时器,1ms 自加 1:

LVGL

再创建一个软件定时器周期性的调用 lvgl 的 周期处理函数:

LVGL

前面说的我的 oled 的 spi 硬件刷新在单独的线程里面执行,中断回调的方式,每次刷新256字节,刷新器件,刷新线程会被挂起,释放 cpu 资源,线程设计如下:

LVGL

三、简单的 Demo

写一个简单的 buttom demo:

static void lvgl_ui_init(void)
{
    static lv_style_t style;
    lv_style_init(&style);
    lv_style_set_radius(&style, 2);
    lv_style_set_outline_width(&style, 2);
    lv_style_set_outline_color(&style, lv_palette_main(LV_PALETTE_BLUE));
    lv_style_set_outline_pad(&style, 0);
    lv_obj_t  *bkg_obj = lv_obj_create(lv_scr_act());   /*创建  obj*/
    lv_obj_set_style_bg_color(bkg_obj , lv_color_hex(0x0),0);
    lv_obj_set_pos(bkg_obj ,0, 0);
    lv_obj_set_size(bkg_obj, 128, 64);
    lv_obj_t *btn = lv_btn_create(lv_scr_act());      /*Add a button to the current screen*/
    lv_obj_set_style_bg_color(btn , lv_color_hex(0x0),0);
    lv_obj_set_size(btn, 70, 24);                     /*Set its  size*/
    lv_obj_add_style(btn, &style, 0);
    lv_obj_center(btn);
    lv_obj_t * label = lv_label_create(btn);           /*Add a label to the button*/
    lv_label_set_text(label, "Button");                      /*Set the labels  text*/
}

四、下载运行

可以看到 oled 显示创建好的按键。

LVGL

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分