STM32接口FSMC/FMC难点的理解

发布者:size0109最新更新时间:2018-04-18 来源: eefocus关键字:STM32  FSMC  FMC 手机看文章 扫描二维码
随时随地手机看文章

一,FSMC简


          FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接,

STM32 的 FSMC 接口支持包括 SRAM、NAND FLASH、NOR FLASH 和 PSRAM 等存储器。



二,FSMC存储块

STM32F767的FMC将外部存储器划分为6个固定大小的256M的存储区域,如下图


如图:
    FSMC分为4块,每块256M字节又被划分为4*64,即四个片选
    NOR / PSRAM使用块1,共256M
    NAND闪存使用块2,3,共512M
    PC卡使用块4,共256M



三,存储块1(Bank1)寄存器

       STM32 的 FSMC 存储块 1(Bank1)被分为 4 个区,每个区管理 64M 字节空间,每个区都
有独立的寄存器对所连接的存储器进行配置。Bank1 的 256M 字节空间由 28 根地址线
(HADDR[27:0])寻址。
      这里 HADDR 是内部 AHB 地址总线,其中 HADDR[25:0]来自外部存储器地址
FSMC_A[25:0],而 HADDR[26:27]对 4 个区进行寻址。




我们要特别注意 HADDR[25:0]的对应关系:
当 Bank1 接的是 16 位宽度存储器的时候:HADDR[25:1]对应 FSMC-A[24:0]。
当 Bank1 接的是 8 位宽度存储器的时候:HADDR[25:0]对应FSMC_A[25:0]。


比如外部存储器接到FMC_NE1上面,那么外部存储器的地址为HADDR[26:27] +FMC_A[25:0]=0x60000000+FMC_A[25:0]。

注:不论外部接 8  位/16  位宽设备,FSMC_A[0] 永远接在外部设备地址 A[0] 。

 HADDR[25:0] 位包含外部存储器地址,由于 HADDR 为字节地址,而存储器按字寻址,所以根据存储器数据宽度不同,

实际向存储器发送的地址也将有所不同,如图:


一个地址对应一个字节的数据,所以64M字节的地址量,就可以表示64x8=512M的数据,也就是说外部储存器的最大容量为512M.


当 Bank1 接的是 16 位宽度存储器的时候:HADDR[25:1]对应 FSMC-A[24:0]。

:一个地址就可以操作一个字(16位)的数据那么就不需要26根地址线了,HADDR[0]就没有用到,所以: HADDR[25:1] = FMC _A[24:0] 。

即:
             0000对应FSMC_A[0]=0   (2字节)
             0010对应FSMC_A[0]=1   (2字节)
             0100对应FSMC_A[1]=1   (2字节)


        所以对应关系需要除以2,内部右移一位对齐
        此时最低位没用,访问最低位需要使用UB/LB


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

:一个地址正好可以操作一个字节(8位)的数据,需要26根地址线:那么 HADDR[25:0] = FMC _A [25:0] 。


关键字:STM32  FSMC  FMC 引用地址:STM32接口FSMC/FMC难点的理解

上一篇:关于STM32的存储器映像
下一篇:STM32的SYSTICK详解

推荐阅读最新更新时间:2024-03-16 16:00

STM32指针的理解
指针的定义 : 自己总结为,指针是用来存放某种类型变量的地址的变量 比如 unit8 * p = 0x5555 5555 指针p 表示用来存放 unit8类型变量的地址的变量 *指针是变量 *指针是存放地址的变量 *指针是存放某种类型变量的地址的变量 百度上定义说: 它的值直接指向(points to)存在电脑存储器中另一个地方的值。 上例子中 *p 就表示0x5555 5555这个地址中存放的数 指针定义的格式:(数据类型+星号)+变量名称 比如下面两个例子 int * xxx YYY * xxx 指针的含义: 此时xxx这个变量就成为一个指针,这个
[单片机]
STM32学习----时钟
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,
[单片机]
基准源的选择
tl431 lm285 385 之类的,1.2V的 stm32的ad参考电压要求 2.4v REF2930-3V要二十多块,价格过高,查力源报价也就几块钱,是不是TI的供货出现了问题。既然3.0V基准少而不好找,我想使用2.5V基准。 3V的电压基准,除了TI还可以考虑其它公司,比如MAXIM的:MAX6003。MAX6003的初始精度 1%,比REF2930来得好。 又找了一下,MAX6010B更好: 超低电源电流:5 A (最大值) 3.2V输入下输出3V 小尺寸、3引脚SOT23封装 初始精度: 0.4% (最大值) 低温漂:50ppm/ C (最大值) 200mV低压差 负载调节(7mA源出电流):200 V/m
[单片机]
Stm32定时器中断使LED灯闪烁
知识点: Stm32共有11个定时器: 1.两个高级定时器:TIM1、TIM8-------------------------APB2 2.四个通用定时器:TIM2~TIM5-------------------------APB1 3.两个基本定时器:TIM6、TIM7-------------------------APB1 4.两个看门狗 5.一个系统嘀嗒定时器(SysTick) 主程序main.c: /* *说明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #inclu
[单片机]
STM32 时钟系统
简介:时钟系统是 CPU 的脉搏,就像人的心跳一样。所以时钟系统的重要性就不言而喻了。STM32 的时钟系统比较复杂,不像简单的 51 单片机一个系统时钟就可以解决一切。于是有人要问,采用一个系统时钟不是很简单吗?为什么 STM32 要有多个时钟源呢? 因为首先STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 k 的时钟即可。 同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU一般都是采取多时钟源的方法来解决这些问题。首先让我们来看看STM32的时钟系统图吧: 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE
[单片机]
<font color='red'>STM32</font> 时钟系统
STM32:DAC配置以及使用
DAC简介 DAC顾名思义即数模转换,DAC模块由三个部分组成,分别为“触发选择”“控制逻辑” ‘数模转换器’。其中“触发选择”和“数模转化器”是DAC转换的必要模块,“控制逻辑”模块中包含有噪声发生器需要的LFSR寄存器,以及三角波发生器需要的计数器。 第一部分:DAC噪声生成 DAC噪声生成器是由两部分组成,一部分是线性反馈移位寄存器LFSR产生伪随机数,另一部分是数模转换器,将数字转换成对应的电压(DAC输出 = Vref x (DOR/4095))。 每次进行LFSR算法的位数由MAMPx 的数值来决定,屏蔽位从高位往低位进行。每触发一次会进行一次LFSR算法,进过LFSR得到的数值与DAC_DH
[单片机]
<font color='red'>STM32</font>:DAC配置以及使用
使用STM32点亮一颗LED实验
本次实验系统环境 Matlab版本: 2021b 系统环境 :Win10专业版 模型与原理图 simulink模型如图5.1所示,实验现象PB8以0.5S周期反转,PB9以1S周期翻转闪烁,本次实验电路原理如图5.2所示,实验所使用的下载器为STLINK 2V1版本,下载器自带一个串口,完整实验电路板如图5.3所示 图5.1 两颗LED闪烁simulink模型 图5.2 LED闪烁电路图 图5.3 实验开发板 基础模型介绍与分析 “Digital Write”模型用于控制I/O口作为普通输出用,双击模型可更改引脚编号,如图5.4所示其引脚对应STM32的PB8端口,例如想使用PA5引脚时,可通过将其改为“PA_
[单片机]
使用<font color='red'>STM32</font>点亮一颗LED实验
基于STM32对DS1302的驱动
// 程序名: STM32驱动DS1302 //头文件 #include “stm32f10x.h” #include “usart.h” #define uchar unsigned char #define uint unsigned int ////DS1302引脚定义,可根据实际情况自行修改端口定义 #define RST PAout(5) #define IO PAout(6) #define SCK PAout(7) //DS1302地址定义 #define ds1302_sec_add 0x80 //秒数据地址 #define ds1302_min_add 0x82 //分数据地址 #define ds1302_
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved