LVGL使用方法(精简)
·
一、 LVGL准备条件
1,lvgl源码。(移植到项目中)
2,squreline studio (用于快速构建界面可以直接生成UI代码直接使用 ,提高效率)
3,带屏幕工程项目,项目带屏幕驱动,能实现画点函数。画矩形函数。
4,画图软件可以用figma软件 ,很好用。
二、 开发步骤
1,首先确保工程正常驱动屏幕。
2,移植好lvgl,随便显示一个组件。
3,使用squreline studio 实现一个组件的显示。
三、注意事项。
1,修改启动文件的栈空间,堆可以设置0。因为lvgl虽然写的是不过实际上实现并不是堆。
2,修改 LV_MEM_SIZE 改到合适大小
#define LV_MEM_SIZE (32U * 1024U)
3,lvgl心跳时钟函数我是放到滴答定时器的钩子函数中实现
void vApplicationTickHook( void )
{
lv_tick_inc(1);
}
4,lvgl动画句柄我使用了单独线程
__weak void lv_tick_Start(void *argument)
{
for(;;)
{
lv_timer_handler();
osDelay(10);
}
}
四、优化
1,开启双缓冲
/* Example for 2) */
static lv_disp_draw_buf_t draw_buf_dsc_2;
static lv_color_t buf_2_1[MY_DISP_HOR_RES * 60]; /*A buffer for 10 rows*/
static lv_color_t buf_2_2[MY_DISP_HOR_RES * 60]; /*An other buffer for 10 rows*/
lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, MY_DISP_HOR_RES * 60); /*Initialize the display buffer*/
/*Set a display buffer*/
disp_drv.draw_buf = &draw_buf_dsc_2;
2,屏幕画点函数改为画矩形函数
3,使用DMA实现,DMA传输完成回调函数运行绘制完成
//回调函数
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi == &hspi3) {
lv_disp_flush_ready(&disp_drv);
}
}
static void disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
if (disp_flush_enabled) {
my_LCD_FillRect(area->x1, area->y1, area->x2, area->y2, (uint16_t *)color_p);
}
// 不再立即调用 lv_disp_flush_ready()
}
//绘制矩形函数
void my_LCD_FillRect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t *color)
{
address( x, y, width, height);
RS_HIGH;
HAL_SPI_Transmit_DMA(&hspi3, (uint8_t *)color, (width-x+1)*(height-y+1));
}
4,SPI首先设置8bit,DMA设置16BIT。 完成LCD初始化后将SPI设置成16bit,这样速度更快。
五、问题
1,改横竖屏,需要屏幕驱动,Squareline studio ,LVGL长宽像素一起改 为横或者竖
==2,使用ttf字库做中文报错 ,c/C++ misc conrtols 添加 --no-multibyte-chars ==
更多推荐

所有评论(0)