当前位置: 首页 > news >正文

灵活的静态存储控制器 (FSMC)的介绍(STM32F4)

目录

概述

1 认识FSMC

1.1 应用介绍

1.2 FSMC的主要功能

1.2.1 FSMC用途

1.2.2 FSMC的功能

2 FSMC的框架结构

2.1 AHB 接口

2.1.1 AHB 接口的Fault

2.1.2 支持的存储器和事务

2.2 外部器件地址映射

3 地址映射

3.1 NOR/PSRAM地址映射

3.2 NAND/PC卡地址映射


概述

本文主要介绍灵活的静态存储控制器 (FSMC)的基本概念,包括其支持主要器件,架构特点,以及在MCU内部AHB接口的特性,还介绍了其和外部NOR Flash,Nand flash, 以及SRAM的地址映射关系等内容。

1 认识FSMC

1.1 应用介绍

FSMC 能够连接同步、异步存储器和 16 位 PC 存储卡。其主要用途如下:

● 将 AHB 数据通信事务转换为适当的外部器件协议
● 满足外部器件的访问时序要求

所有外部存储器共享地址、数据和控制信号,但有各自的片选信号。 FSMC 一次只能访问一个外部器件。

总结如下:

1)所有的外部存储器共享地址、数据和控制信号

2)通过片选CS使能各自的片选

3)FSMC每一次只能选择一个器件

1.2 FSMC的主要功能

1.2.1 FSMC用途

FSMC 能够连接同步、异步存储器和 16 位 PC 存储卡。其主要用途如下:

● 将 AHB 数据通信事务转换为适当的外部器件协议
● 满足外部器件的访问时序要求

所有外部存储器共享地址、数据和控制信号,但有各自的片选信号。 FSMC 一次只能访问一个外部器件。

1.2.2 FSMC的功能

FSMC 具有以下主要功能:
1)连接静态存储器映射的器件:

— 静态随机访问存储器 (SRAM)
— 只读存储器 (ROM)
— NOR Flash/OneNAND Flash
— PSRAM( 4 个存储区域)

2)外围器件支持

两个带有 ECC 硬件的 NAND Flash 存储区域,可检查多达 8 KB 的数据。16 位 PC 卡兼容设备,支持对同步器件( NOR Flash 和 PSRAM)的突发模式访问;8 或 16 位宽的数据总线;每个存储区域有独立的片选控制,每个存储区域可独立配置。

3) 可对时序进行编程,以支持各种器件:

— 等待周期可编程(最多 15 个时钟周期)
— 总线周转周期可编程(最多 15 个时钟周期)
— 输出使能和写入使能延迟可编程(最多 15 个时钟周期)
— 独立的读和写时序和协议,以支持各种存储器和时序

4)其他功能

● 写使能和字节通道选择输出,可配合 PSRAM 和 SRAM 器件使用
● 将 32 位的 AHB 事务转换为针对外部 16 位或 8 位器件进行的连续 16 位或 8 位访问。
● 用于写入的 FIFO, 2 字长(对于 STM32F42x 和 STM32F43x,为 16 字长),每个字为32 位宽,仅用于存储数据,而不存储地址。因此,此 FIFO 仅会缓冲 AHB 批量写事务。从而可对慢速存储器执行写入操作后能快速释放 AHB,以供其它操作使用。每次仅缓冲一个突发事务:如果在有操作正在进行时发生一个新的 AHB 突发事务或者一个单独事务,则 FIFO 将会清空。 FSMC 将插入等待周期,直至当前存储器访问已完成)。

5)外部异步等待控制
定义外部器件类型和其特性的 FSMC 寄存器通常在启动时进行设置,并且在下次上电或复位前保持不变。但也可随时更改这些设置。

2 FSMC的框架结构

FSMC 包含四个主要模块:
1)AHB 接口(包括 FSMC 配置寄存器)
2)NOR Flash/PSRAM 控制器
3)NAND Flash/PC 卡控制器
4)外部器件接口

2.1 AHB 接口

CPU 和其它 AHB 总线主设备可通过该 AHB 从设备接口访问外部静态存储器。AHB 事务会转换为外部器件协议。尤其是当所选外部存储器的宽度为 16 位或 8 位时, AHB中的 32 位宽事务将被划分成多个连续的 16 或 8 位访问。片选将在每次访问时进行切换。

2.1.1 AHB 接口的Fault

出现以下条件时, FSMC 将产生 AHB 错误:

● 读取或写入未使能的 FSMC 存储区域
● 在 FSMC_BCRx 寄存器中的 FACCEN 位复位时读取或写入 NOR Flash 存储区域
● 在输入引脚 FSMC_CD( Card Presence Detection)为低电平时读取或写入 PC 卡存储区域

此 AHB 错误的影响具体取决于尝试进行读写访问的 AHB 主设备:
● 如果为 Cortex™-M4F CPU,则会生成硬性故障 (hard fault) 中断
● 如果为 DMA,则会生成 DMA 传输错误,并会自动禁用相应的 DMA 通道AHB 时钟 (HCLK) 是 FSMC 的参考时钟。

2.1.2 支持的存储器和事务

1)通用事务规则

所请求的 AHB 事务传输大小可以是 8、 16 或 32 位,但访问的外部器件具有固定的数据宽度。这可能会导致不一致的数据宽度。因此,必须遵循一些简单的事务规则:

AHB 事务数据宽度存储器数据宽度相等没有任何问题。

AHB 事务数据宽度大于存储器宽度在此情况下, FSMC 会将 AHB 事务分为多个较小的连续存储器访问,以便符合外部数据宽度。

对具有字节选择功能的器件( SRAM、 ROM、 PSRAM)进行异步访问。

a) FSMC 允许写入事务通过其字节选择通道 NBL[1:0] 访问恰当的数据
b) 允许读取事务。会读取所有存储器字节,并将丢弃无用的存储器字节。 NBL[1:0]在读取事务期间保持为低电平。

对不具有字节选择功能的器件( 16 位 NOR 和 NAND Flash)进行异步访问。

当请求对 16 位宽的 Flash 存储器进行字节访问时会发生此情形。显然,不能在字节模式下访问此器件(只能针Flash 存储器读取或写入 16 位字),因此:

a) 不允许写入事务
b) 允许读取事务。会读取所有存储器字节,并将丢弃无用的存储器字节。 NBL[1:0]在读取事务期间保持低电平。

2)配置寄存器

FSMC 可通过一个寄存器组进行配置。有关 NOR Flash/PSRAM 控制寄存器的详细说明

2.2 外部器件地址映射

从 FSMC 的角度,外部存储器被划分为 4 个固定大小的存储区域,每个存储区域的大小为256 MB(请参见下图 ):

● 存储区域 1 可连接多达 4 个 NOR Flash 或 PSRAM 存储器器件。此存储区域被划分为 4 个NOR/PSRAM 区域,带 4 个专用片选信号。
● 存储区域 2 和 3 用于连接 NAND Flash 器件(每个存储区域一个器件)
● 存储区域 4 用于连接 PC 卡设备

对于每个存储区域,所要使用的存储器类型由用户在配置寄存器中定义。

3 地址映射

3.1 NOR/PSRAM地址映射

HADDR[27:26] 位用于从表 185 中所示的四个存储区域之中选择其中一个存储区域。

NOR/PSRAM 存储区域选择



 HADDR[25:0] 包含外部存储器地址。由于 HADDR 为字节地址,而存储器按字寻址,所以根据存储器数据宽度不同,实际向存储器发送的地址也将有所不同,如下表所示。

外部存储器地址

如果外部存储器的宽度为 16 位, FSMC 将使用内部的 HADDR[25:1] 地址来作为对外部存储器的寻址地址
FSMC_A[24:00]。
无论外部存储器的宽度为 16 位还是 8 位, FSMC_A[0] 都应连接到外部存储器地址 A[0]。
 

NOR Flash/PSRAM 的回卷支持
不支持同步存储器的回绕突发模式。存储器必须按未定义长度的线性突发模式进行配置。

3.2 NAND/PC卡地址映射

在此情况下,有三个存储区域,每个存储区域分为各个存储空间,如下表所示。

存储器映射和时序寄存器

 对于 NAND Flash 存储器,通用区和特性区存储空间分为三个部分,均位于低位 256 KB 中(见下面的表):

● 数据区域(通用/特性存储空间中的第一个 64 KB)
● 命令区域(通用/特性存储空间中的第二个 64 KB)
● 地址区域(通用/特性存储空间中的下一个 128 KB)

NAND 存储区域选择

应用程序软件使用这 3 个区域来访问 NAND Flash 存储器:

● 向 NAND Flash 存储器发送命令:软件可以向命令区域中的任意存储器位置写入命令值。
● 指定读取或写入的 NAND Flash 地址:软件可以向地址区域中的任意存储位置写入地址值。由于地址的长度可以是 4 或 5 个字节(具体取决于实际存储器大小),要指定完整的地址,需要对地址区域执行多个连续写入操作。
● 读取或写入数据:软件将从数据区域中的任意存储器位置读取数据值,或者向其中写入数据值。

由于 NAND Flash 存储器会自动递增地址,所以在访问连续存储器位置时,无需递增数据区域
的地址。


 

相关文章:

灵活的静态存储控制器 (FSMC)的介绍(STM32F4)

目录 概述 1 认识FSMC 1.1 应用介绍 1.2 FSMC的主要功能 1.2.1 FSMC用途 1.2.2 FSMC的功能 2 FSMC的框架结构 2.1 AHB 接口 2.1.1 AHB 接口的Fault 2.1.2 支持的存储器和事务 2.2 外部器件地址映射 3 地址映射 3.1 NOR/PSRAM地址映射 3.2 NAND/PC卡地址映射 概述…...

nginx-rtmp

1.已经安装nginx;configure配置模块;make编译无需安装;把objs/nginx复制到已安装的宁目录下 ./configure --prefix/usr/local/nginx --add-module/usr/local/src/fastdfs-nginx-module/src --add-module/usr/local/src/nginx-rtmp-module-mas…...

nginx 代理java 请求报502

情况:nginx代理java 请求 后端返回正常,但是经过nginx 时报502 经过多次对比其他接口发现可能是返回的请求头过大,导致nginx 报错:如下 2024/05/13 02:57:12 [error] 88#88: *3755 upstream sent too big header while reading r…...

面试集中营—Redis面试题

一、Redis的线程模型 Redis是基于非阻塞的IO复用模型,内部使用文件事件处理器(file event handler),这个文件事件处理器是单线程的,所以Redis才叫做单线程的模型,它采用IO多路复用机制同时监听多个socket&a…...

关于使用git拉取gitlab仓库的步骤(解决公钥问题和pytho版本和repo版本不对应的问题)

先获取权限,提交ssh-key 虚拟机连接 GitLab并提交代码_gitlab提交mr-CSDN博客 配置完成上诉步骤之后,执行下列指令进行拉去仓库的内容 sudo apt install repo export PATHpwd/.repo/repo:$PATH python3 "实际路径"/repo init -u ssh://gitxx…...

Django图书馆综合项目-学习(2)

接下来我们来实现一下图书管理系统的一些相关功能 1.在书籍的book_index.html中有一个"查看所有书毂"的超链接按钮,点击进入书籍列表book_list.html页面. 这边我们使用之前创建的命名空间去创建超连接 这里的book 是在根路由创建的namespacelist是在bo…...

vue3+ts 获取input 输入框中的值

从前端input 输入框获取值&#xff0c;通过封装axios 将值传给后端服务 数据格式为json html <el-form> <el-form-item label"域名"><el-input v-model"short_url" style"width: 240px"type"text"placeholder&quo…...

Gin框架返回Protobuf类型:提升性能的利器

在构建高效、高性能的微服务架构时&#xff0c;数据序列化和反序列化的性能至关重要。Protocol Buffers&#xff08;简称Protobuf&#xff09;作为一种轻量级且高效的结构化数据存储格式&#xff0c;已经在众多领域得到广泛应用。Gin框架作为Go语言中流行的Web框架&#xff0c;…...

HTML满屏漂浮爱心

目录 写在前面 满屏爱心 代码分析 系列推荐 写在最后 写在前面 小编给大家准备了满屏漂浮爱心代码&#xff0c;一起来看看吧~ 满屏爱心 文件heart.svg <svg xmlns"http://www.w3.org/2000/svg" width"473.8px" height"408.6px" view…...

爬虫应该选择住宅ip代理还是数据中心代理?

住宅代理 住宅代理是互联网服务提供商 (ISP) 提供的 IP 地址&#xff0c;它们是附加到实际物理位置的真实IP地址。住宅代理允许用户通过目标区域内的真实IP地址连接到互联网。 数据中心代理 数据中心代理是指是使用数据中心拥有并管理IP的代理&#xff0c;IP地址来源于数据中…...

百面算法工程师目录 | 深度学习目标检测、语义分割、分类上百种面试问答技巧

本文给大家带来的百面算法工程师是深度学习面试目录大纲&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;可以点击题目直达问题答案处&#xff0c;方便查找问题寻找答案。节约大家的时间。通过对这…...

Java中Maven的依赖管理

依赖介绍 是指当前项目运行所需要的jar包&#xff0c;一个项目中可以引入多个依赖 配置 在pom.xml中编写<dependencies>标签 在<dependencies>中使用<dependency>引入标签 定义坐标的groupId、rtifactId、version 点击刷新按钮、引入新坐标 例如引入下…...

Github新手入门使用方法

**存在问题&#xff1a;**新手如何快速入门github&#xff0c;能够下载开源文件&#xff0c;并且修改后更新远程github仓库&#xff1b; 解决方案&#xff1a; 参考&#xff1a; http://www.360doc.com/content/24/0301/12/60419_1115656653.shtml https://blog.csdn.net/gongd…...

期权隐含波动率到底是什么意思?

今天期权懂带你了解期权隐含波动率到底是什么意思&#xff1f;期权隐含波动率解析。通俗的说&#xff0c;期权隐含波动率是在期权市场中买家和卖家对于&#xff0c;某一期权合约价格变动幅度大小的判断。 期权隐含波动率到底是什么意思&#xff1f; 隐含波动率是根据期权市场价…...

28、Flink 为管理状态自定义序列化

为管理状态自定义序列化 a&#xff09;概述 对状态使用自定义序列化&#xff0c;包含如何提供自定义状态序列化程序、实现允许状态模式演变的序列化程序。 b&#xff09;使用自定义状态序列化程序 注册托管 operator 或 keyed 状态时&#xff0c;需要 StateDescriptor 来指…...

【强训笔记】day17

NO.1 思路&#xff1a;用一个字符串实现&#xff0c;stoi函数可以转化为数字并且去除前导0。 代码实现&#xff1a; #include <iostream> #include<string> using namespace std;string s;int main() {cin>>s;for(int i0;i<s.size();i){if(s[i]%20) s[…...

平滑 3d 坐标

3d平滑 import torch import torch.nn.functional as F import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Dclass SmoothOperator:def smooth(self, vertices):# 使用一维平均池化进行平滑vertices_smooth F.avg_pool1d(vertices.p…...

Go解析的数据类型可能含有不同数据结构的处理方式

最近做一个需求&#xff0c;各种业务消息都会往我的消息队列中写各种类型的数据&#xff0c;服务端需要接受各种不同的参数然后转换为本地数据结构&#xff0c;Go语言不确定上游传过来的数值是什么类型&#xff0c;然后又下面四种解决方案。 1. 类型断言和类型切换 func (Mis…...

Java网络编程基础

Java网络编程基础主要涉及进程间通信、网络通信协议、IP地址和端口以及Java提供的网络应用编程接口等核心概念。 进程间通信是Java网络编程的基础。进程是运行中的程序&#xff0c;而进程间通信则是指不同进程之间进行数据交换和共享信息的过程。在Java中&#xff0c;进程间的…...

鸿蒙DevEco Studio 4.1 Release-模拟器启动方式错误

软件版本&#xff1a;DevEco Studio 4.1 Release 报错提示&#xff1a; 没有权限查看处理指导 Size on Disk 显示1.0MB 尝试方案&#xff08;统统无效&#xff09;&#xff1a; 1、“windows虚拟机监控程序平台”、"虚拟机平台"已开启 启用CPU虚拟化 2、C…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...