3869|4

111

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

stm32F412-discovery探索板移植裸机littlevgl-v7 [复制链接]

(一)Littlevgl

基于MIT协议的LittleVGL可以自由地应用与各种DIY、商业场合,不需要担心版权问题,其风格相比与更加友好圆滑。

此外,LittleVGL大概是我目前用过最容易移植的MCU UI组件了,stm32F412-discovery探索板我在三四年前就入手了,本意是做些小型UI开发,结果回来移植了半天的stemwin也没有成功,遂积灰,之前成功地在NXP的LPC54628上跑通了FreeRTOS+LittleVGL,因此这次想用freertos裸机跑一次。

 

stm32f412-discovery官方开发板:驱动芯片ft6x06+st7789h2,屏幕分辨率240x240,MCU屏接口引脚D0-D15,电容触摸屏

 

(二)资料

源码: github(由于M国对开源糟糕的态度,暂时无法直接登上去):https://github.com/lvgl/lvgl

gitee(我看了下跟github进度是一样的):https://gitee.com/mirrors/lvgl?_from=gitee_search

WIKI(里面有API手册下载地址):https://docs.lvgl.io/v7/en/html/

手册下载地址:https://docs.lvgl.io/v7/en/html/_downloads/39cea4971f327964c804e4e6bc96bfb4/LVGL.pdf

 

(三)移植显示

1-使用cubemxide生成stm32f412-discovery例程

2-从GITEE上克隆源码下来,把SRC下面的文件放到middleware/littlevgl下面,加入头文件路径:

${workspace_loc:/${ProjName}/Middlewares/littlevgl

切记,只可以定位到littlevgl文件夹,若再定义到内部,会出现大量的未定义error。

另外注意,littlevgl文件夹内部、同级各有一个lvgl.h文件,都不可或缺。

3-在Core/SRC下面创建littlevlg_support的头文件和源文件,再加入lv_conf.h和lv_ex_conf.h

4-support_support.c文件代码如下:

用于显示的驱动函数:


void lv_port_disp_init(void)
{
    /*-------------------------
     * Initialize your display
     * -----------------------*/
	BSP_LCD_Init();
	BSP_LCD_Clear(LCD_COLOR_WHITE);

    /*-----------------------------------
     * Register the display in LittlevGL
     *----------------------------------*/

    lv_disp_drv_t disp_drv;      /*Descriptor of a display driver*/
    lv_disp_drv_init(&disp_drv); /*Basic initialization*/

    /*Set up the functions to access to your display*/
    static lv_disp_buf_t disp_buf_2;
    static lv_color_t buf2_1[LV_HOR_RES_MAX * 240];                        /*A buffer for 10 rows*/
    static lv_color_t buf2_2[LV_HOR_RES_MAX * 240];                        /*An other buffer for 10 rows*/
    lv_disp_buf_init(&disp_buf_2, buf2_1, buf2_2, LV_HOR_RES_MAX * 240);   /*Initialize the display buffer*/
    disp_drv.buffer = &disp_buf_2;

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

    /*Used in buffered mode (LV_VDB_SIZE != 0  in lv_conf.h)*/
    disp_drv.flush_cb = DEMO_FlushDisplay;

    /*Finally register the driver*/
    lv_disp_drv_register(&disp_drv);
}

DEMO_FlushDisplay驱动ST7789H2:


typedef struct
{
  __IO uint16_t REG;
  __IO uint16_t RAM;
}LCD_CONTROLLER_TypeDef;
#define FMC_BANK1_BASE  ((uint32_t)(0x60000000 | 0x00000000))
#define FMC_BANK1       ((LCD_CONTROLLER_TypeDef *) FMC_BANK1_BASE)
static void DEMO_FlushDisplay(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
//    BSP_LCD_DrawRGBImage(area->x1, area->y1, (area->x2-area->x1), (area->y2-area->y1), color_p);

    uint16_t Xpos = area->x1;
    uint16_t Ypos = area->y1;
    uint16_t Xsize = (area->x2-area->x1)+1;
    uint16_t Ysize = (area->y2-area->y1)+1;
    ST7789H2_SetDisplayWindow(Xpos, Ypos, Xsize, Ysize);
    uint32_t posY;
    uint32_t nb_line = 0;

    for (posY = Ypos; posY < (Ypos + Ysize); posY ++)
    {
      /* Set Cursor */
      ST7789H2_SetCursor(Xpos, posY);

      /* Prepare to write to LCD RAM */
      ST7789H2_WriteReg(ST7789H2_WRITE_RAM, (uint8_t*)NULL, 0);   /* RAM write data command */

      uint32_t i = 0;
      uint32_t posX;
      uint16_t *rgb565 = (uint16_t*)color_p + nb_line * (Xsize);
      for (posX = Xpos; posX < (Xsize + Xpos); posX++)
      {
    		  if (posX != (Xsize + Xpos))     /* When writing last pixel when size is odd, the third part is not written */
    		  {
    			  FMC_BANK1->RAM = (uint16_t)rgb565[i];
    			  __DSB();
    		  }
    		  i++;
      }

      nb_line++;
    }
    ST7789H2_SetDisplayWindow(0, 0, BSP_LCD_GetXSize(), BSP_LCD_GetYSize());

    /* IMPORTANT!!!
     * Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
}

其中有一行值得注意,不知道出于何种原因,littlevgl给过来的area变量存储的size总是小一码的,导致右下边缘各有一条一个像素的白边,并且像素依次退了一格,画面扭曲。因此需要额外加一个像素:

    uint16_t Xsize = (area->x2-area->x1)+1;
    uint16_t Ysize = (area->y2-area->y1)+1;

 

(四)移植触摸

1-触摸初始化函数:

void lv_port_indev_init(void)
{
    lv_indev_drv_t indev_drv;

    /*------------------
     * Touchpad
     * -----------------*/

    /*Initialize your touchpad */
    BSP_TS_InitEx(240, 240, TS_ORIENTATION_PORTRAIT);

    /*Register a touchpad input device*/
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = DEMO_ReadTouch;
    lv_indev_drv_register(&indev_drv);
}

 

2-驱动FT6X06芯片读取触摸情况的接口函数:

static bool DEMO_ReadTouch(lv_indev_drv_t * indev_drv, lv_indev_data_t *data)
{
	static uint16_t x,y;
	__IO TS_StateTypeDef  ts;

	BSP_TS_GetState((TS_StateTypeDef *)&ts);

	if((ts.touchX[0] >= BSP_LCD_GetXSize()) ||(ts.touchY[0] >= BSP_LCD_GetYSize()) )
	{
		ts.touchX[0] = 0;
		ts.touchY[0] = 0;
	}
	x = ts.touchX[0];
	y = ts.touchY[0];
	y=240-y;

	data->state = LV_INDEV_STATE_REL;
	if(0!=ts.touchDetected)
	{
		data->state = LV_INDEV_STATE_PR;
	}
    data->point.x = y;
    data->point.y = x;

	return false;
}

 

3-

这里有个问题,移植的时候触摸一直没有反应,经过排查是触摸芯片没有通讯上,后来发现原来是默认工程有个针对FT6X06的复位引脚被默认初始化并拉低

解决见:stm32f412-discovery探索板-ft6x06驱动问题

 

 

(五)工程

工程

此帖出自stm32/stm8论坛

最新回复

littlevgl标配了吗?我看nxp的sdk现在已经打包在一起了。   详情 回复 发表于 2020-8-17 22:20
点赞 关注
 

回复
举报

1366

帖子

6

TA的资源

版主

沙发
 

V7版本的确实比V6的好看不少,炫了不少,接口也有些许改变

此帖出自stm32/stm8论坛

点评

是啊,丰富了很多,一开始在NXP那边用5.4来着,很多接口都没有,就去移植了个最新的  详情 回复 发表于 2020-8-18 20:28
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 

回复

7608

帖子

18

TA的资源

五彩晶圆(高级)

板凳
 

littlevgl标配了吗?我看nxp的sdk现在已经打包在一起了。

此帖出自stm32/stm8论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

4
 
freebsder 发表于 2020-8-17 22:20 littlevgl标配了吗?我看nxp的sdk现在已经打包在一起了。

很火啊,我看有张github开源ui的star表,LittleVGL和GUILITE这两个火箭式窜起,快要赶超老大openGFX了,我觉得主要还是移植简单,stemwin我移植了好久都不行……

NXP那边是集成了,我就是从NXP那边认识LittleVGL的,不过NXP集成的那个是5.4版本的,非常落后,如果你用原子的教程会发现基本例程都不能用,很多接口都没有,我给NXP的LPC54628移植过V7版本的:

https://blog.csdn.net/qq_34917736/article/details/107738432

就是NXP那边移植得挺顺利的就准备把手上带屏幕的都移植一下

此帖出自stm32/stm8论坛
 
 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

5
 
RCSN 发表于 2020-8-17 17:01 V7版本的确实比V6的好看不少,炫了不少,接口也有些许改变

是啊,丰富了很多,一开始在NXP那边用5.4来着,很多接口都没有,就去移植了个最新的

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表