一、前言
给 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 显示创建好的按键。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !