关于驱动中景园LCD和LVGL踩的一些坑

这篇具有很好参考价值的文章主要介绍了关于驱动中景园LCD和LVGL踩的一些坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景介绍

我使用的是中景园的1.3寸,240*240的LCD,主控是STM32L152系列
https://item.taobao.com/item.htm?spm=3688y.1.14.16.1916264bJ5QnqC&id=565591692266&ns=1&abbucket=2#detail

1、第一坑-驱动

开始以为驱动这个屏幕应该不难,因为有例程,结果第一坑就来了。我使用的是STM32L152系列,刚好有个PB12~PB15这对SPI2引脚引出,就把屏幕接到了这个上,但是没有使用SPI功能,只是作为普通IO口用。于是移植了例程中STM32F103系列的到STM32L152上,但是就是无法驱动,始终黑屏。
没办法,重新换管脚到PA0~PA4上,结果立马正常显示了。
目前没有找到问题,只能怀疑PB引脚驱动力不够

第二坑-LVGL无法显示

搞定驱动后就要移植LVGL。
此处是参考这个大神的教程,写的真的很棒。
https://blog.csdn.net/weixin_42111891/article/details/124989266
移植完毕后发现还是无法驱动,是花屏。
猜测是因为我的disp_flush()中填的那个驱动函数不对。
于是查看驱动代码发现
大神用的是正点原子的屏幕。所用的填充函数如下:
注意最后一个参数是u16*color是一个指针。

//在指定区域内填充指定颜色块
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)
//color:要填充的颜色
void LCD_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 *color)
{
    u16 height, width;
    u16 i, j;
    width = ex - sx + 1;            //得到填充的宽度
    height = ey - sy + 1;           //高度

    for (i = 0; i < height; i++)
    {
        LCD_SetCursor(sx, sy + i);  //设置光标位置
        LCD_WriteRAM_Prepare();     //开始写入GRAM

        for (j = 0; j < width; j++)
        {
            LCD->LCD_RAM=color[i * width + j];  //写入数据
        }
    }
}

而中景园自带的驱动中只有这两个函数
LCD_Fill只能填单个颜色块。
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);
LCD_ShowPicture只能绘制8字节的图片数组。
void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
所以必须要重新写一个。
一开始是仿照正点原子的驱动去写,但是怎么修改都是花屏。
于是开始找资料,但是网上用这块LCD的都是ESP32,也只能看看这个资料看看他们是怎么驱动的。
于是找到了这个老哥的资料
https://www.bilibili.com/video/av847784236/
https://gitee.com/gsm-wheather-project
下载查看代码后,找到这个函数

void LCD_Fill_Colors(u16 xsta,u16 ysta,u16 xend,u16 yend,lv_color_t* color_p)
{          
	uint32_t x=0,y=0; 
 
	uint16_t width = (xend-xsta+1);
	uint16_t height = (yend-ysta+1);
	long len=width*height;
    //xSemaphoreTakeRecursive(_spi_mux, portMAX_DELAY);

 #if 0   
	LCD_Address_Set(xsta,ysta,xend,yend);//设置显示范围

    for(y = 0; y <width*height; y++) 
	{
		LCD_WR_DATA(color_p->full);
		color_p++;
    }


    for(y = ysta; y <= yend; y++) {
        for(x = xsta; x <= xend; x++) {

		   LCD_DrawPoint(x, y,  (color_p->full));

        	color_p++;
        }
    }
#else
	
#define lcd_spi_dat_len 50
    esp_err_t ret;
    spi_transaction_t t;   
	int cnt=0,i=0;
	int tx_mode=0;
	int tx_len = lcd_spi_dat_len;
	int break_cnt=0;
	uint16_t buf[lcd_spi_dat_len];
	memset(buf,RED,lcd_spi_dat_len);

	LCD_Address_Set(xsta,ysta,xend,yend);//设置显示范围	

	if(len<lcd_spi_dat_len)
	{
		tx_len = len;
		tx_mode=1;
	}

	while(1)
	{		 
		for(i=0;i<tx_len;i++)
		{
			buf[i]=SWAPBYTES(color_p[cnt*tx_len+i].full);
		}
		memset(&t, 0, sizeof(t));
		t.length=2*8*tx_len;    
		t.tx_buffer=&buf[0];               
		t.user=(void*)0;                
		ret=spi_device_transmit(lcd_spi, &t); 

		if(tx_mode==1)
			break;	
			
		cnt++;

		if(len>lcd_spi_dat_len)
		{
			len-=tx_len;
		}else
		{
			tx_len=len;
			len-=tx_len;
			if(++break_cnt>1)
				break;
		}
	}
#endif	
	//xSemaphoreGiveRecursive(_spi_mux);			  	    
 }

于是稍加改造,得到

void LCD_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, lv_color_t *color)
{
	u16 i,j;
	u32 k=0;
	uint32_t x=0,y=0; 
	u16 height, width;
	width = ex - sx + 1;            //得到填充的宽度
  height = ey - sy + 1;           //高度
	
	LCD_Address_Set(sx,sy,ex,ey);
	
	for(y = 0; y <width*height; y++) 
	{
		LCD_WR_DATA(color->full);
		color++;
    }
}

注意,在LVGL中使用也要修改如下。

/*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)
{
		LCD_Color_Fill(area->x1,area->y1,area->x2,area->y2,color_p);
    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
}

到此,LVGL和中景园的LCD可以驱动起来。但是目前还存在刷新速度很慢的问题。还需要继续解决,目前先记录。

第三坑 编译警告坑

移植后编译会有报错和警告,
报错一般是找不到这个路径include “…/…/lv_conf.h”,若头文件#include "lvgl/lvgl.h"包含报错,可以添加宏定义LV_CONF_INCLUDE_SIMPLE。
警告是warning: #188-D: enumerated type mixed with another type lv_slider_set_。。。。。。。
这个需要在魔术棒的那个设置中添加–diag_suppress=188,546,68,111,含义就是消除警告编号为188,546.68,11这这类警告,并不是解决了警告,而是屏蔽。
关于驱动中景园LCD和LVGL踩的一些坑

ESP32+TFT_eSPI+LVGL

本项目基于VSCode+Platform
首先创建一个ESP32的工程,然后在Platform主页的libraries中搜索TFT_eSPI,并把他添加到工程中,然后首先先驱动LCD屏幕确保屏幕没问题。
参考链接 https://www.jianshu.com/p/8631a10b5533
添加LVGL,也是在在Platform主页的libraries中搜索LVGL,添加到工程中。
驱动的方式可以参考下文连接,但是不用做1,2条,因为可以直接添加LGVL到工程中,我已经尝试成功。
https://blog.csdn.net/weixin_41711422/article/details/126354263

显示第一帧画面后无反应

1、主函数循环中是否有添加lv_task_handler(); // lvgl的事务处理
2、在定时器中断中要添加lv_tick_inc(1);//lvgl的1ms中断,并且要确认定时器是可以正常工作的,否则LVGL的任务不会开始调用。

简单参考程序

基于STM32L152驱动中景园LCD(LVGL)文章来源地址https://www.toymoban.com/news/detail-457770.html

到了这里,关于关于驱动中景园LCD和LVGL踩的一些坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于虚拟机使用docker踩的坑

    在家码代码,已读不回的求职环境,本来就闹心,结果放个水回来电脑莫名其妙重启了(虚拟机没挂起),虚拟机重启,docker容器可以正常启动,但发现IDEA启动项目失败,各种连接不通。 使用下面命令尝试: Win =≠= docker Windows可以ping通192.169.0.111 ,但访问192.169.0.111:9200不通

    2024年04月16日
    浏览(17)
  • lvgl8.x 对接实体按键驱动

    实体按键属于 lvgl 的输入设备中的一种,所以对接外部的硬件实体按键实际上就是为 lvgl 添加输入设备。为 lvgl 添加输入设备需要在 lv_port_indev.c 这个 c 文件中完成, 注意这个文件并不存在于 lvgl src 源码文件夹下,而是位于 examples/porting 文件夹下,在这个目录下官方为我们准

    2024年02月11日
    浏览(25)
  • 07_瑞萨GUI(LVGL)移植实战教程之LVGL对接EC11旋转编码器驱动

    本系列教程配套出有视频教程,观看地址:https://www.bilibili.com/video/BV1gV4y1e7Sg 本次实验我们向LVGL库中对接EC11旋转编码器驱动,让我们能通过EC11旋转编码器操作UI。 上次实验得出的工程我们可以通过复制在原有的基础上得到一个新的工程。 如果你不清楚复制工程的步骤,请参

    2024年02月09日
    浏览(29)
  • <Linux开发>驱动开发 -之- Linux LCD 驱动

    <Linux开发>驱动开发 -之- Linux LCD 驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植 uboot移植过程详细记录(第一部分) <Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分) <Linux开发>

    2024年02月06日
    浏览(34)
  • LCD12864驱动开发

    目录  一、概述 二、方框图  三、模块接口说明 1、串口接口管脚信号 2、并行接口 四、模块主要硬件构成说明 1、RS,R/W配4种模式:  2、E信号 五、指令说明 六、读写时序图 6.1 数据传输过程   6.2、时序图  6.3、串口读写时序  七、交流参数 八、软件初始化 九、应用举例

    2024年02月08日
    浏览(29)
  • LCD驱动电路

    原理:LCD屏幕的背光亮度取决于流过背光板LED的电流,因此LCD屏幕需要选取一个恒流源芯片来为背光板提供电压和电流。市面上有很多恒流源芯片,本文根据最近学习的资料,以两款芯片为例进行展开。芯片:FP6755和RT9293 恒流控制原理:以最简单的三极管构成的恒流回路为例

    2023年04月08日
    浏览(16)
  • 物联网开发笔记(62)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:环境搭建

    一、目的         这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程的第一步:环境搭建。 :3.2寸SPI串口TFT液晶显示屏模块 ILI9341驱动 LCD触摸屏 240*320 LVGL图形化编程 XPT2046触摸屏芯片IC 二、环境         ESP32 + 3.2寸 ILI934

    2023年04月15日
    浏览(41)
  • FPGA驱动SPI接口的LCD(三)——LCD的初始化

    LCD初始化函数 void LCD_Init(void);  首先是LCD的复位 void LCD_RESET(void) {     LCD_RST_CLR;        //拉低复位引脚     Delay_Ms(100);        //延时100ms         LCD_RST_SET;        //拉高复位引脚     Delay_Ms(50);        //延时50ms } 向LCD屏幕写入一个8位命令 void LCD_WR_REG(u8 data) {     

    2024年02月01日
    浏览(31)
  • STM32直接驱动TFT LCD,在LCD上根据数据绘制曲线

    快速画点函数和绘制直线函数可以根据自己屏幕来编写, void Port_DrawCurve(u8 x ,u16 value) 1、绘制曲线函数中的形参x,相当于时间轴,每一次进入函数,x就会++; 2、在绘制曲线之前需要先清除3列,这样绘制曲线就不用到最后了再整屏幕擦除。

    2024年02月15日
    浏览(28)
  • verilog驱动LCD显示彩条、字符

    LCD(liquid crystal display):液晶显示器 TFT:薄膜晶体管 LCD屏幕接口:常见的LCD屏幕接口有:RGB、MCU、LVDS、MIPI等 RGB LCD接口原理图:其中MISO、MOSI是IIC接口;SCK、MISO、MOSI、CS可以组成SPI协议 实验平台:开拓者开发板 刷新一帧的时间: 公式:(场同步信号 + 场同步后沿 + 显示整

    2024年02月05日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包