stm32f103移植lvgl

这篇需做前期工作:https://www.cnblogs.com/njit-sam/p/17699205.html

LVGL官方主页:https://lvgl.io/

当你想快速上手时,点击这个:https://docs.lvgl.io/master/get-started/quick-overview.html

这里,官方建议可以先在电脑上模拟,按照步骤一步步来就可以了,笔者选择的是CodeBlocks,配合上examples,可以有个大概得了解

接着就可以选在一个硬件平台去做移植相关的工作,笔者手里的是stm32

按照文档,首先下载lvgl的源码,依照官方文档往下做

整个过程中,主要改下面几个东西:

1.lv_conf.h中#if 0改为#if 1

 2.给lvgl提供一个心跳,我是在stm32中断文件里面加的,1ms进入累加一次

 3.更改屏幕的分辨率

 

 4.更改lv_port_disp.c绘制函数

/*Flush the content of the internal buffer the specific area on the display
 *You can use DMA or any hardware acceleration to do this operation in the background but
 *'lv_disp_flush_ready()' has to be called when finished.*/
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;
//    for(y = area->y1; y <= area->y2; y++) {
//        for(x = area->x1; x <= area->x2; x++) {
//            /*Put a pixel to the display. For example:*/
//            /*put_px(x, y, *color_p)*/
//            color_p++;
//        }
//    }
     LCD_Fill_Color(area->x1 , area->y1, area->x2, area->y2,(uint16_t*)color_p);
    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
}

其中,LCD_Fill_Color这个函数是lcd屏幕驱动里面实现的,这里一定要主要这个接口的编写

我就是因为屏幕驱动函数之前写的不好,在这浪费了不少时间 

/******************************************************************************
      函数说明:在指定区域填充颜色
      入口数据:xsta,ysta   起始坐标
                xend,yend   终止坐标
      返回值:  无
******************************************************************************/
void lv_example_get_started_1(void)
{
    /*Change the active screen's background color*/
    lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x003a57), LV_PART_MAIN);

    /*Create a white label, set its text and align it to the center*/
    lv_obj_t * label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello world");
    lv_obj_set_style_text_color(lv_scr_act(), lv_color_hex(0xffffff), LV_PART_MAIN);
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
}

 

void LCD_Fill_Color(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t* color)
{          
    uint16_t i,j;
    LCD_Address_Set(xsta,ysta,xend,yend);      //设置光标位置 
    for(i=ysta;i<=yend;i++)
    {                                                                
        for(j=xsta;j<=xend;j++)
        LCD_WR_DATA(*(color++));//设置光标位置         
    }         
}

最后,在main.c先初始化,在调用一个例子即可

lv_init();
lv_port_disp_init();
lv_port_indev_init();

添加调用示例,即可开启你的hello world

void lv_example_get_started_1(void)
{
    /*Change the active screen's background color*/
    lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x003a57), LV_PART_MAIN);

    /*Create a white label, set its text and align it to the center*/
    lv_obj_t * label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello world");
    lv_obj_set_style_text_color(lv_scr_act(), lv_color_hex(0xffffff), LV_PART_MAIN);
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
}

特别的,在配置cubemx的时候,堆和栈的大小默认有点小,我放大了一倍,不然会报错

除此以外,目前显示动画感觉不是太顺畅,后期优化一下,看看有没有改进

 代码地址:https://gitee.com/njit-sam/stm32-spi-st7789-lcd-lvgl

posted @ 2023-09-13 12:06  njit-sam  阅读(500)  评论(0编辑  收藏  举报