[STM32U5]【NUCLEO-U575ZI-Q测评】移植LVGL8.2 到ILI9488显示部分

STM32U575有点150MHz的运行频率,今天试用ILI9488移植LVGL8.2
1、硬件准备:NUCLEO-U575ZI开发板、ILI9488SPILCD屏。
2、软件准备:原子lvgl8.2源码、MDK5、stm32cubeMX
【移植过程】
1、配置spi1,打开stm32cubeMX配置spi如下:
[attach]2085158[/attach]

2、配置TIM6定时器
[attach]2085162[/attach]
3、时钟等其他配置不在这里着重描述。然后生成mdk工程。
4、用中mdk打开工程,添加ili9488驱动,程序见附件:5、该工程的 目录下新建 LVGL 文件夹,并在该文件夹下新建 GUI 文件夹和 GUI_APP 文件夹,最后在 GUI 文件夹下新建 lvgl 文件夹。具体的文件夹结构如下图所示:

 


6、复制 LVGL 源码到工程中/GUI/lvgl 路径下
7、添加如下图所示的分组



8、往/lvgl/src/core 分组中添加 core 文件夹下的全部.c 文件9、往/lvgl/src/draw 组中添加 draw 文件夹下除 nxp_pxp、nxp_vglite、sdl 和stm32_dma2d 文件夹之外的全部.c 文件。
10、往lvgl/src/extra 组中添加 extra 文件夹下除了 lib 文件夹之外的全部.c 文件
11、往 lvgl/src/font 组中添加 font 文件夹下的全部.c 文件
12、往 /lvgl/src/gpu 组中添加 draw/stm32_dma2d 和 draw/sdl文件夹下的全部.c文件。
13、往 /lvgl/src/hal 组中添加 hal 文件夹下的全部.c 文件。
14、往lvgl/src/misc 组中添加 misc 文件夹下的全部.c 文件。
15、往 lvgl/src/widgets 组中添加 widgets 文件夹下的全部.c 文件。
16、往lvgl/examples/porting 组添加 /lvgl/examples/porting目录下的 lv_port_disp_template.c 和 lv_port_indev_template.c 文件。
17、添加头文件路径移植 LVGL 只需要添加关键的头文件路径即可,因为 lvgl.h 文件已经为我们省去了很多包含头文件的操作,添加的头文件路径如下图所示

 18、添加定时器
在Timer6的回调函数中添回如下:

/* USER CODE BEGIN 1 */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

        if(htim->Instance==TIM6)

                {

       lv_tick_inc(1); /* lvgl 1ms时基*/

                }



}

/* USER CODE END 1 */

19、配置显示屏驱动
/lvgl/examples/porting 分组中的 lv_port_disp_template.c/h(显示屏相关)2 个文件中的条件编译指令#if 0 都
修改成#if 1,如下源码所示:
修改前:
#if 0 /* lv_port_disp_template.c/h
修改后:
#if 1 /* 把#if 0 修改成#if 1 */
修改 lv_port_disp_template.c 文件
该文件用于配置显示屏,它可以将用户的底层显示驱动与 LVGL的显示驱动衔接起来。我们打开官方提供的 lv_port_disp_template.c 文件
添加ili9488驱动头文件引用:
#include "ILI9488.h"
设置屏分辨率
#define MY_DISP_HOR_RES (320) /* 宽 */
#define MY_DISP_VER_RES (480) /* 高 */

设置注释掉lv_disp_draw_buf_t draw_buf_dsc_1、lv_disp_draw_buf_t draw_buf_dsc_2,保留
    /* Example for 3) also set disp_drv.full_refresh = 1 below*/
    static lv_disp_draw_buf_t draw_buf_dsc_3;
    static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES];            /*A screen sized buffer*/
    static lv_color_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES];            /*Another screen sized buffer*/
    lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2, MY_DISP_VER_RES * 480);   /*Initialize the display buffer*/

修改块显示函数如下:

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/

    int32_t x;
    int32_t y;
                uint16_t width=320;
                uint16_t height=480;
                uint32_t i, n, cnt, buf_size,h,w;
                uint8_t r,g,b;
                w = area->x2- area->x1;
                h = area->y2- area->y1;
                setAddrWindow(area->x1, area->y1, area->x2, area->y2); //设置显示块大小
                n = w*h*3;
                n = w*h*3;
       //割分发送给屏
        if (n <= 65535){
                cnt = 1;
                buf_size = n;
        }
        else {
                cnt = n/3;
                buf_size = 3;
                uint8_t min_cnt = n/(65535)+1;
                for (i=min_cnt; i < n/3; i++){
                        if(n%i == 0){
                                cnt = i;
                                buf_size = n/i;
                                break;
                        }
                }
        }
        
        DC_DATA();
        CS_A();
                while(cnt>0)
                {
                        uint8_t frm_buf[buf_size];
                        for (i=0; i < buf_size/3; i++)
                        {
                                r = (((color_p->full & 0xF800) >> 11) * 255) / 31;
                                g = (((color_p->full & 0x07E0) >> 5) * 255) / 63;
                                b = (color_p->full & 0x001F * 255) / 31;
                                frm_buf[i*3] = r;
                                frm_buf[i*3+1] = g;
                                frm_buf[i*3+2] = b;
                                 color_p++;
                        }
                        //HAL_SPI_Transmit(&hspi1, frm_buf, buf_size, HAL_MAX_DELAY);
                        HAL_SPI_Transmit(&hspi1, frm_buf, buf_size, 10);
                        cnt -= 1;
                }
                CS_D();
               
        
    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
}

 20、添加官方demo中的lv_demo_widgets();
把demo中的widgets拷贝到GUI_APP目录下,增加demo/widgets目录,把widgets目录下的C文件全部添时来:
[attach]2085172[/attach]
然后添加头文件的文件夹的路径。
21、修改main.c添回用户代码,实现功能:

 

 ILI9488_Init();



        lv_init(); /* lvgl ????? */

 lv_port_disp_init(); /* lvgl ???????,?? lv_init()??? */



 lv_obj_t *label = lv_label_create(lv_scr_act());

 lv_label_set_text(label,"Hello STM32U575!!!\n HELLO 21ic!!!");

 lv_obj_center(label);

 lv_demo_widgets();

  /* USER CODE END 2 */

        

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

                lv_timer_handler(); /* LVGL ??????? RTOS ???????? */

                HAL_Delay(5);

    /* USER CODE END WHILE */



    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */



实现效果如图


到这里lvgl的显示屏的移植就告一段落。还差触摸没有完成。
---------------------
作者:lulugl
链接:https://bbs.21ic.com/icview-3288468-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值