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移植步骤

  1. 初始化和注册lvgl显示驱动
  2. 初始化和注册lvgl输入设备驱动
  3. 初始化st7789硬件接口
  4. 初始化cst816t硬件接口
  5. 提供一个定时器给lvgl

2.1.1 输出设备配置

  1. 首先得定义一个静态缓冲区结构体 静态存储确保缓冲区的生命周期持续

static lv_disp_draw_buff_t = lv_disp_draw_bufff

  1. 计算缓冲区的大小,一般是屏幕的六分之1,七分之1

​ 一般const size_t disp_buff_size h*w/6

LVGL最低要求3200字节,但是也不能比DMA大

  1. 配置DMA,定义单缓冲还是双缓冲

  2. 分配buff,这里得使用LVGL内部的分配内存方法 lv_color_t disp1 = heap_caps_malloc

    使用了MALLOC_CAP_INTERNAL和MALLOC_CAP_DMA标志

  3. 判断分配是否成功,失败的话,退出

  4. 初始化缓存区 lv_disp_draw_buf_init

  5. 配置驱动参数

定义一个全局变量 lv_disp_drv_t disp_drv;

lv_disp_drv_init(&disp_drv) 初始化默认参数

disp_drv.hor_res = LCD_WIDTH; disp_drv.ver_res = LCD_HEIGHT;

  1. 将驱动底层与lvgl联系起来,这里需要注册一个回调函数

lv_disp_drv_register(&disp_drv)

  1. 回调函数编写,首先定义一个这样的函数

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 输入设备配置

  1. 首先定义一个静态结构体 lv_indev_drv_t = indev_drv

  2. 初始结构体lv_indev_init(&indev_drv)

  3. 配置indev_drv.type,我们一般使用触摸屏,所以选择LV_INDEV_TYPE_POINTER

  4. indev.drv.callback = indev_read设置输入设备的类型为指针设备(触摸屏),并将 indev_read 函数作为读取触摸数据的回调函数。

  5. 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