一、 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 ==

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐