LCD—STM32液晶显示(2.使用FSMC模拟8080时序)

news2025/1/12 6:20:21

目录

使用STM32的FSMC模拟8080接口时序

FSMC简介

FSMC NOR/PSRAM中的模式B时序图

用FSMC模拟8080时序

重点:HADDR内部地址与FSMC地址信号线的转换(实现地址对齐)


使用STM32的FSMC模拟8080接口时序

        ILI9341的8080通讯接口时序可以由STM32使用普通I/O接口进行模拟,但这样效率太低,STM32提供了一种特别的控制方法——使用FSMC接口实现8080时序。(如果芯片硬件少于100脚,是无法使用FSMC来控制液晶屏,只能使用SPI的方式来控制)

        在前面的《FSMC—扩展外部SRAM》章节中了解到STM32的FSMC外设可以用于控制扩展的外部存储器,而MCU对液晶屏的操作实际上就是把显示数据写入到显存中,与控制存储器非常类似,且8080接口的通讯时序完全可以使用FSMC外设产生,因而非常适合使用FSMC控制液晶屏。

FSMC简介

        控制LCD时,适合使用FSMC的NOR\PSRAM模式,它与前面使用FSMC控制SRAM的稍有不同,控制SRAM时使用的是模式A,而控制LCD时使用的是与NOR FLASH一样的模式B,所以我们重点分析框图中NOR FLASH控制信号线部分。

        在控制LCD时,使用的是类似异步、地址与数据线独立的NOR FLASH控制方式,所以实际上CLK、NWAIT、NADV引脚并没有使用到。

        其中NEx、NOE、NWE都是低电平有效。

        STM32具有FSMC_NE1/2/3/4号引脚,不同的引脚对应STM32内部不同的地址区域。 例如,当STM32访问0x68000000-0x6BFFFFFF地址空间时,FSMC_NE3引脚会自动设置为低电平,由于它连接到SRAM的CE#引脚,所以SRAM的片选被使能,而访问0x60000000-0x63FFFFFF地址时,FSMC_NE1会输出低电平。当使用不同的FSMC_NE引脚连接外部存储器时,STM32访问外部存储器的地址不一样,从而达到控制多个外部存储设备的目的。

SRAM同样使用异步通讯,SRAM信号线的信号线如下,与控制LCD的引脚线对照来看

 

这里复习一下FSMC的地址映射

        图中左侧的是Cortex-M3内核的存储空间分配,右侧是STM32 FSMC外设的地址映射。可以看到FSMC的NOR/PSRAM/SRAM/NAND FLASH以及PC卡的地址都在External RAM地址空间内。

        正是因为存在这样的地址映射,使得访问FSMC控制的存储器时,就跟访问STM32的片上外设寄存器一样(片上外设的地址映射即图中左侧的“Peripheral”区域)。

        FSMC把整个External RAM存储区域分成了4个Bank区域,并分配了地址范围及适用的存储器类型,如NOR及SRAM存储器只能使用Bank1的地址。

        在NOR及SRAM区域,每个Bank的内部又分成了4个小块,每个小块有相应的控制引脚用于连接片选信号,如FSMC_NE[4:1]信号线可用于选择BANK1内部的4小块地址区域,当STM32访问0x68000000-0x6BFFFFFF地址空间时,会访问到Bank1的第3小块区域,相应的FSMC_NE3信号线会输出控制信号。

        因此当我们板子上如果SRAM已经使用了一个片选引脚NEx,那么NOR FLASH的片选引脚就不能是同一个,不然会导致地址冲突。

FSMC NOR/PSRAM中的模式B时序图

FSMC NOR/PSRAM中的模式B的时序如下图:

        根据STM32对寻址空间的地址映射,地址0x6000 0000 ~0x9FFF FFFF是映射到外部存储器的,而其中的0x6000 0000 ~0x6FFF FFFF则是分配给NOR FLASH、PSRAM这类可直接寻址的器件。

FSMC NOR/PSRAM中的模式B的读时序如下图:

NADV不需要看,只有地址线和数据线复用的时候才会用到,这里我们不用。

        当FSMC外设被配置成正常工作,并且外部接了NOR FLASH时,若向0x60000000地址写入数据如0xABCD,FSMC会自动在各信号线上产生相应的电平信号,写入数据。FSMC会控制片选信号NE1选择相应的NOR 芯片,然后使用地址线A[25:0]输出0x60000000,在NWE写使能信号线上发出低电平的写使能信号,而要写入的数据信号0xABCD则从数据线D[15:0]输出,然后数据就被保存到NOR FLASH中了。

用FSMC模拟8080时序

由于图片的问题,注意图中右边得到红圈圈起来的那一半等于左边的一整幅图。

        对比FSMC NOR/PSRAM中的模式B时序与ILI9341液晶控制器芯片使用的8080时序可发现,这两个时序是十分相似的(除了FSMC的地址线A和8080的D/CX线,可以说是完全一样) 。

如何使用FSMC的地址线来模拟D/CX?

        D/CX为低电平时候表示传输的是命令,高电平表示传输数据。而A[25:0]一共有26根线,我们可以选择出来一根线,并且控制这根线让它在某个时刻,我们想发送命令的时候就表达成低电平,当我们想发送数据的时候就控制这根地址线为高电平。

         对于FSMC和8080接口,前四种信号线都是完全一样的,仅仅是FSMC的地址信号线A[25:0]与8080的数据/命令选择线D/CX有区别。而对于D/CX线,它为高电平的时候表示数值,为低电平的时候表示命令,如果能使用FSMC的A地址线根据不同的情况产生对应的电平,那么就完全可以使用FSMC来产生8080接口需要的时序了。

        为了模拟出8080时序,我们可以把FSMC的A0地址线(也可以使用其它A1/A2等地址线)与ILI9341芯片8080接口的D/CX信号线连接,那么当A0为高电平时(即D/CX为高电平),数据线D[15:0]的信号会被ILI9341理解为数值,若A0为低电平时(即D/CX为低电平),传输的信号则会被理解为命令。

        由于FSMC会自动产生地址信号,当使用FSMC向0x6xxx xxx1、0x6xxx xxx3、0x6xxx xxx5…这些奇数地址写入数据时,地址最低位的值均为1,所以它会控制地址线A0(D/CX)输出高电平,那么这时通过数据线传输的信号会被理解为数值;若向0x6xxx xxx0 、0x6xxx xxx2、0x6xxx xxx4…这些偶数地址写入数据时,地址最低位的值均为0,所以它会控制地址线A0(D/CX)输出低电平,因此这时通过数据线传输的信号会被理解为命令,如下表:

        有了这个基础,只要配置好FSMC外设,然后在代码中利用指针变量,向不同的地址单元写入数据,就能够由FSMC模拟出的8080接口向ILI9341写入控制命令或GRAM的数据了。

        注意:在实际控制时,以上地址计算方式还不完整,还需要注意HADDR内部地址与FSMC地址信号线的转换。

重点:HADDR内部地址与FSMC地址信号线的转换(实现地址对齐)

        我们前面控制SRAM的时候,我们控制某些地址直接访问就可以了,不需要关心地址转换。这是因为SRAM本身具有掩码(通过LB和UB来控制),所以虽然SRAM的数据宽度是16bit,但是却可以以8位的方式访问,也可以以16位的方式访问。

        但是NOR FLASH没有SRAM的这种机制,所以如果NOR FLASH是16bit,那就只能以16bit的方式来访问。比如我们的液晶屏有16根数据线,它就相对于一个16位的NOR FLASH,只能使用16位的方式访问。

        而我们要注意在STM32内部实际上有一个地址线HADDR是内部AHB地址线。HADDR是字节地址,而液晶屏的NOR FLASH是16位,是两个字节地址。所以访问的时候会有地址对齐的问题。

        比如:对于HADDR,访问第0个地址只想访问第0个字节,访问第一个地址只想访问第1个字节;但对于NOR FLASH,我们访问了一个地址就同时访问了两个字节,如访问第1个地址,同时会访问第2、3字节。

        所以我们需要对HADDR进行移位(由STM32内部控制,我们不需要管如何移位),会将HADDR的第1根地址线和NOR FLASH的第0根地址线连接,这样就达到了一个移位的目的,左移1位。

        这样的话,假如HADDR想要访问1(二进制)地址,外面就会产生一个10(二进制)地址,就相对于访问第2、3字节了。访问2地址,就会访问第4、5字节,也就是每个地址能访问到的字节数乘2,这样就达到了与NOR FLASH地址对齐的目的。

详细可参考数据手册下图

 

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

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

相关文章

PHP要怎么学--【强撸项目000】

强撸项目 总目录在000集 文章目录 本系列校训学习资源的选择环境的问题本人推荐 PHP视频的知识点分析总结题外话 本系列校训 用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干! 只要自己有电脑,前后项目都能搞&a…

sqli-labs 堆叠注入 解析

打开网页首先判断闭合类型 说明为双引号闭合 我们可以使用单引号将其报错 先尝试判断回显位 可以看见输出回显位为2,3 尝试暴库爆表 这时候进行尝试堆叠注入,创造一张新表 ?id-1 union select 1,database(),group_concat(table_name) from informatio…

给你一个网站,你如何测试?

首先,查找需求说明、网站设计 等相关文档,分析测试需求。 制定测试计划,确定测试范围和测试策略,一般包括以下几个部分: 功能性测试;界面测试;性能测试;数据库测试;安全…

AD如何查看PCB完成度?快来看这篇文

在Altium Designer(AD)中,很多工程师通过使用Design Rule Check(DRC,常用于检查PCB设计是否符合设计规范和要求)功能来检查PCB设计的完成度,但很多小白不太熟悉怎么去使用DRC,下面来…

深入浅出C语言—【函数】下

目录 5. 函数的嵌套调用和链式访问5.1嵌套调用5.2 链式访问 6. 函数的声明和定义6.1 函数声明6.2 函数定义 7. 函数递归👑7.1 什么是递归?7.2 递归的两个必要条件7.2.1 练习17.2.2 练习2 7.3 递归与迭代7.3.1 练习37.3.2 练习4 5. 函数的嵌套调用和链式访…

解决Missing cookie ‘JssionId‘ for method parameter of type String问题

错误描述如下所示: 上述错误是我在使用CookieValue注解,获取cookieID时出现的,错误原因是由于**CookieValue注解注解中的value值和浏览器中的cookie的jssionID不一致所导致的** 如下所示为浏览器中的CookieID的参数名 而我在注解中写的如下图…

浪涌保护器行业应用防雷选型方案

当今社会中,电气设备的使用范围越来越广泛,也越来越普及,而与之相关的浪涌保护器就显得尤为重要。在这个领域,有一种高品质的浪涌保护器 —— 地凯防雷SPD浪涌保护器,它可以为各种设备提供强大的保护,并在各…

YOLOv5——pytorch环境搭建

环境搭建是一个最最基础而又基本的事情,是一切工作开始前的基本要求。 由于YOLOv7和YOLOv5不兼容,这次用到了YOLOv5,我不得不再使用anaconda创建一个虚拟环境。 Tip:很多人不了解Anaconda存在的意义,就是为了弥补pyt…

四、DML-1.数据操作-添加

一、DML介绍 Data Manipulation Language 数据操作语言 用来对数据库中表的数据记录进行增删改操作。 二、添加数据 1、给指定字段添加数据 insert into employee(id, workno, name, gender, age, idcard,entrydate) values (1, 001,Itcast, 男, 18, 123456789012345678, 2…

kaggle新赛:学生摘要评估大赛赛题解析(NLP)

赛题名称:CommonLit - Evaluate Student Summaries 赛题链接: https://www.kaggle.com/competitions/commonlit-evaluate-student-summaries/ 赛题背景 摘要写作是所有年龄段学习者的一项重要技能。总结可以增强阅读理解能力,特别是在第二…

SOLIDWORKS工程图模板如何设置?

SOLIDWORKS工程图模板是非常重要的,它可以帮助工程师快速创建符合公司规范的工程图纸。本文将介绍SOLIDWORKS工程图模板的基本知识,包括如何创建和使用模板。 一、创建SOLIDWORKS工程图模板 首先,我们需要打开SOLIDWORKS软件,并选…

MySQL高阶语句之二

目录 ​编辑 一、子查询 1.1语法 1.2select 1.3insert 1.3update 1.4delete 1.5 exists 1.6别名as 二、MySQL视图 2.1功能 2.2区别 2.3联系 2.4 创建视图(单表) 2.5 创建视图(多表) 2.6修改原表数据 2.7修改视图数据 三、NULL值 一、子查询 子查询也被称作内查询…

虚拟机ubuntu1804打开联合标定工具箱的步骤(toolkit)

1、运行roscore roscore 2、进入到calibration文件夹打开终端 source devel/setup.bash3、运行rosrun打开即可 rosrun calibration_camera_lidar calibration_toolkit

iview的表格添加筛选功能需要注意的问题

给table的某列添加筛选功能 在table中通过给columns数据的项,设置 filters,可进行筛选,filters 接收一个数组。 然后再指定一个筛选函数 filterMethod 才可以进行筛选,filterMethod 传入两个参数value和 row。 如果指定 filter…

基于异步FIFO的串口回环测试

文章目录 前言一、异步FIFO简介二、串口简介2.1 数据接收模块(RX)2.1 数据发送模块(TX) 三、IP核说明与配置2.1 PLL IP核2.2 FIFO IP核 四、数据关联 前言 当涉及到串口通信的硬件设计和软件开发时,进行有效的测试是至关重要的。串口回环测试是一种常见的测试方法&a…

GSV6201替代方案|CS5466设计资料|CS5466原理图|typec转HDMI_8k方案芯片

GSV6201是一款高性能、低功耗、高性能的,USB Type-C备用模式显示端口1.4至HDMI 2.1转换器。通过集成增强型微控制器,GSV6201创造了一个经济高效的解决方案提供了上市时间优势。显示端口接收机支持高达32.4Gbps(HBR3,4通道&#xf…

美国SaaS管理平台Zluri完成2000万美元的B轮融资

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,SaaS运营(SaaSOps)平台Zluri今日宣布获得2000万美元的融资,帮助企业管理SaaS资产并降低风险。B轮融资由Lightspeed领投,参与融资的其他投资者包括MassMutual Ventures、End…

python 数学 中负数的取余的区别

😄 今天发现python中负数的取余操作和数学中的是有区别的,在此记录一下。 文章目录 1、python中负数取余:2、数学中负数取余:3、总结:1、python中负数取余: res = a%b, 例子: -5%7=25%-7=-2-5%-7=-5如果a或b是负数,python则是会让商尽可能的小(即采用的是向下取整的方…

JVM中的堆和栈到底存储了什么

JVM数据区 先上一张Java虚拟机运行时数据区中堆、栈以及方法区存储数据的概要图,如下所示: 然后我们来具体解析一下堆和栈 堆 堆是存储时的单位,对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享&#…

用java实现死锁,并且判断是否产生

目录 锁的概念 锁在多线程环境中的作用是: 在Java中,常见的锁机制有以下几种: 形成死锁的条件 用java写一个死锁 如何避免死锁? 锁的概念 首先我们要明确锁是什么,在Java语言中,锁(Lock&…