【STM32备忘录】二、FSMC做LCD控制器,使用stm32cube配置示例

news2025/1/20 21:50:28

文章目录

    • 1. FSMC框图
    • 2. 配置示例
      • (1) cube配置
      • (2) 代码参考
      • *疑问

1. FSMC框图

在这里插入图片描述
在这里插入图片描述

  • 如果屏幕接口8位数据宽度访问,地址线FSMC_A[25:0], 一共26位,一个块226=67108864Byte=64MB,
  • 如果屏幕接口16位数据宽度访问,地址线FSMC_A[25:0], 一共26位,但在内部会右移一位变成25位!!!所以225 *(16/8)=226=67108864Byte=64MB, 此时FSMC_A[25:0]内部将弃用FSMC_A[0],然后将FSMC_A[25:1]映射到FSMC_A[24:0],所以外部FSMC_A[0]仍需要连接。需要注意的是HADDR是需要转换到外部存储器的内部AHB地址线
    在这里插入图片描述
  • 0x6000 0000 - 0x6fff ffff 为NOR/PSRAM区,LCD控制使用该区域,其又被分为4个64MB的块, 一个块大小为0x400 0000,每个块通过FSMC_NE[4:1]映射, 使用那个块就把对应的FSMC_NEx当作LCD控制器的CS
  • 对命令和数据选择,通过地址位实现,比如寄存器选择使用了A16, 那么通过向置位该地址位的地址写入数据即为写入寄存器命令,需要注意的是,如果数据宽度为16位,因为内部地址右移了一位,如果使用NE1,则该地址为0x6000000|(0x00010000<<1) = 0x60020000
  • 典型的LCD接口引脚
主要引脚功能
CS片选,0有效
RS指令/数据选择,0: 控制,1: 数据
RD读动作, RD = 0, WR = 1
WR写动作, RD = 1, WR = 0
D0-D15数据引脚
次要引脚功能
RESET0复位
LIGHT背光
  • 典型的读写时序
    在这里插入图片描述
    在这里插入图片描述

2. 配置示例

(1) cube配置

我使用的是NE1,软件好像只有这个选项,,有LCD接口模式,这里选择的LCD Register Select(命令数据选择RS)是A16,下面配置默认即可用,但默认参数很大,刷新会比较慢,Extended mode扩展模式使能可以使用写时序寄存器单独配置,否则读写时序使用相同寄存器
在这里插入图片描述

  • 这个配置也可以,刷新会提高N倍,我并未测试极限参数,后面有时间可以优化
    在这里插入图片描述

(2) 代码参考

  • 读屏幕ID,使用的开发板是众想科技的大黄蜂(现在这个企业好像改名了),丝印ILI9325,读出来是9328,应该是同系列产品
extern SRAM_HandleTypeDef hsram1;

#define ILI_ADDR_CMD 	0x60000000
#define ILI_ADDR_DATA  	0x60020000

uint16_t get_lcd_id(void)
{
	uint16_t id;
	*(__IO uint16_t *)(ILI_ADDR_CMD) = 0x00;
	id = *(__IO uint16_t *)(ILI_ADDR_DATA);
	return id;
}
  • 写寄存器
static void write_reg(uint8_t cmd, uint16_t dat)
{
	*(__IO uint16_t *)(ILI_ADDR_CMD) = cmd;
	*(__IO uint16_t *)(ILI_ADDR_DATA) = dat;
}
  • 写显示数据
static void write_gram(uint16_t dat)
{
	*(__IO uint16_t *)(ILI_ADDR_DATA) = dat;
}
  • ili9325/9328一个可用的测试初始化序列
	write_reg(0x01,0x0100);	//Driver Output Contral.	
	write_reg(0x02,0x0700);	//LCD Driver Waveform Contral.
	write_reg(0x03,0x1030);	//Entry Mode Set.
	write_reg(0x04,0x0000);	//Scalling Contral.			
	write_reg(0x08,0x0202);	//Display Contral 2.(0x0207)		
	write_reg(0x09,0x0000);	//Display Contral 3.(0x0000)
	write_reg(0x0A,0x0000);	//Frame Cycle Contal.(0x0000)
	write_reg(0x0C,0x0000);	
	write_reg(0x0D,0x0000);	//Frame Maker Position.
	write_reg(0x0F,0x0000);	//Extern Display Interface Contral 2.
	write_reg(0x10,0x0000);	
	write_reg(0x11,0x0007);	//Power Control 2.(0x0001)	//Power Control 3.(0x0138)
	write_reg(0x12,0x0000);	
	write_reg(0x13,0x0000);								//Power Control 4.
	write_reg(0x07,0x0001);								//Power Control 7.
	HAL_Delay(50);

	write_reg(0x10,0x1690);
	write_reg(0x11,0x0227);
	HAL_Delay(50);
	write_reg(0x12,0x009D);
	HAL_Delay(50);
	write_reg(0x13,0x1900);	
	HAL_Delay(50);
	write_reg(0x29,0x0025);	
	write_reg(0x2B,0x000D);
	HAL_Delay(50);
	write_reg(0x20,0x0000);	
	write_reg(0x21,0x0000);
	HAL_Delay(50);
	write_reg(0x30,0x0007);	
	write_reg(0x31,0x0303);	
	write_reg(0x32,0x0003);	
	write_reg(0x35,0x0206);	
	write_reg(0x36,0x0008);	
	write_reg(0x37,0x0406);	
	write_reg(0x38,0x0304);
	write_reg(0x39,0x0007);	
	write_reg(0x3C,0x0601);	
	write_reg(0x3D,0x0008);			
				

	write_reg(0x50,0x0000);	
	write_reg(0x51,0x00EF);	
	write_reg(0x52,0x0000);	
	write_reg(0x53,0x013F);	
	write_reg(0x60,0xA700);	
	write_reg(0x61,0x0001);	
	write_reg(0x6A,0x0000);	


	write_reg(0x80,0x0000);	//Display Position? Partial Display 1.
	write_reg(0x81,0x0000);	//RAM Address Start? Partial Display 1.
	write_reg(0x82,0x0000);	//RAM Address End-Partial Display 1.
	write_reg(0x83,0x0000);	//Displsy Position? Partial Display 2.
	write_reg(0x84,0x0000);	//RAM Address Start? Partial Display 2.
	write_reg(0x85,0x0000);	//RAM Address End? Partial Display 2.

	write_reg(0x90,0x0010);	
	write_reg(0x92,0x0600);	//Panel Interface Contral 2.(0x0000)

	write_reg(0x07,0x0133);	//(0x0173
  • 方块填充测试
/* --------------------------------------------------------------------------*/
/**
 * @Synopsis  设置当前坐标
 *
 * @Param x 	(x,y)当前点的坐标
 * @Param y
 */
/* --------------------------------------------------------------------------*/
void ILI9325_Set_Pointer(uint16_t x,uint16_t y)
{
	write_reg(0x20,x);
	write_reg(0x21,y);
}

/* --------------------------------------------------------------------------*/
/**
 * @Synopsis  设置显示区域
 *
 * @Param x1
 * @Param y1
 * @Param x2
 * @Param y2
 */
/* --------------------------------------------------------------------------*/
void ILI9325_Set_Window(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
	ILI9325_Set_Window_Area(x1,y1,x2,y2);
	ILI9325_Set_Pointer(x1,y1);
}

/* --------------------------------------------------------------------------*/
/**
 * @Synopsis  区域刷屏
 *
 * @Param x1
 * @Param y1
 * @Param x2
 * @Param y2
 * @Param color
 */
/* --------------------------------------------------------------------------*/
void ILI9325_Print_Rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t color)
{
	ILI9325_Set_Window(x1,y1,x2,y2);
	write_reg_cmd(0x0022);
	for(uint16_t i = y1;i<=y2;i++)
	{
		for(uint16_t j = x1;j<=x2;j++)
		{
			write_gram(color);	
		}
	}
}

*疑问

  • 有些点还是不理解,比如使用HAL库提供的操作SRAM接口,HAL_SRAM_Write_16b()并不是只写一次16位数据(即使使用16位数据宽度),并且还需要读一次。。。因为HAL库提供的SRAM读写函数,无论8位,16位,32位,都是按字(32位)操作的,而按32位访问会被分割成两次访问
    在这里插入图片描述
      下图是使用HAL_SRAM_Write_16b()写lcd GRAM时序(写一次颜色数据),仿真只执行一次,但时序显示读了一次,写了两次,多读一次可能会导致地址的一次跳过(不确定命令字地址是否自动增加?),而多写一次会导致一半数据异常(地址自动增加,多写了16位),暂时不了解,感觉这些函数不能用在LCD上面?有清楚的大佬希望可以评论指点下。
HAL_SRAM_Write_16b(&HANDLE_SRAM,(uint32_t*)ILI_ADDR_DATA, &dat, 1);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

远程访问数据库,快解析助力疫情防控远程办公

当前&#xff0c;国内疫情形势不容乐观&#xff0c;企业的经营发展再一次面临巨大挑战。虽然“远程办公”早已不是新鲜词&#xff0c;但依然有大量企业没有做好随时切换到远程办公的准备。如遇疫情风险&#xff0c;企业运营很容易陷入瘫痪。 企业一般在内网部署服务器、视频监…

【Java并发入门】01 并发编程Bug的源头

一、根本原因 「CPU、内存、磁盘之间的速度差异」 为了能同时执行多个任务&#xff0c;CPU 发展出时间片轮转、多核等CPU 要从内存中读数据太慢了&#xff0c;所以给自己设置了缓存CPU 读磁盘更慢了&#xff0c;所以可以让该线程阻塞 二、直接原因 缓存导致的可见性问题 C…

函数 function

一、创建函数方法 1.基本语法 函数是引用数据类型 1.1有函数名称的叫具名函数 function 函数名称&#xff08;&#xff09;{ }&#xff1b; 调用函数&#xff1a; 函数名&#xff08;&#xff09;&#xff1b; <script>function fnl( ){var a 2;var b 5…

教你快速搭建微服务环境

目录 一、项目搭建 1.父项目搭建 2.子项目的搭建 二、项目展示 一、项目搭建 1.父项目搭建 步骤&#xff1a; 1 选择maven项目作为父项目&#xff0c;修改为1.8之后直接点击next 2 定义父项目的名称&#xff0c;修改Artifct Coordinates ---> GroupId 然后点击finsh就可…

现代营销杂志现代营销杂志社现代营销编辑部2022年第11期目录

财务金融《现代营销》投稿&#xff1a;cnqikantg126.com 我国中小企业货币资金管理分析 安宁; 1-3 企业财务管理转型路径探讨 秦春; 4-6 互联网背景下电商企业税务风险研究 何秋梅; 7-9 目标成本管理在企业经济管理中的应用分析 艾蕾梅; 10-12 关于我国发展…

CentOS7.9集群部署(配置hosts、集群免密、时间同步)

在上一篇我们介绍了如何在windows下安装虚拟机&#xff0c;在虚拟机上安装CentOS7.9&#xff0c;并且在系统安装完成后配置了固定ip和系统时间。 在食用本篇之前&#xff0c;如果上述操作没有做过&#xff0c;可以先移步 windows安装VMware虚拟机(附带CentOS7部署) 但是在分布式…

文献阅读总结(3)Neural Graph Collaborative Filtering

1、Introduction 左图u1&#xff0c;右图从左图的u1开始展开 图反应的信息&#xff1a; 1、从路径u1->i2->u2,可以反映出u1和u2的相似性&#xff1b; 2、u1和i4之间有两条路径&#xff0c;而u1和i5之间只有一条路径&#xff0c;可以反应u1对i4的兴趣比u1对i5的兴趣更高…

[附源码]Python计算机毕业设计Django-Steam游戏平台系统论文

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【web网页设计期末课程大作业】基于HTML+CSS+JavaScript仿山东传媒职业学院网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

梯度下降原理+梯度消失和爆炸

梯度下降算法&#xff08;Gradient Descent)的原理和实现步骤 - 知乎 (zhihu.com) 梯度&#xff08;gradient&#xff09;到底是个什么东西&#xff1f;物理意义和数学意义分别是什么&#xff1f; - 知乎 (zhihu.com) 目的&#xff1a;最小化损失函数&#xff0c;一个优化的思…

流媒体传输 - RTSP 协议报文分析

在流媒体传输 - RTSP 协议中&#xff0c;我们分析 RTSP 协议交互的整个流程&#xff0c;在本篇文章中&#xff0c;我们对交互中携带的报文进行详细分析。 Request Request Request-Line ; Section 6.1*( general-header ; Section 5…

Qemu-KVM 网络性能优化实践

背景 在做优化之前&#xff0c;腾讯云上使用的母机单队列&#xff0c;性能只有14w pps。 已有的多队列版本&#xff0c;在20w pps左右&#xff0c;不是很理想。 主要问题性能 1 . 单队列成为性能瓶颈 物理主机环境&#xff0c;使用多队列已经有多年。 而在公有云上&#…

深度学习常见损失函数总结+Pytroch实现

文章目录一、引言二、损失函数1.均方差损失&#xff08;Mean Squared Error Loss&#xff09;2.平均绝对误差损失&#xff08;Mean Absolute Error Loss&#xff09;3.交叉熵&#xff08;Cross Entropy Loss&#xff09;&#xff08;1&#xff09;信息论中的熵a.熵b.相对熵&…

苹果系统(MacOS)无法下载Android SDK或下载缓慢解决办法

SDK管理器一般会在安装完Android Studio 的时候就弹出来.如果当时给关闭了或者是后续想找的话,Command, 或者通过菜单打开偏好设置以后 即可找到Android SDK的设置.与Jetbrains家族的产品方式一致.也可以直接在首屏页面上点More Actions 会出来SDK Manager 然后点击EDIT 找到缺…

DVWA靶场通关实战

DVWABrute Force&#xff08;暴力破解&#xff09;LowMediumHighImpossibleCommand Injection&#xff08;命令行注入&#xff09;LowMediumHighImpossibleCSRF&#xff08;跨站请求伪造&#xff09;LowMediumHighImpossible截至2022.11.24&#xff0c;DVWA共有十四个模块&…

TPS7A3301RGWR稳压器 AK4493EQ音频DAC,电路原理图

TPS7A33系列线性稳压器是负电压(–36V)&#xff0c;超低噪声&#xff08;16μVRMS&#xff0c;72dBPSRR&#xff09;线性稳压器&#xff0c;能够为最高1A负载供电。TPS7A33系列产品装有一个补偿金属氧化物半导体(CMOS)逻辑电平兼容使能引脚(EN)&#xff0c;此引脚允许可由用户定…

【MM小贴士】采购信息记录与工厂的相关性

【业务背景】在SAP的组织架构中&#xff0c;信息记录是一个非常重要的数据。这里面涉及到两个主数据&#xff1a;供应商主数据&物料主数据。 供应商主数据是一个集团性的主数据&#xff0c;无论哪个公司&#xff0c;哪个工厂&#xff0c;都用的同一个供应商代码&#xff0…

数仓开发之DWS层(二)

目录 五&#xff1a;用户域用户注册各窗口汇总表 5.1 主要任务 5.2 思路分析 5.3 图解 5.4 ClickHouse建表语句 六&#xff1a;交易域加购各窗口汇总表 6.1 主要任务 6.2 思路分析 6.3 图解 6.4 ClickHouse建表语句 七&#xff1a;交易域支付各窗口汇总表 7.1 主要任…

AppAnalytics设备的分析服务

AppAnalytics设备的分析服务 EmbarcaderoAppAnalytics是一项针对移动、桌面和可穿戴设备的分析服务。它允许您跟踪和测量应用程序的使用频率、运行的平台、客户使用的功能、查找和记录崩溃等。它通过从最终用户获取匿名使用统计数据&#xff0c;帮助您了解用户行为。AppAnalyti…

应届生如何做好一份简历?

找工作是痛苦的&#xff0c;尤其是投简历的过程。 下面分享下自己最近投简历的一些感悟。 一定要避免的错误 在投简历的过程中一定要避免如下几个主要错误&#xff1a; 一份简历打天下就当前的经济形势&#xff0c;我相信大多数人找工作都是海投&#xff0c;但是在海投的过程中…