您现在的位置是:首页 >技术交流 >Hi3861 移植 LVGL网站首页技术交流

Hi3861 移植 LVGL

Top嵌入式 2024-06-17 11:27:51
简介Hi3861 移植 LVGL

一、前言

给 Hi3861 适配了硬件 spi ,master 模式下最高 spi 速率可以达到 40M,用来驱动 oled 屏幕。

适配过程遇到了一个芯片bug,困扰了很久,clk 管脚驱动能力差,需要外接一个上拉电阻才能正常运行。适配完成移植 lvgl 8,分享适配的过程。

二、LVGL移植

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

2.1 适配 Porting 层

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

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

2.2 头文件适配

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

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

2.3 liteos 线程适配

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

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

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

三、简单的 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 显示创建好的按键。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。