STM32_ FSMC

发布者:深沉思考最新更新时间:2022-02-28 来源: eefocus关键字:STM32  FSMC 手机看文章 扫描二维码
随时随地手机看文章

前言:

从51学到STM32的FSMC 时候,我感觉很难,开始对着视频一顿猛刷,看的我雨里雾里。不知道这到底是个啥玩意。后来,慢慢往后学,我才顿悟了,说简单点,FSMC就是一个方便使用者来连接外挂设备的一个工具,比如你要用到TFTLCD彩屏,外扩的SRAM芯片,你当然可以用软件去配置引脚来模拟器件通信的时序,就像在51里面软件模拟IIC时序来驱动1302一样,但是这样无疑会很复杂,那么,为了方便使用,STM32就造出来个FSMC来硬件实现这个时序问题,你要做的就是配置寄存器即可。


1:FSMC的功能简介

灵活的静态存储控制器(FSMC),其主要用途:


将AHB数据通信事务转换为适当的外部器件协议

满足外部器件的访问时序要求

STM32的FSMC接口支持包括(连接静态存储器映射的器件)


静态随机访问存储器(SRAM):是随机存取存储器的一种,所谓“静态”,是指这种存储器只要保持通电,就可以一直保持数据

只读存储器(ROM):只读存储器,只读不可写,断电可以保持数据,更改数据只能在特定条件下

NOR Flash/OneNAND Flash:非易失闪存技术

PSRAM(4个存储区域):伪静态随机存储器

 

2:FSMC框图

FSMC包含四个主要模块:

AHB接口(包括FSMC配置寄存器)

NOR Flash/PSRAM 控制器

NAND Flash/PC卡控制器


外部器件接口

1:AHB接口:CPU和其他AHB总线主设备可通过该AHB从设备接口访问外部静态存储器,我们所访问的外部存储器一般是16或8位宽,而AHB是32位宽,所以用AHB去访问时。会划分成多个16或8位访问。


2:NOR Flash/PSRAM  FSMC会生成适当的信号时序,以驱动以下类型的存储器


异步SRAM和ROM : 8位,16位,32位

PSRAM :异步模式,突发模式,复用或非复用

NOR Flash :异步模式或突发模式,复用或非复用

至于各种模式下引脚的定义,数据手册中都有详细的概述,不多说

3:NAND Flash/PC卡控制器   FSMC会生成相应的信号时序,用于驱动以下类型的设备


NAND Flash :8位,16位

16位PC卡兼容设备


4:外部器件接口


从FSMC的角度,外部存储器被划分为4个固定大小的存储区域,每个存储区域的大小位256M


存储区域1可连接多达4个NOR Flash或PSRAM存储器器件,带4个专用片选信号

存储区域2、3用于连接NAND Flash器件(每个存储区域一个器件)

存储区域4用于连接PC卡设备

Bank1也是我们最长使用的一个区


NOR/PSRAM地址映射:


Bank1的256M字节空间由28根地址线(HADDR[27:0])寻址,这里HADDR,是内部AHB地址总线,其中HADDR[25:0]来自外部存储器地址FSMC_A[25:0],而HADDR[26:27]对4个区进行寻址,详细的瞅数据手册,


这里有一个理解难点


当Bank1接的是16位宽度存储器的时候:HADDR[25:1]->FSMC_A[24:0]


当Bank1接的是8位宽度存储器的时候:HADDR[25:0]->FSMC_A[25:0]


why?


往下瞅


 


3:FSMC HADDR与FSMC_A 的地址问题

首先说一个前提:STM32 单片机的一个地址(如:0x2000 0000)对应的数据是一个字节


也就是说如果定义一个16位数组 u16 temp[5]  如果temp[0]对应的地址是0x0000 0000 那么temp[1]对应的地址是0x0000 0002 (地址是加2,因为前面说了,32一个地址对应一个字节,U16,是两个字节)、、


 


假设此时我们有一个 64K*8bit 的sram


那很简单 stm32的A0~A15 与存储器A0~A15连接 大家很容易理解


 


若此时是 64K*16bit 的sram


也就是此时sram的一个地址对应两个字节 但是stm32是一个地址一个字节 这就出现了对准的问题


如果我们的地址线依然是stm32A0~A15 和 存储器的A0~A15 连接 


如果stm32要从sram中读取前面提到数组中的temp[1]


stm32会给出0x0000002(二进制地址0000000000000010b) 可是对于我们这个sram来说 读到却是temp[2],因为sram一个地址就是一个16位数据,这个地方好好想一下,于32来说,要挪两下,而16位的SRAM不同,只需要挪一下。 


为了解决这个问题 我们只需要在给sram送地址时 右移一位 再送地址 即可(sram的一个地址对应stm32两个地址的数据)


比如读取0x0000002 右移一位(即除2)为0x0001(000000000000001b) 此时对应的就是temp[1]


 


此时会有另外一个问题 每次都右移一位 A0没用吗 也即只能读写偶地址的数据吗?


这也就是NBL0和NBL1的作用了 如果你要进行字节操作 


如stm32发送地址0x0000001读取一个字节 右移一位对应的是sram地址0x0000处的16位数据 FSMC会根据AO 来控制NBLO和NBL1若为10 读取高字节数据


所以呢  偶字节读写时仅NBL0有效,奇字节读写时仅NBL1有效 低电平有效)


 


4:FSMC寄存器介绍

关于FSMC的一些访问模式,就不写了,太多了,可以去看数据手册


关于寄存器的描述,也不都贴出来,看数据手册比我这好多了,主要来说一下寄存器的组合


在ST官方库提供的寄存器定义里面,并没有定义FSMC_BCRx,FSMC_BTRx,FSMC_BWTRx等这些个单独的寄存器,而是进行了一些组合,规律如下 


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


BTCR[0]对应FSMC_BCR1

BTCR[1]对应FSMC_BTR1

BTCR[2]对应FSMC_BCR2

BTCR[3]对应FSMC_BTR2

BTCR[4]对应FSMC_BCR3

BTCR[5]对应FSMC_BTR3

BTCR[6]对应FSMC_BCR4

BTCR[7]对应FSMC_BTR4

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


BWTR[0]对应FSMC_BWTR1

BWTR[2]对应FSMC_BWTR2

BWTR[4]对应FSMC_BWTR3

BWTR[6]对应FSMC_BWTR4

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

#define FSMC_Bank1          ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE)

 

typedef struct

{

  __IO uint32_t BTCR[8];    /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */   

} FSMC_Bank1_TypeDef; 

 

 

#define FSMC_Bank1E         ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE)

typedef struct

{

  __IO uint32_t BWTR[7];    /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */

} FSMC_Bank1E_TypeDef;


要访问这些寄存器,就要访问这些数组中的元素了,这个还是很好理解


关键字:STM32  FSMC 引用地址:STM32_ FSMC

上一篇:STM32_IIC
下一篇:STM32地址映射、位带操作

推荐阅读最新更新时间:2024-11-10 15:31

USB之STM32基础(6)
本篇笔记主要介绍 STM32 相关的知识点,毕竟之后的 CDC 教程是用 STM32 开发的。 为了写这一篇,鱼鹰把 STM32 中文参考手册 USB 相关的从头到尾看了一遍,虽然以前就已经看过了,但这次看,收获又是不同。 不过限于篇幅,鱼鹰不会面面俱到,只介绍和 CDC 相关的一些东西。 要完成 USB 模拟串口(CDC)的实验,STM32 手册是必须细细阅读的,不然代码里面很多操作你是无法看懂的。 其实理解了前面的一些东西,你会发现 STM32 中的 USB 知识和前面的大同小异,毕竟开发芯片的厂家也是按照 USB 标准来实现的,不会差到哪里去。 硬件基础 首先,STM32F103 使用 PA11(USBDM,D-)和 P
[单片机]
Keil MDK STM32系列(六) 基于抽象外设库HAL的ADC模数转换
配置 ADC 模式: 如果只启用了一个ADC, 这里只能配置为Independent mode 时钟分频: 这个选项是ADC的预分频器, 可设置为2/4/6/8, 决定了一个ADC时钟周期. 加入设置为2, 由于ADC是挂载在APB2总线(84M)上, 所以一个ADC时钟便是84 * M/2=42M 分辨率: 最高为12位分辨率, 分辨率越高转换时间越长 数据对齐方式: 如果选择12位分辨率, 右对齐, 得到的结果最大便是4096. 扫描模式: 转换完一个通道会不会继续转换下一个通道 连续转换模式: 使能的话转换将连续进行 不连续转换模式: 当使能多个转换通道时, 可单独设置不连续转换通道. DMA连续请求: 是否连续请求DMA.
[单片机]
物联网之STM32开发八(I2C总线通信)
STM32-I2C总线通信 内容概要 I2C总线通信原理 三轴加速度传感器mpu6050介绍 I2C通信实例 I2C总线通信原理 内容概要: I2C总线简介 I2C总线协议 I2C总线读写操作 STM32F0-I2C控制器特性 I2C总线简介: I2C总线介绍:I2C(Inter-Integrated Circuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通信速率高等优点。 I2C总线特征: 两条总线线路:一
[单片机]
物联网之<font color='red'>STM32</font>开发八(I2C总线通信)
STM32 USB学习笔记2
主机环境:Windows 7 SP1 开发环境:MDK5.14 目标板:STM32F103C8T6 开发库:STM32F1Cube库和STM32_USB_Device_Library STM32Cube库中提供了一些有关USB的例程,在其工程目录下的Applications目录中,这里打开STM3210E_EVAL目录,可以看到如下例程: 这里选取一个简单的例子CDC_Standalone,为一个USB通信例程,具体实现是一个USB转串口的功能,相当于USB串口线。把示例里面的inc和src目录下的文件拷贝到新建工程中,这里是把跟usb通信相关的文件放到了vcp目录下。文件目录结构如下: 其中BSP目录很简单,由于所购
[单片机]
STM32单片机的酒精浓度探测仪设计
引言 酒后驾车是导致交通事故的一个重要原因,给人们的生活和生命安全带来巨大的危害。为了防止机动车辆驾驶人员酒后驾车,现场实时对人体呼气中酒精含量的检查已日益受到重视。本系统针对现有酒精传感器恢复时间较长的问题,通过计算斜率成功地实现了快速酒精浓度检测,缩短了检测间隔时间,大大提升了酒精检测的效率。 1 酒精浓度探测仪的整体结构 酒精浓度探测仪由单片机、酒精传感器、信号调理电路、语音报警模块、TFTLCD显示模块、通信模块、功放模块等部分组成,结构框图如图1所示。由于语音报警模块和TFTLCD显示模块对于单片机的处理速度和处理数据量要求高,再加上酒精检测反应速度较快,实时性较高,因此采用了ST公司的STM32系列的单片机作
[单片机]
<font color='red'>STM32</font>单片机的酒精浓度探测仪设计
stm32 在线升级 总结
一、前两篇博客实现的功能是在APP和IAP之间进行程序跳转; 二、这里面有以下需要注意的地方; 1、程序跳转函数切记不要在定时器中断里编写,否则程序可以正常跳转但是中断功能却不能执行。原因,可以参考以下链接; http://xzq1019.blog.163.com/blog/static/5996566520100181146689/ 就是,在中断里进行跳转的话,stm32会认为跳转函数只是中断处理函数的一部分,所以会出现挂起,不能再响应中断。一般的做法是在中断里设标志位,在主函数里进行跳转。 2、在IAP程序跳转前关闭总中断,在跳转到APP程序后,打开总中断。 3、中断的打开和关闭可以利用下面的函数 __disable_irq(
[单片机]
STM32学习笔记--GPIO寄存器的定义
1、GPIO的寄存器按照功能可以分为以下几类: A、配置寄存器 B、数据寄存器 C、位寄存器 D、 锁定寄存器 2、对于GPIO端口,每个端口有16个引脚,每个引脚的模式由寄存器的四个位控制,每四位又分为两位控制引脚配置(CNFy ),两位控制引脚的模式及最高速度(MODEy ),其中y表示第y个引脚。配置GPIO引脚模式的一共有两个寄存器,CRH是高寄存器,用来配置高8位引脚,还有CRL配置低八位引脚。 3、端口位设置\清除寄存器(GPIOx_BSRR) 一个引脚 y 的输出数据由 GPIOx_BSRR 寄存器位的2 个位来控制分别为 BRy (Bit Reset y)和BSy (Bit Set y),BRy 位用于写 1清零
[单片机]
ST推出新款超低功耗STM32微控制器
同级最高的闪存容量,最大容量高达512KB。 中国,2014年3月26日 ——意法半导体STM32 L1系列超低功耗ARM® Cortex®-M3 32位微控制器新增一款512KB闪存产品。目前L1系列共有三个产品线合70余款产品,其超低功耗和存储容量的组合在市场上堪称独一无二,闪存和RAM最大容量分别高达512KB和80KB。 新产品采用意法半导体独有的超低泄漏电流的110纳米CMOS制造工艺和优化的系统架构,工作能耗极低,目标应用瞄准高成本效益的嵌入式设计,适用于健身、医疗、穿戴式设备和工业/电表等电池供电的联网产品。 L1系列的主要特性: · 高性能ARM Cortex-M3 32位内核:在32
[单片机]
ST推出新款超低功耗<font color='red'>STM32</font>微控制器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved