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

2023-05-16

背景介绍

我使用的是中景园的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可以驱动起来。但是目前还存在刷新速度很慢的问题。还需要继续解决,目前先记录。

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

简单参考程序

基于STM32L152驱动中景园LCD(LVGL)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 最小花费

    题目描述 在n个人中 xff0c 某些人的银行账号之间可以互相转账 这些人之间转账的手续费各不相同 给定这些人之间转账时需要从转账金额里扣除百分之几的手续费 xff0c 请问A最少需要多少钱使得转账后B收到100元 输入格式 第一行输入两个
  • 传感器融合sensor fusion

    自动控制系统中的传感器融合 传感器融合的4个作用 xff1a 1 增加数据质量 比如减少噪声 xff1b 2 增加可靠性 多传感器互为备份 xff1b 3 估计预测状态 xff1b 4 可增加被测范围 相对于单个传感器来说 xff0c 多传
  • 摄像机成像原理(模型)与标定

    一般摄像机简化为小孔成像的理想模型 xff08 线性模型 xff09 xff0c 因为摄像机镜头 xff08 视场角 xff09 很小 xff0c 相当于被拍摄物体通过小孔投影到感光元件CCD CMOS上 对于加了各种镜头的摄像机 xff0
  • 实习周记2

    在组长准备给我布置小任务的时候 xff0c 公司开了一个新的项目并且缺前端 xff0c 我就被分配到新项目中去 xff0c 这个项目使用 angular 43 bootstrap前端框架 这不是一个初次开发的项目 xff0c 而是一个需要修
  • OBJ可视化——UV还原(修正)

    前言 前面写过一篇obj格式解析的博客 xff0c 但是这篇文章中可视化的工作是参考PRNet的源码进行的 xff0c 后来细细思考了一下 xff0c 有点问题 xff0c 具体看下面 问题来源 在PRNet源码的render py中有个函
  • Unity中BVH骨骼动画驱动的可视化理论与实现

    前言 找了很久使用BVH到unity中驱动骨骼动画的代码 xff0c 但是都不是特别好用 xff0c 自己以前写过 xff0c 原理很简单 xff0c 这里记录一下 理论 初始姿态 在BVH或者其它骨骼动画中 xff0c 一般涉及到三种姿势
  • 卡通驱动项目ThreeDPoseTracker——模型驱动解析

    前言 之前解析过ThreeDPoseTracker这个项目中的深度学习模型 xff0c 公众号有兄弟私信一些问题 xff0c 我刚好对这个项目实现有兴趣 xff0c 就分析一波源码 xff0c 顺便把问题解答一下 这个源码其实包括很多内容
  • 卡通驱动项目ThreeDPoseTracker——关键点平滑方案解析

    前言 之前对ThreeDPoseTracker的深度学习模型和unity中的驱动方法进行过解析 xff0c 还有一个比较重要的就是从深度学习模型出来的3D关键点数据会有抖动 xff0c 在ThreeDPoseTracker源码中有做两次平滑
  • 卡通角色表情驱动系列一

    前言 分析完ThreeDPoseTracker来做卡通角色的身体驱动 xff0c 接下来在卡通驱动领域还有一个是表情驱动 对这个真的是一窍不通啊 xff0c 只能慢慢看论文了 国际惯例 xff0c 参考博客 论文 xff1a Landmar
  • opencv相机标定和人头姿态估计案例

    前言 头部驱动除了之前关注的表情驱动外 xff0c 还有眼球驱动和头部方向驱动 本博客基于opencv官方文档和部分开源代码来研究如何基于人脸关键点获取头部的朝向 国际惯例 xff0c 参考博客 xff1a opencv Camera Ca
  • 卡通角色表情驱动系列二

    前言 之前介绍了使用传统算法求解BS系数的表情驱动方法 xff0c 其中提到过的三种方法之一是基于网格形变迁移做的 xff0c 那么这篇文章就是对 Deformation Transfer for Triangle Meshes 做表情驱动
  • HDU 1085 Holding Bin-Laden Captive!(母函数)

    HDU 1085 Holding Bin Laden Captive xff08 母函数 xff09 题目地址 题意 xff1a 给你cnt1个一元硬币 xff0c cnt2个两元硬币 xff0c cnt3个五元硬币 xff0c 问不能凑出
  • UE自带重定向原理

    UE自带重定向方法验证 核心源码在VS的解决方案中的位置 xff1a UE4 Source Developer AssetTools Private AssetTypeActions AnimSequence cpp中第3237行Remap
  • matlab之bsxfun函数

    lt span style 61 34 font size 18px color ff0000 34 gt 简单的调用方法 xff1a lt span gt bsxfun 64 plus xff0c A xff0c B xff0c 其中 6
  • 关于协方差矩阵需要注意的一个事项

    协方差矩阵是衡量样本的属性 即维度 之间的关系 xff0c 而不是样本与样本之间的关系 比如有100个样本 xff0c 每个样本10个属性 xff0c 那么计算得到的协方差矩阵一定是10 10的 xff0c 而不是100 100的 xff0
  • 【caffe-Windows】caffe+VS2013+Windows+GPU配置+cifar使用

    前言 国际惯例 xff0c 先来波地址 xff1a CUDA WIN7 xff1a 链接 xff1a http pan baidu com s 1nvyA3Qp 密码 xff1a h0f3 官方网址 xff1a https develope
  • 【caffe-Windows】以mnist为例lmdb格式数据

    前言 前面介绍的案例都是leveldb的格式 xff0c 但是比较流行和实用的格式是lmdb xff0c 原因从此网站摘取 它们都是键 值对 xff08 Key Value Pair xff09 嵌入式数据库管理系统编程库 虽然lmdb的内
  • 【theano-windows】学习笔记十——多层感知机手写数字分类

    前言 上一篇学习了softmax 然后更进一步就是学习一下基本的多层感知机 MLP 了 其实多层感知机同时就是w x 43 b用某个激活函数激活一下 得到的结果作为下一层神经元的输入x 类似于 o u t p u t 61 f 3 f 2
  • 【theano-windows】学习笔记二十——LSTM理论及实现

    前言 上一篇学习了RNN xff0c 也知道了在沿着时间线对上下文权重求梯度的时候 xff0c 可能会导致梯度消失或者梯度爆炸 xff0c 然后我们就得学习一波比较常见的优化方法之LSTM 国际惯例 xff0c 参考网址 xff1a LST
  • 【TensorFlow-windows】keras接口——ImageDataGenerator裁剪

    前言 Keras中有一个图像数据处理器ImageDataGenerator xff0c 能够很方便地进行数据增强 xff0c 并且从文件中批量加载图片 xff0c 避免数据集过大时 xff0c 一下子加载进内存会崩掉 但是从官方文档发现 x

随机推荐

  • 梯度下降法与Logistic Regression 及 Matlab 代码

    梯度下降法与Logistic Regression 及 Matlab 代码 前言Logistic回归梯度下降法例子1 xff0c 固定学习率改进1 xff1a 正则化改进2 xff1a 动态学习率查看分类效果不足完整代码 前言 本质是一个求
  • ONOS 控制器安装和app新建和编译

    1 1 ONOS 控制器编译与安装 ONOS 1 8 版本起强制使用 BUCK 构建工具 xff0c 不再使用 maven xff0c 编译和打包方式与旧版本有所区别 步骤 xff1a 配置环境 gt 下代码 gt 编译 gt 运行 配置环
  • SQLyog(navica)连接docker容器中的mysql8.0.12 报错1251或2003解决办法

    使用SQLyog xff08 navicat xff09 远程连接docker容器中的mysql8 0 12 报以下错误 解决办法 xff1a 一 在docker中启动mysql 定义端口号3306 root 64 localhost do
  • TTY 到底是个什么玩意?

    先来回答一道面试题 xff1a 我们知道在终端中有一些常用的快捷键 xff0c Ctrl 43 E 可以移动到行尾 xff0c Ctrl 43 W 可以删除一个单词 xff0c Ctrl 43 B 可以向前移动一个字母 xff0c 按上键可
  • 如何画好一份架构图

    先说答案 画架构图分四步走 xff1a 第一 xff0c 搞清楚要画的架构图的类型 xff1b 第二 xff0c 确认架构图中的关键要素 xff08 比如产品 技术 服务 xff09 xff1b 第三 xff0c 梳理关键要素之间的关联 x
  • NVIDIA Jetson Xavier NX 深度学习相关组件安装

    一 tensorflow的安装 写在前面的牢骚话 xff08 可选择直接跳过 xff09 在写安装tensorflow的教程之前 xff0c 我一定要放出当时我安装tensorflow时所遇到的那些莫名其妙的错误 xff0c 具体错误如下图
  • Python - Decorator(装饰器) - 带参数的

    我们通过以示例来看看带参数的装饰器到底怎么回事 from time import perf counter from functools import wraps def repeated times def outer fn 64 wra
  • 2020塔式起重机司机考试及塔式起重机司机考试软件

    题库来源 xff1a 安全生产模拟考试一点通公众号小程序 2020塔式起重机司机考试及塔式起重机司机考试软件 xff0c 包含塔式起重机司机考试答案解析及塔式起重机司机考试软件练习 由安全生产模拟考试一点通公众号结合国家塔式起重机司机考试最
  • 2020煤炭生产经营单位(安全生产管理人员)操作证考试及煤炭生产经营单位(安全生产管理人员)模拟考试软件

    题库来源 xff1a 安全生产模拟考试一点通公众号小程序 2020煤炭生产经营单位 xff08 安全生产管理人员 xff09 操作证考试及煤炭生产经营单位 xff08 安全生产管理人员 xff09 模拟考试软件 xff0c 包含煤炭生产经营
  • 嵌入式系统 Boot Loader 技术内幕

    内容 xff1a 1 引言 2 Boot Loader 的概念 3 Boot Loader 的主要任务与典型结构框架 4 关于串口终端 5 结束语 关于作者 对于本文的评价 在 Linux 专区还有 xff1a 教程 工具与产品 代码与组件
  • PADS VX2.8 PCB版本的降低方法

    在PCB设计过程中 xff0c 可能会遇到不同版本的PCB文件 xff0c 高版本软件可以兼容低版本 xff0c 反之则不能 为了提高兼容性 xff0c 可以将拿到的高版本PCB文件降低为低版本 xff0c 以配合使用低版本软件打开 打开P
  • Ubuntu16.04 速腾rslidar-32线激光雷达使用详细记录

    0 rslidar 32线激光雷达参数 线束 xff1a 32线波长 xff1a 905nm激光等级 xff1a class1精度 xff1a 5cm xff08 典型值 xff09 测量距离 xff1a 0 2m 200m xff08 目
  • useradd 与 adduser

    useradd 选项 用户名 参数如下 xff1a c comment 指定一段注释性描述 d 目录 指定用户主目录 xff0c 如果此目录不存在 xff0c 则同时使用 m选项 xff0c 可以创建主目录 g 用户组 指定用户所属的用户组
  • Python——sqlalchemy.exc.ArgumentError

    报错信息 xff1a sqlalchemy exc ArgumentError Mapper mapped class XmjbqZby gt xmjbq zby could not assemble any primary key col
  • VirtualBox虚拟机ping不通主机,但是主机可以ping通虚拟机

    解决VirtualBox虚拟机不能ping通宿主机的问题 问题描述 在VirtualBox虚拟中 xff0c 无法ping通宿主机 xff0c 宿主机可以ping通虚拟机 虚拟机的网络已经设置为 桥接网卡 xff0c 也可以正常上网 解决方
  • RTThread-W25Q128的驱动基于SPI和SFUD

    文章目录 前言一 kconfig的配置1 配置对应的SPI和SFUD 二 SFUD的使用W25Q128的读写操作 三 关于写入的问题 前言 本文是一个初学者的学习记录 xff0c 可能有误 SFUD是针对flash的一种通用的组件 xff0
  • RT-Thread 基于QSPI驱动LY68L6400-SRAM

    前言 使用的是RTThread 标准版 xff0c 主控是STM32H743 xff0c SRAM是LY68L6400 xff0c 使用QSPI QSPI和SPI的区别 个人理解最大的区别就是SPI是串行 xff0c 数据输出 xff0c
  • 关于学习RTThread的随笔

    认识操作系统 关于单片机的学习是从51到ARM xff0c 慢慢的接触到了操作系统 xff0c 开始也不明白是什么 xff0c 就跟着原子哥的例程学 xff0c 也不知道哪个好 xff1f 开始学UCOS xff0c 后来又用学了FreeR
  • RT-Thread 串口的使用

    1 配置选用的串口 在kconfig文件中增加ENV的串口选项 xff0c 这边选择的是uart2 menuconfig BSP USING UART bool span class token string 34 Enable UART
  • 关于驱动中景园LCD和LVGL踩的一些坑

    背景介绍 我使用的是中景园的1 3寸 xff0c 240 240的LCD xff0c 主控是STM32L152系列 https item taobao com item htm spm 61 3688y 1 14 16 1916264bJ5