esp32移植lvgl
1.espidf常用命令
idf.py build
编译 需要在创建的目录下编译
idf.py create-project
文件名 创建工程
idf.py menuconfig
配置工程
idf.py fullclean
清空编译
idf.py flash monitor
烧录监听
q退出,ctrl + ] 空格是确认取消
2. lvgl移植
从乐鑫官网上拉取组件命令
idf.py add-dependency "lvgl/lvgl^8.3.10"
但是不全,不好使
直接拉取官方github源码
git clone --recursive https://github.com/lvgl/lvgl
cd lvgl
查看版本 git tag
按q退出 下箭头往下拉
git checkout
切换版本 比如 git checkout v8.3.10
2.1 lvgl移植步骤
- 初始化和注册lvgl显示驱动
- 初始化和注册lvgl输入设备驱动
- 初始化st7789硬件接口
- 初始化cst816t硬件接口
- 提供一个定时器给lvgl
2.1.1 输出设备配置
- 首先得定义一个静态缓冲区结构体 静态存储确保缓冲区的生命周期持续
static lv_disp_draw_buff_t = lv_disp_draw_bufff
- 计算缓冲区的大小,一般是屏幕的六分之1,七分之1
一般const size_t disp_buff_size h*w/6
LVGL最低要求3200字节,但是也不能比DMA大
配置DMA,定义单缓冲还是双缓冲
分配buff,这里得使用LVGL内部的分配内存方法
lv_color_t disp1 = heap_caps_malloc
使用了MALLOC_CAP_INTERNAL和MALLOC_CAP_DMA标志
判断分配是否成功,失败的话,退出
初始化缓存区
lv_disp_draw_buf_init
配置驱动参数
定义一个全局变量 lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv)
初始化默认参数
disp_drv.hor_res = LCD_WIDTH; disp_drv.ver_res = LCD_HEIGHT;
- 将驱动底层与lvgl联系起来,这里需要注册一个回调函数
lv_disp_drv_register(&disp_drv)
- 回调函数编写,首先定义一个这样的函数
void disp_flush(struct _lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
我们将x,y,*coloar_p依次写入屏幕,然后使用lv_disp_drv_ready(disp_drv)
通知lvgl刷新完整
2.1.2 输入设备配置
首先定义一个静态结构体
lv_indev_drv_t = indev_drv
初始结构体
lv_indev_init(&indev_drv)
配置
indev_drv.type
,我们一般使用触摸屏,所以选择LV_INDEV_TYPE_POINTER
indev.drv.callback = indev_read
设置输入设备的类型为指针设备(触摸屏),并将indev_read
函数作为读取触摸数据的回调函数。lv_indev_drv_register(&indev_drv)
注册回调函数
回调函数编写,首先定义一个这样的函数
void IRAM_ATTR indev_read(struct _lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
定义为IRAM_ATTR 放在中断,加快速率
回调函数获取,x,y,的坐标和按下和释放的状态,将数据填入到data中
2.1.3 初始化屏幕驱动
2.1.4 初始化触摸驱动
2.1.5 提供心跳
2.1.6 修改menuconfig
idf menuconfig
flash改成4M
psram 改成打开
cpu频率,240M
配置LVGL