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

news/2024/5/17 16:14:27/文章来源:https://blog.csdn.net/a1058191679/article/details/127997993

文章目录

    • 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  	0x60020000uint16_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.luyixian.cn/news_show_227303.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙全量源代码在线阅读

目录 前言 下载方式复杂 占用空间大 搜索效率低 本项目目标 服务器地址 使用手册 源码浏览服务 标识符搜索 普通文本搜索 代码比较 写在最后 前言 当前&#xff0c;OpenHarmony项目持续发展&#xff0c;其代码量已经超过了20G字节的存储占用空间&#xff0c;对于一…

基于人工蜂群算法的线性规划求解matlab程序

基于人工蜂群算法的线性规划求解matlab程序 1 人工蜂群算法概述 2005年D. Karaboga教授仿照蜜蜂集群采蜜生物行为&#xff0c;提出了人工蜂群仿生算法&#xff0c;可以有效解决有关函数优化等相关难题。ABC算法仿照蜜蜂蜂群中不同蜂种相互协作&#xff0c;蜂群间进行角色转换的…

不同类型的 SSL 证书解释

了解不同类型的 SSL 证书&#xff1a;扩展验证 (EV)、组织验证 (OV) 和域名验证 (DV)。 查看用例及更多。 SSL/TLS 证书用于验证网站的身份并在服务器和浏览器之间创建安全连接。有许多不同类型的 SSL 证书选项可用&#xff0c;它们都有其独特的用例和价值主张。证书颁发机构 …

电磁仿真设计RMxprt-6p72s电励磁凸极同步电机分析案例

作者 | 电机设计青年 仿真秀专栏作者 导读&#xff1a;大家好&#xff0c;我是仿真秀专栏作者——电机设计青年&#xff0c;曾担任ANSYS低频电磁工程师一职&#xff0c;后入职电机企业&#xff0c;一直从事电机产品研发工作。研究的电机类型涉及电励磁同步电机、永磁同步电机、…

MIT发现语言模型内的事实知识可被修改??

文 | 小伟前言众所周知&#xff0c;自回归语言模型(如GPT-2)里存储着大量的事实知识&#xff0c;比如语言模型可以正确的预测出埃菲尔铁塔所在的城市是巴黎市。那么语言模型是在什么地方存储这些知识呢&#xff1f;我们是否可以修改存储在语言模型里的知识呢&#xff1f;来自于…

R语言分布滞后非线性模型(DLNM)研究发病率,死亡率和空气污染示例

全文下载链接&#xff1a;http://tecdat.cn/?p21317本文提供了运行分布滞后非线性模型的示例&#xff0c;同时描述了预测变量和结果之间的非线性和滞后效应&#xff0c;这种相互关系被定义为暴露-滞后-反应关联&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。…

[附源码]计算机毕业设计springboot本地助农产品销售系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

小程序上新(2022.11.15~11.28)

20221115 小程序基础库 2.27.3 更新 更新 框架 设备 VoIP 能力授权更新 框架 支持 worker 代码打包到小程序&小游戏分包 详情更新 组件 scroll-view 接近全屏尺寸时默认开启点击回到顶部更新 API createVKSession 在不需要用到摄像头的时候不再发起摄像头授权 详情修复 框…

【笔试强训】Day 4

&#x1f308;欢迎来到笔试强训专栏 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x…

王道考研——操作系统(第三章 内存管理)

一、内存的基础知识 什么是内存&#xff1f;有何作用&#xff1f; 这么做的原因是&#xff0c;程序本来是放在外存中的&#xff0c;放在磁盘中的&#xff0c;但是磁盘的读写速度很慢&#xff0c;而cpu的处理速度又很快 存储单元就是存放数据的最小单元&#xff0c;每一个地址…

NetCore路由的Endpoint模式

IdentityServer里有各种Endpoint,如TokenEndpoint,UserInfoEndpoint,Authorize Endpoint,Discovery Endpoint等等。Endpoint从字面意思来看是“终端节点"或者“终节点”的意思。无独有偶NetCore的路由也有Endpoint的概念。那么我们提出一个问题来&#xff0c;究竟什么是En…

不用ps怎么修改图片?电脑图片在线处理的方法

很多小伙伴在工作、学习的时候会用到简单的图片处理工具&#xff08;在线ps 图片编辑制作工具 免费照片编辑器_压缩图&#xff09;&#xff0c;但是因为用到的功能比较多&#xff0c;需要下载安装很多电脑处理图片软件&#xff0c;非常不方便&#xff0c;而且上手比较难。下面就…

Windows OpenGL ES 图像色彩替换

目录 一.OpenGL ES 图像色彩替换 1.原始图片2.效果演示 二.OpenGL ES 图像色彩替换源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 …

代码调优?从Fibonacci数列的7种写法说起,看完coding能力上一个台阶

开启掘金成长之旅&#xff01;这是我参与「掘金日新计划 12 月更文挑战」的第2天&#xff0c;点击查看活动详情 引子 楼梯有 N阶&#xff0c;上楼可以一步上一阶&#xff0c;也可以一步上二阶。 编一个程序&#xff0c;计算共有多少种不同的走法。 例&#xff1a; 0层&…

【微信小程序高频面试题——精选一】

微信小程序高频面试题小程序中如何进行接口请求&#xff1f;会不会跨域&#xff0c;为什么小程序的常用命令有哪些你认为微信小程序的优点是什么&#xff0c;缺点是什么微信小程序中的js和浏览器中的js以及node中的js的区别微信小程序中的数据渲染浏览器中有什么不同小程序中如…

FineReport表格软件- 计算操作符说明

1. 概述 FineReport 中使用函数需要用到很多的操作符。 操作符不仅包含很多运算符&#xff0c;还包括一些报表特有的操作符。 FineReport 11.0 优化了公式 2. 运算符类型 运算符用于指定要对公式中的元素执行的计算类型。有默认计算顺序&#xff0c;但可以使用括号更改此顺序…

python如何将日期字符串格式化年月日

今天用Python的DataFrame处理数据时&#xff0c;相对一波数据按日期分组处理&#xff0c;但是原始数据包含时间分秒&#xff0c;无法按日期分组&#xff0c;因此需要先将数据转成只包含年月日的数据格式。但是写代码处理过程中发现有点绕&#xff0c;不熟悉的同学容易绕晕。这种…

数据库——数据库备份与恢复

目录 原因&#xff1a; 数据库的备份与恢复&#xff1a; 1、使用MySQLdump命令备份 2、恢复数据库 表的导入和导出 1、表的导出 2、表的导入 原因&#xff1a; 尽管采取了一些管理措施来保证数据库的安全&#xff0c;但是不确定的意外情况总是有可能造成数据的损失&#xff0c;…

【学习笔记60】JavaScript原型链的理解

一、万物皆对象 JS中, 万物都可以都可以称为对象 1、对象概念 含义1: 一种数据格式 {key: value, key2: value2}含义2: 某一类事务的实例(某一类内容中的真实个体) 2、说明 arr1就是Array这一类内容中的某一个真实个体数组也可以算作一个对象(Array 这一类事务中的一个个体) …

NoSQL数据库之MongoDB

一、NoSQL数据库背景 传统关系型数据库遇到的问题 2008 年左右&#xff0c;网站 、 论坛、社交网络开始高速发展&#xff0c;传统的关系型数据库在存储及处理数据的时候受到了很大的挑战 &#xff0c;其中主要体现在以下几点&#xff1a; 难以应付每秒上万次的高并发数据写入…