初学stm32 --- FSMC驱动LCD屏

 

目录

 

FSMC简介

FSMC框图介绍

FSMC通信引脚介绍

FSMC_NWE 的作用

FSMC_NWE 的时序关系

FSMC_NOE 的含义

FSMC_NOE 的典型用途

FSMC_NOE 的时序关系

使用FSMC驱动LCD

FSMC时序介绍 

时序特性中的 OE

 ILI9341重点时序:

FSMC地址映射 

 HADDR与FSMC_A关系

 LCD的RS信号线与地址线关系

FSMC相关寄存器介绍

SRAM/NOR闪存片选控制寄存器(FSMC_BCRx) 

SRAM/NOR闪存片选时序寄存器(FSMC_BTRx)

SRAM/NOR闪存写时序寄存器(FSMC_BWTRx)

FSMC寄存器组合说明

FSMC相关HAL库函数简介

 SRAM_HandleTypeDef

FSMC_NORSRAM_InitTypeDef

FSMC模拟8080时序读写简化代码


FSMC简介

FSMC,Flexible Static Memory Controller,灵活的静态存储控制器。

用途:用于驱动SRAM,NOR FLASH,NAND FLASH及PC卡类型的存储器。

        配置好FSMC,定义一个指向这些地址的指针,通过对指针操作就可以直接修改存储单元的内容,FSMC自动完成读写命令和数据访问操作,不需要程序去实现时序。

        FSMC外设配置好就可以模拟出时序。

实例:FSMC模拟8080时序控制LCD

F1/ F4(407)系列大容量型号,且引脚数目在100脚以上的芯片都有FSMC接口

F4/F7/H7系列就是FMC接口

FSMC框图介绍

① 时钟控制逻辑

FSMC挂载在AHB总线上,时钟信号来自HCLK

② STM32内部的FSMC控制单元

NOR闪存和PSRAM控制器、NAND闪存和PC卡控制器、FSMC配置寄存器

③ 通信引脚

不同类型存储器用到的信号引脚

公共信号引脚

FSMC通信引脚介绍

  用于连接硬件设备的引脚,控制不同类型的存储器会用不同的引脚。

  • FSMC_NWE 的作用

  • 用于写操作

    • FSMC_NWE 用于通知外部存储器执行写操作。
    • 在写操作期间,FSMC 会将 FSMC_NWE 拉低(逻辑 0),使能外部存储器的写操作。
    • FSMC_NWE 通常连接到外部存储器的 WE(Write Enable)引脚,确保数据可以正确写入外部存储器。
  • 与数据总线和地址总线的配合

    • 在写操作中:
      • FSMC_NWE 为低电平时,外部存储器会从 FSMC 的数据总线(FSMC_Dx)上读取数据,并将数据写入指定的存储地址(由地址总线 FSMC_Ax 提供)。
      • FSMC_NWE 回到高电平时,写操作完成。
  • 写入控制的时序信号

    • FSMC 控制 FSMC_NWE 的上升沿和下降沿来定义写入周期的开始和结束,确保数据正确写入外部存储器。

FSMC_NWE 的时序关系

FSMC_NWE 的控制信号与以下其他 FSMC 信号配合使用:

  1. FSMC_NE(芯片选择,Chip Select)
    • 用于选择具体的外部存储器。
    • FSMC_NE 为低电平时,所选存储器芯片被激活。
  2. FSMC_A(地址总线)
    • 提供数据写入的目标地址。
  3. FSMC_D(数据总线)
    • 提供要写入的数据。
  4. FSMC_NWAIT(等待信号,可选)
    • 外部存储器可以通过拉高或拉低 FSMC_NWAIT 信号请求延迟完成写操作。

以下是典型的 FSMC 写入时序:

  • FSMC 首先激活 FSMC_NE(芯片选择)。
  • 然后将 FSMC_Ax(地址)和 FSMC_Dx(数据)设置为目标地址和数据值。
  • FSMC_NWE 被拉低,外部存储器开始写入。
  • 当写入完成后,FSMC_NWE 被拉高,FSMC 将完成该写操作。

FSMC_NOE 的含义

FSMC_NOE 的全称是 FSMC Output Enable (输出使能),它是 FSMC 用于控制外部存储器数据输出的信号引脚。

  • 名称含义

    • N:代表负逻辑(Active Low,低电平有效)。
    • OE:Output Enable(输出使能信号)。
  • 功能

    • FSMC_NOE 控制外部存储器是否将数据输出到 FSMC 的数据总线上。
    • FSMC_NOE 为低电平(逻辑 0)时,外部存储器的输出缓冲区被使能,数据可以传输到 FSMC 的数据总线。
    • FSMC_NOE 为高电平(逻辑 1)时,外部存储器的输出缓冲区被禁用,数据不会输出。

FSMC_NOE 的典型用途

  1. 与外部存储器的接口控制

    • 在读取外部存储器(如 NOR Flash 或 SRAM)时,FSMC 控制 FSMC_NOE 以使能数据的输出。
    • FSMC_NOE 信号通常连接到外部存储器的 OE 引脚,表示“是否允许数据输出”。
  2. 在读取操作中的作用

    • FSMC 进行读取操作时,FSMC_NOE 被拉低,通知外部存储器将数据放到数据总线上。
    • 在写操作或非活跃状态时,FSMC_NOE 保持高电平。

FSMC_NOE 的时序关系

FSMC_NOE 的控制通常与以下信号配合使用:

  1. FSMC_NE(芯片选择,Chip Select)
    • FSMC_NE 用于选择具体的外部存储器芯片。
    • FSMC_NE 为低电平时,选中的外部存储器被激活。
  2. FSMC_NWE(写使能,Write Enable)
    • 用于指示写操作。
    • FSMC_NWE 为低电平时,表示正在向存储器写入数据。
  3. 地址和数据总线(FSMC_A 和 FSMC_D)
    • 地址总线(FSMC_A)提供要访问的外部存储器地址。
    • 数据总线(FSMC_D)用于传输数据。

典型的读取时序如下:

  • FSMC 控制 FSMC_NE(芯片使能)和 FSMC_NOE(输出使能)信号,激活外部存储器的数据输出。
  • FSMC_NOE 拉低后,外部存储器将数据输出到数据总线上。
  • 数据输出完成后,FSMC 会将 FSMC_NOE 拉高,关闭数据输出。

使用FSMC驱动LCD

FSMC时序介绍 

FSMC是Flexible灵活的,可以产生多种时序来控制外部存储器。

  NOR/PSRAM控制器产生的异步时序就有5种,总体分为两类:一类是模式1,其他为拓展模式。

  拓展模式相对模式1来说读写时序时间参数设置可以不同,满足存储器读写时序不一样需求。

时序特性中的 OE

在时序特性中,“OE 在读取时序片选过程中不翻转” 或 “OE 在读取时序片选过程中翻转” 指的是 FSMC 控制 OE 信号在读取操作期间的状态行为:

  1. 不翻转

    • 读取操作开始时,FSMC 会将 OE 拉低,保持不变直到读取完成。
    • 这种方式适用于大多数 SRAM 或 CRAM 类型存储器。
  2. 翻转

    • 读取操作期间,FSMC 会在不同阶段对 OE 信号进行翻转(拉低-拉高-拉低),以协调更复杂的外部存储器时序。
    • 这种方式适用于特定类型的外部存储器,例如一些特殊的 SRAM 或 PSRAM。

 

 ILI9341重点时序:

读ID低电平脉宽(trdl)                        读ID高电平脉宽(trdh)

读FM低电平脉宽(trdlfm)                  读FM高电平脉宽(trdhfm)

写控制低电平脉宽(twrl)                    写控制高电平脉宽(twrh)

ID:指LCD的ID号                FM指帧缓存即GRAM

FSMC时序中ADDSET和DATAST不需要严格要求,可以使用实践值

 

FSMC地址映射 

使用FSMC外接存储器,其存储单元是映射到STM32的内部寻址空间的。

从FSMC角度看,可以把外部存储器划分为固定大小为256M字节的四个存储块。

FSMC存储块1被分为4个区,每个区管理64M字节空间。(64M Byte = 2^26 Byte)

 HADDRFSMC_A关系

HADDR总线是转换到外部存储器的内部AHB地址线。

简单来说,从CPU通过AHB总线到外部信号线之间的关系。

HADDR是字节地址,而存储器访问不都是按字节访问,接到存储器的地址线与其数据宽度相关。

注意:数据宽度为16位时,地址存在偏移

 LCDRS信号线与地址线关系

8080接口中RS(数据/命令选择线),用FSMC的某根A地址线进行替换。

FSMC_A10接到RS线上

        当FSMC_A10为高电平时(即RS为高电平),FSMC_D[15:0]被理解为数据。

        当FSMC_A10为低电平时(即RS为低电平),FSMC_D[15:0]被理解为命令。

究竟发送什么地址代替?

1、确认FSMC_NE4基地址:       

 0x6C00 0000        NEx(x=1…4):0x6000 0000 + (0x400 0000 * (x - 1))

2、确认FSMC_A10对应地址值

2^10 x 2 = 0x800        FSMC_Ay(y=0…25): 2^y x 2

3、确认两个地址

代表LCD命令的地址:0x6C00 0000

代表LCD数据的地址:0x6C00 0800

FSMC相关寄存器介绍

        对于NOR_FLASH/PSRAM控制器(存储块1)配置工作,通过FSMC_BCRx、FSMC_BTRx和FSMC_BWTRx寄存器设置(其中x=1~4,对应4个区)。

SRAM/NOR闪存片选控制寄存器(FSMC_BCRx 

 EXTMOD:扩展模式使能位,控制是否允许读写不同的时序。读和写用不同的时序,该位设置为1

WREN:写使能位。        向TFTLCD写入数据,该位设置1

 MWID[1:0]:存储器数据总线宽度。00,表示8位数据模式;01表示16位数据模式;10和11保留。

MTYP[1:0]:存储器类型。00表示SRAM、ROM;01表示PSRAM;10表示NOR FLASH;11保留。 

MBKEN:存储块使能位。该位设置1

SRAM/NOR闪存片选时序寄存器(FSMC_BTRx

ACCMOD[1:0]访问模式。00:模式A01:模式B10:模式C11:模式D

DATAST[7:0]数据保持时间,等于DATAST(+1)HCLK时钟周期,DATAST最大为255

对于ILI9341来说,其实就是RD低电平持续时间,最小为355ns

对于F1,一个HCLK = 13.9ns(1/72M),设置为15 (STM32F1的FSMC性能存在问题

对于F4,一个HCLK = 6ns(1/168M),设置为60

ADDSET[3:0]地址建立时间。表示ADDSET(+1)HCLK时钟周期,ADDSET最大为15

对于ILI9341来说,相当于RD高电平持续时间,为90ns

F1即使设置为0RD也有超过90ns的高电平,这里设置为1F4对该位设置为15

        如果未设置EXTMOD位,则读写共用这个时序寄存器!

SRAM/NOR闪存写时序寄存器(FSMC_BWTRx

 ACCMOD[1:0]:访问模式。00:模式A01:模式B10:模式C11:模式D

DATAST[7:0]数据保持时间,等于DATAST(+1)HCLK时钟周期,DATAST最大为255

对于ILI9341来说,其实就是WR低电平持续时间,最小为15ns

对于F1,一个HCLK = 13.9ns,设置为3

对于F4,一个HCLK = 6ns,设置为9

ADDSET[3:0]地址建立时间。表示ADDSET(+1)HCLK时钟周期,ADDSET最大为15

对于ILI9341来说,相当于WR高电平持续时间,为15ns

F1即使设置为1WR也有超过15ns的高电平,这里设置为1

F4对该位设置为8

FSMC寄存器组合说明

        在ST官方提供的寄存器定义里面,并没有定义FSMC_BCRxFSMC_BTRxFSMC_BWTRx等这个单独的寄存器,而是将他们进行了一些组合,规则如下:

FSMC_BCRxFSMC_BTRx,组合成BTCR[8]寄存器组,他们的对应关系如下:

          BTCR[0]对应FSMC_BCR1BTCR[1]对应FSMC_BTR1

          BTCR[2]对应FSMC_BCR2BTCR[3]对应FSMC_BTR2

          BTCR[4]对应FSMC_BCR3BTCR[5]对应FSMC_BTR3

          BTCR[6]对应FSMC_BCR4BTCR[7]对应FSMC_BTR4

FSMC_BWTRx则组合成BWTR[7]寄存器组,他们的对应关系如下:

          BWTR[0]对应FSMC_BWTR1BWTR[2]对应FSMC_BWTR2

          BWTR[4]对应FSMC_BWTR3BWTR[6]对应FSMC_BWTR4

          BWTR[1]、BWTR[3]BWTR[5]保留,没有用到

FSMC相关HAL库函数简介

        本例程涉及HAL库相关函数如下:

HAL_StatusTypeDef HAL_SRAM_Init ( 
SRAM_HandleTypeDef *hsram,
FSMC_NORSRAM_TimingTypeDef *Timing,
FSMC_NORSRAM_TimingTypeDef *ExtTiming )

 SRAM_HandleTypeDef

typedef struct 
{ 
	FSMC_NORSRAM_TypeDef *Instance;				/* 寄存器基地址 */
    FSMC_NORSRAM_EXTENDED_TypeDef *Extended; 	/* 扩展模式寄存器基地址 */ 
	FSMC_NORSRAM_InitTypeDef Init;				/* SRAM初始化结构体*/ 
	HAL_LockTypeDef Lock; 						/* SRAM锁对象结构体 */ 
	__IO HAL_SRAM_StateTypeDef State; 			/* SRAM设备访问状态 */ 
	DMA_HandleTypeDef *hdma; 					/* DMA结构体 */ 
} SRAM_HandleTypeDef;

寄存器基地址选择:FSMC_NORSRAM_DEVICE

扩展模式寄存器基地址:FSMC_NORSRAM_EXTERNDEVICE

FSMC_NORSRAM_InitTypeDef

typedef struct 
{ 
	uint32_t NSBank; 				/* 存储区块号 */ 
	uint32_t DataAddressMux; 		/* 地址/数据复用使能 */ 	
	uint32_t MemoryType; 			/* 存储器类型 */ 	
	uint32_t MemoryDataWidth; 		/* 存储器数据宽度 */
	uint32_t BurstAccessMode;		/* 设置是否支持突发访问模式,只支持同步类型的存储器 */
	uint32_t WaitSignalPolarity;	/* 设置等待信号的极性 */
	uint32_t WrapMode; 			    /* 突发模式下存储器传输使能 */
	uint32_t WaitSignalActive; 		/* 等待信号在等待状态之前或等待状态期间有效 */ 
	uint32_t WriteOperation; 		/* 存储器写使能 */ 
	uint32_t WaitSignal; 			/* 是否使能等待状态插入 */ 
	uint32_t ExtendedMode; 		    /* 使能或者禁止使能扩展模式 */ 
	uint32_t AsynchronousWait; 		/* 用于异步传输期间,使能或者禁止等待信号 */ 
	uint32_t WriteBurst; 			/* 用于使能或者禁止异步的写突发操作 */ 
	uint32_t PageSize; 				/* 设置页大小 */ 
} FSMC_NORSRAM_InitTypeDef;

 储存区块号选择:FSMC_NORSRAM_BANK4

地址/数据复用功能选择:FSMC_DATA_ADDRESS_MUX_DISABLE

储存器类型选择:FSMC_MEMORY_TYPE_SRAM

储存器数据宽度选择:FSMC_NORSRAM_MEM_BUS_WIDTH_16

储存器写使能选择:FSMC_WRITE_OPERATION_ENABLE

使能或者禁止使能扩展模式选择:FSMC_EXTENDED_MODE_ENABLE

FSMC_NORSRAM_TimingTypeDef

typedef struct 
{ 
	uint32_t AddressSetupTime; 			/* 地址建立时间 */ 
	uint32_t AddressHoldTime; 			/* 地址保持时间 */ 	
	uint32_t DataSetupTime; 			/* 数据建立时间 */ 	
	uint32_t BusTurnAroundDuration; 	/* 总线周转阶段的持续时间 */
	uint32_t CLKDivision;				/* CLK时钟输出信号的周期 */
	uint32_t DataLatency;				/* 同步突发NOR FLASH的数据延迟 */
	uint32_t AccessMode;				/* 异步模式配置 */
} FSMC_NORSRAM_InitTypeDef;

这里要配置addressSetupTime地址建立时间和DataSetupTime数据建立时间。

FSMC模拟8080时序读写简化代码

void lcd_wr_cmd(volatile uint16_t cmd)

{
          cmd = cmd;
          *(uint16_t *)(FSMC_ADDR_CMD) = cmd;

}
void lcd_wr_data(volatile uint16_t data)
{
    data = data;
	*(uint16_t *)(FSMC_ADDR_DATA) = data;
}
uint16_t lcd_rd_data(void)
{
	volatile uint16_t ram; 	
	ram = *(uint16_t *)(FSMC_ADDR_DATA);
	return ram;
}

硬件IO连接关系

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

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

相关文章

业务模型与UI设计

业务数据模型的设计、UI设计这应该是程序设计中不可缺少的部分。做程序设计的前提应该先把这两块设计好,那么,来一个实际案例,看看这2块的内容。 汽车保养记录业务模型与UI设计: 一、【车辆清单】 记录车辆相关的数据&#xff0…

【JavaScript】变量-常量-数据类型-类型转换

目录 一、JavaScript 介绍 1. JavaScript (是什么?) 2. 作用(做什么?) 3. JavaScript的组成(有什么?) 3.1 ECMAScript: 3.2 Web APIs : 总结: 4. Jav…

day30-awk精讲

awk其实不仅仅是工具软件,还是一种编程语言。 不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了。 awk是什么 awk是一个强大的linux命令,有强大的文本格式化的能力,好比将一些文本数据格式化…

实战设计模式之建造者模式

概述 在实际项目中,我们有时会遇到需要创建复杂对象的情况。这些对象可能包含多个组件或属性,而且每个组件都有自己的配置选项。如果直接使用构造函数或前面介绍的工厂方法来创建这样的对象,可能会导致以下两个严重问题。 1、参数过多。当一个…

滤波器的主要参数

为什么选择高阶: 滤波器的主要参数通常包括以下几个方面: 截止频率 (Cutoff Frequency): 这是滤波器能够有效通过或抑制信号的频率点。对于低通滤波器,信号低于截止频率的部分会被通过,高于截止频率的部分会被衰减。高…

HNSW概述

1. \textbf{1. } 1. 一些导论 1.1. \textbf{1.1. } 1.1. 朴素基于图的 ANN \textbf{ANN} ANN 1️⃣建图:对数据库中所有的点,构建 k -NN k\text{-NN} k-NN图(下图以 3 -NN 3\text{-NN} 3-NN为例) 2️⃣检索: GreedySearch \text{GreedySearch…

小程序学习07—— uniapp组件通信props和$emit和插槽语法

目录 一 父组件向子组件传递消息 1.1 props (a)传递静态或动态的 Prop (b)单向数据流 二 子组件通知父组件 2.1 $emit (a)定义自定义事件 (b)绑定自定义事件 三 插槽语法…

【视频笔记】基于PyTorch从零构建多模态(视觉)大模型 by Umar Jamil【持续更新】

视频链接: 基于PyTorch从零构建多模态(视觉)大模型 by Umar Jamil 从头编写一个视觉语言模型:PloyGamma,是谷歌的一个模型 1:原始图像 2:视觉编码器(本文是viT),通过对比学习进行训练。这个对比学习最开始是CLIP,后来被谷歌改成了SigLIP 3:线性投影层 4:如何将图…

UniApp | 从入门到精通:开启全平台开发的大门

UniApp | 从入门到精通:开启全平台开发的大门 一、前言二、Uniapp 基础入门2.1 什么是 Uniapp2.2 开发环境搭建三、Uniapp 核心语法与组件3.1 模板语法3.2 组件使用四、页面路由与导航4.1 路由配置4.2 导航方法五、数据请求与处理5.1 发起请求5.2 数据缓存六、样式与布局6.1 样…

《数据结构》期末考试测试题【中】

《数据结构》期末考试测试题【中】 21.循环队列队空的判断条件为?22. 单链表的存储密度比1?23.单链表的那些操作的效率受链表长度的影响?24.顺序表中某元素的地址为?25.m叉树第K层的结点数为?26. 在双向循环链表某节点…

Leffa 虚拟试衣论文笔记

Leffa: Learning Flow Fields in Attention for Controllable Person Image Generation https://github.com/xuanandsix/awesome-virtual-try-on-note/tree/main/Leffa 打开链接查看详情,更多虚拟试穿论文持续更新。

BP神经网络的反向传播算法

BP神经网络(Backpropagation Neural Network)是一种常用的多层前馈神经网络,通过反向传播算法进行训练。反向传播算法的核心思想是通过计算损失函数对每个权重的偏导数,从而调整权重,使得网络的预测输出与真实输出之间…

Git快速入门(三)·远程仓库GitHub以及Gitee的使用

目录 1. 远程仓库GitHub 1.1 登录 1.2 创建库 1.3 创建文件 1.4 修改文件 1.5 创建分支 1.6 删除库 1.7 将远程仓库下载到本地 1.7.1 关联登录 1.7.2 克隆 1.7.3 通过GitHub Desktop更改远程库 2. 远程仓库Gitee 2.1 登录 2.2 创建文件 2.3 关联…

【JVM】总结篇-字节码篇

字节码篇 Java虚拟机的生命周期 JVM的组成 Java虚拟机的体系结构 什么是Java虚拟机 虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box&…

Springboot日志打印、SpringBoot集成Log4j2(附源码)、异步日志

文章目录 一、Log4j2介绍1.1、常用日志框架1.2、为什么选用log4j2 二、Log4j2整合步骤2.1、引入jar包2.2、配置文件2.3、配置文件模版 三、配置参数简介3.1、日志级别3.2、日志格式(PatternLayout)3.3、Appenders组件列表3.3.1、Console3.3.2、File3.3.3…

上传本地项目或文件到SVN服务器(图片讲解,超简单)

上传本地项目或文件到SVN服务器(图片讲解,超简单) 1、使用TortoiseSVN2、输入SVN远程仓库地址3、添加文件或文件夹 需求:将本地的文件上传到SVN服务器上指定路径。前提:已经安装好TortoiseSVN 1、使用TortoiseSVN 右…

使用 HEIC/HEIF 编码器将 HEIC 转换为 JPEG

随着iOS 11之后新的HEIF图像格式的发布,在当前几乎所有软件仅支持JPEG图像而不支持HEIC图像的环境下,这对Apple来说可能是一个巨大的挑战。不过,仍有一些方法可以为有需要的用户打开、查看、传输或转换iOS 11 HEIC 照片格式。本文将向您介绍 …

基于JAVA+SSM的教学资料管理系统

基于JAVASSM的教学资料管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈喽兄弟们&a…

stm32 移植RTL8201F(正点原子例程为例)

最近在工作中需要使用RTL8201F,在网上找了很多帖子,没有找到合适的,自己翻资料移植了一个。 模板工程使用的是正点原子的f407探索版的例程,原子使用的是LAN8720,需要把他的驱动修改成为我们自己用的RTL8201F。 1.将PHY_TYPE改成我…

RK3588+麒麟国产系统+FPGA+AI在电力和轨道交通视觉与采集系统的应用

工业视觉识别系统厂家提供的功能主要包括: 这些厂家通过先进的视觉识别技术,实现图像的采集、处理与分析。系统能够自动化地完成质量检测、物料分拣、设备监控等任务,显著提升生产效率和产品质量。同时,系统具备高度的灵活性和可扩…