【STM32】FSMC—扩展外部 SRAM 初步使用 1

基于野火指南者《零死角玩转 STM32F103—指南者》的学习
STM32F103系列

FSMC Flexible Static Memory Controller简介

1.详细功能参看《STM32F10x参考手册》,这边是概述

是一个外设,挂载在AHB总线下。
可以用于驱动包括 SRAMNOR FLASH 以及 NAND FLSAH 类型的存储器,不能驱动如 SDRAM 这种动态的存储器
STM32F429 系列的控制器中,它具有 FMC 外设,支持控制 SDRAM 存储器。

简单来说类似于GPMC,可以以直接寻址的方式操作外置的存储设备,比如挂载一块SRAM在0x6000 0000处,不需要再像操作外置存储设备那样使用相关协议写一个字节,直接*(char)0x6000 0000 = 0x01就可以了。

在这里插入图片描述

2.根据外接的存储设备选引脚

在这里插入图片描述
2.1 控制不同类型存储器的时候会有一些不同的引脚,看起来有非常多
2.2 不同模式使用不同引脚,根据框图分为NOR/PSRAM ,NANDPC卡信号三类
2.3 FSMC_A 和数据线 FSMC_D是所有控制器都共用

3. 对于同一种类的存储器也可以有不同模式,以NOR/PSRAM模式为例子

我们需要操作的是NOR型存储器,所以选择NOR型模式,

复用模式和非复用模式依照实际情况选择(也就是地址线和数据线是否复用)
复用引脚和非复用

FSMC 信号名称信号方向功能
CLK输出时钟(同步突发模式使用);;
NE[x]输出片选,x = 1…4
NADV输出地址、数据线复用时作锁存信号
A[25:0]输出地址总线
D[15:0]输入/输出双向数据总线
NOE输出输出使能
NWE输出写使能
NWAIT输入NOR 闪存要求 FSMC 等待的信号
NBL[1]输出高字节使能(存储器信号名称为:NUB) PSRAM使用
NBL[0]输出低字节使能(存储器信号名称为:NLB) PSRAM使用

N表示低有效
其他型号的存储器引脚分配详见资料手册

4.地址映射 与 地址线

地址映射 分配给FSMC的地址是哪里?

FSMC 连接好外部的存储器并初始化后,就可以直接通过访问地址来读写数据 其中这部分在内存中有着固定的存储地址,存储单元是映射到 STM32 的内部寻址空间的;在程序里,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容,FSMC 外设会自动完成数据访问过程,读写命令之类的操作不需要程序控制。

在这里插入图片描述
0x6000 0000 至 0x9FFF FFFF用于FSMC。

FSMC 把整个 存储区域分成了 4 个 Bank 区域,NOR 及 SRAM 存储器只能使用 Bank1 的地址,在每个 Bank 的内部又分成了 4 个小块,每个小块有相应的控制引脚用于连接片选信号FSMC_NE1/2/3/4

当 STM32 访问0x60000000-0x63FF FFFF 地址空间时,其实就是访问FSMC BANK1的第1块区域,FSMC_NE1 引脚会自动设置为低电平
在这里插入图片描述

0x60000000-0x6FFF FFFF这片地址也就是Bank1的256M字节空间,在芯片内部由AHB总线上的28根地址线(ADDR[27:0])寻址。这里ADDR 是内部AHB地址总线,其中ADDR[25:0]对应外部存储器地址FSMC_A[25:0],而HADDR[26:27]对应4个区.

ADDR[25:0],有26根地址线,也就是可以进行2**26地址范围的寻址,(也就是0x400 0000)。
HADDR[26:27]对4个区进行寻址.

四个区对应二进制,红色部分就是bit HADDR[26:27]:
Bank1:0110-0000 0000-0000 0000-0000 0000-0000 ,即 60 00 00 00;

Bank2:0110-0100 0000-0000 0000-0000 0000-0000 ,即 64 00 00 00;

Bank3:0110-1000 0000-0000 0000-0000 0000-0000 ,即 68 00 00 00;

Bank4:0110-1100 0000-0000 0000-0000 0000-0000 ,即 6c 00 00 00;

在这里插入图片描述
总结对于存储块BANK1cpu给他分配的地址是0x60000000-0x6FFF FFFF,那么cpu对他寻址的话是使用32根地址线,其中低ADDR[25:0]根可以外接到外部存储器进行0x400 0000范围的寻址,ADDR[27:26]根可以在Bank中的四部分选择一个。

外部存储器宽度

默认情况下存储器的一个地址对应的是1个byte,那么可以正常当作cpu上内部存储一样读取。如果存储器地址数据为16位,32位,也就是两个字节一个地址,四个字节一个地址,那么控制16位,32位宽度的存储设备,且不支持单字节访问就比较麻烦了。

存储器地址数据为16位,32位的这种类型的存储器,我们本来对应64M个的byte的地址,就变成了32M个的双字节byte的地址,也就是最后一位ADDR[bit0]无效了,因为地址一次要加2
在这里插入图片描述
在这里插入图片描述
HADDR[27:0]:AHB总线对外设FSMC寻址的地址线,AHB总线与FSMC的连接
FSMC_A[25:0]:FSMC外设对外部扩展存储的寻址线。

不同类型的存储器 不同类型的控制方式

根据类型选择模式:FSMC可以控制很多类型的器件,模式1 —— SRAM/CRAM
类型模式下还有模式ABCD : 对于模式1还有ABCD四种模式,这里选择模式B进行说明

FSMC 控制异步 NOR FLASH 的时序

FSMC 读 NOR FLASH 的时序图(模式 B)
在这里插入图片描述
当内核发出访问某个指向外部存储器地址时,FSMC 外设会根据配置控制信号线产生时序访问存储器,上图中的是访问外部异步 NOR FLASH(模式 B)时 FSMC外设的读写时序。

以读时序为例,该图表示一个存储器操作周期由地址建立周期(ADDSET)、数据建立周期(DATAST)以及 2个 HCLK周期组成。在地址建立周期中,地址线发出要访问的地址,数据掩码信号线指示出要读取地址的高、低字节部分,片选信号使能存储器芯片;地址建立周期结束后读使能信号线发出读使能信号,接着存储器通过数据信号线把目标数据传输给 FSMC,FSMC 把它交给内核。

FSMC 写 NOR FLASH 的时序图(模式 B)
在这里插入图片描述

写时序类似,区别是它的一个存储器操作周期仅由地址建立周期(ADDSET)和数据建立周期(DATAST)组成,且在数据建立周期期间写使能信号线发出写信号,接着FSMC把数据通过数据线传输到存储器中。

FSMC寄存器

NOR/PSRAM/SRAM 设备使用相同的控制器;
NAND/PC 卡设备使用相同的控制器;

控制 NOR FLASH 的有 FSMC_BCR1/2/3/4 控制寄存器、FSMC_BTR1/2/3/4 片选时序寄存器以及 FSMC_BWTR1/2/3/4 写时序寄存器。

FSMC时钟

FSMC 外设挂载在 AHB 总线上,时钟信号来自于 HCLK(默认 72MHz),控制器的同步时钟输出就是由它分频得到。

它的时钟频率可通过 FSMC_BTR 寄存器的 CLKDIV 位配置,HCLK 与 FSMC_CLK 的分频系数(CLKDIV),可以为 2~16 分频

它可用于与同步类型的 NOR FLASH 芯片通过FSMC_CLK 引脚输出进行同步通讯。
对于异步类型的存储器,不使用同步时钟信号,所以时钟分频配置不起作用。

其他资料

收集参考资料: keil中扩展RAM的使用与配置

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

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

相关文章

C#自定义控件组件实现Chart图表(多Y轴,选择图例加粗,选择放大,缩放,点击查看信息等功能)

先看看ECharts的效果 C# 工具箱里的Chart控件就不演示了,很多效果没办法做出来,做出来效果也很不理想。所以,需要自己去手动实现工具箱里的Chart没办法实现的效果; 先看看实现后的效果 绑定数据 点击图表 点击右侧图例加粗 选择放大 右键 点击缩小,恢复

RJ45水晶头网线顺序出错排查

线序 网线水晶头RJ45常用的线序标准ANSI / TIA-568定义了T568A与T568B两种线序,一般使用T568B,水晶头8个孔对应的8条线颜色如下图: 那1至8的编号,是从水晶头哪一面为参考呢,如下图,是水晶头金手指一面&am…

华为云云耀云服务器L实例评测 | 由于自己原因导致MySQL数据库被攻击 【更新中。。。】

目录 引出起因(si因)解决报错诶嘿,连上了 不出意外,就出意外了打开数据库what??? 找华为云求助教训:备份教训:密码 解决1.改密码2.新建一个MySQL,密码设置复杂…

【React + Umi】自定义离开页面拦截弹框事件

在 react umi 中对离开页面的行为进行自定义弹窗拦截控制。以下为可选的方案分析。 wrapper 首先,因为项目框架是 umi,最先想到了 umi 路由的 wrapper 装饰器,但仔细一想又不太对, wrapper 争对于跳转到某个特定页面的前置行为…

node.js下载安装环境配置以及快速使用

目录 一、下载 二、安装 三、测试安装是否成功 四、配置环境 五、测试配置环境是否成功 六、安装淘宝镜像 七、快速上手 1、建立一个自己的工作目录 2、下载工作代码 八、各种配置文件匹配问题入坑 九、总结 一、下载 Node.js 中文网 想选择其他版本或者其他系统使用…

Linux服务使用宝塔面板搭建网站,并发布公网访问 - 内网穿透

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

golang读取yaml文件

yaml文件名:agent.yml agent:agentName: agent001location:type: cdbenv: prodrole: roset: tsh2idc: st4zone: ap-shanghai-4hostname: baidu.comcontent: register new Agent agent001注意,空格,不要用tab键 golang文件:main.g…

在找工作时的准备工作:结合现状,针对意向企业做好充分准备

在寻找工作时,充分准备是非常重要的。不仅要了解自己的现状和能力,还需要对意向企业进行深入了解,并提前准备好与该企业相关的技能和知识。尤其对于程序员来说,在面试IT技术岗位时,以下技巧可能会对你有所帮助&#xf…

地理地形sdk:Tatuk GIS Developer Kernel for .NET Crack

Tatuk GIS Developer Kernel for .NET 是一个变体,它是受控代码和 .NET GIS SDK,用于为用户 Windows 操作系统创建专业 GIS 软件的过程。它被认为是一个完全针对Win Forms 的.NET CIL,WPF 框架是针对C# 以及VB.NET、VC、Oxy 以及最终与.NET 的…

数据接口工程对接BI可视化大屏(六)接收前台数据

文章目录 第6章 接收前台数据6.1 模拟数据6.2 接收数据6.2.1 编写Dao6.2.2 编写ServiceImpl6.2.3 编写Controller6.2.4 验证 后记 第6章 接收前台数据 在工作中也会遇到需要接收前台发送数据,进行存储的情况。这里以接收日志服务器的日志数据保存到kafka为例。 6.…

循环购模式:美业的新机遇和新挑战

美业是一个高频消费的行业,每个人都想要拥有美丽的容颜和健康的身体。但是,美业的消费门槛往往较高,很多人会觉得美容美发等服务太贵,不敢轻易尝试。如果有一种模式,能够让消费者在享受美业服务的同时,还能…

05_css选择器的使用

一、css选择器的类型 1、标签选择器 用法&#xff1a;直接写 写标签名&#xff1a;标签名{} 示例&#xff1a; <!-- <!DOCTYPE html --> <html><head><meta charset"utf-8"><title>标签选择器</title><style type"te…

Kubernetes 部署发布镜像(cubefile:0.4.0)

目录 实验&#xff1a;部署发布镜像&#xff08;cubefile:0.4.0&#xff09; 需求分析&#xff1a; 1、部署Kubenetes环境&#xff1a; 2、撰写 cubefile-deployment.yaml 文件 代码解释&#xff1a; 遇到的问题&#xff1a; 问题解决 &#xff1a; 3、撰写 cubefile-se…

Date日期工具类(数据库日期区间问题)

文章目录 前言DateUtils日期工具类总结 前言 在我们日常开发过程中&#xff0c;当涉及到处理日期和时间的操作时&#xff0c;字符串与Date日期类往往要经过相互转换&#xff0c;且在SQL语句的动态查询中&#xff0c;往往月份的格式不正确&#xff0c;SQL语句执行的效果是不同的…

mac 13.x 打开第三方应用,提示已损坏无法打开

前排提示&#xff0c;不一定有效 1、先在终端执行下面这个&#xff0c;因为要提权&#xff0c;输入自己的密码 sudo xattr -r -d com.apple.quarantine 具体应用 # 具体应用是一个路径&#xff0c;拖入 访达——应用程序——第三方应用 到终端就行 # sudo xattr -r -d com.app…

数据结构--二叉树-堆(1)

文章目录 树概念相关的基本概念树的表示 二叉树概念特殊二叉树性质 堆二叉树的顺序结构堆的概念 堆的实现初始化数组初始化为堆向上调整向下调整插入删除打印、摧毁、判空、获取堆顶数据验证 堆的应用堆排序TopK问题 树 概念 树是一种常见的非线性的数据结构&#xff0c;&…

微信、支付宝修改步数【小米运动】

简介 小米运动是一款流行的健身应用,可以记录用户的步数和运动数据。然而,有些用户希望能够修改步数,以达到一些特定的目的。本文将介绍一个Python脚本,可以帮助用户实现修改小米运动步数的功能。 正文 脚本介绍: 本脚本是一个Python脚本,用于修改小米运动步数。通过模…

ERROR 之 SpringMVC开发注解版之版本问题

如果你也和我一样&#xff0c;完全是按照狂神老师的代码来敲的&#xff0c;不用注解版的情况下是不会出错的&#xff0c;但是一用注解版&#xff0c;就出现了404&#xff0c;500的类型的错误。那我真诚的建议你换个jdk版本,再来试试。我试了3遍&#xff0c;事实证明用jdk1.8&am…

约瑟夫环(循环列表实现)

约瑟夫&#xff08;Joseph&#xff09;问题的一种描述是&#xff1a;编号为1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;n的n个人按顺时针方向围坐一圈。每人持有一个密码&#xff08;正整数&#xff09;。一开始任选一个正整数作为报数上限值m&#xff0c;从第一个…

论在Java如何计算int的最大值

问&#xff1a;在Java中&#xff0c;int最大是多少&#xff1f; 嗯~~ 是不是比较难记&#xff0c;不过想必大家都清楚另一种记法&#xff1a; 2 31 − 1 2 ^ {31} - 1 231−1 这种记法的优点就在于能够简单的记几个数字就可以&#xff0c;分开记就是&#xff1a;2、31、-1 …