STM32接口FSMC与FMC控制 XXROM

FMC是STM32F429/439专有的,因为驱动SDRAM时需要定时刷新,而FSMC存在于F1和F4中我们常用的芯片中。
他们的全称为:
Flexible static memory controller (FSMC)柔性静态存储器控制器
Flexible memory controller (FMC)灵活的存储控制器

先以FMC具体介绍:
STM32的FMC电路简图主体框架
在这里插入图片描述
1.地址信号线以及地址信号线的A10有特殊用途(补充)、控制控制信号线 、DQM的输入输出数据信
2.命令解码器:将相应的控制线上的时序进行解析获得以下控制:
(1)空操作
(2)行有效
(3)读操作
(4)写操作
(5)预充电
(6)自动刷新或自我刷新
(7)加载模式
(8)突发终止
命令经过“命令器译码器”译码,并将控制参数保存到“模式寄存器中”,控制逻辑依此运行。SDRAM中含有“A”以及“BA”两类地址,“BA”类确定SDRAM中的内部储存阵列号(Bank),而“A”类地址可以为行(Row)与列(Column)共用的地址总线

4.SDRAM的存储阵列:类似于我们的表格上的序列号,有纵轴和横轴当然还有Sheet表,发送纵轴横轴坐标就能找到确定位置的数据了,其中的表则被称为存储阵列(Bank)

地址是如何录入寻址的:通行时 当“RAS”线为低电平时,则“行地址选通器”被选中 ,表示行地址A【0:11】地址会被输入到“行地址译码器和锁存器”,同时地址线BA【0:1】地址Back也会被锁存,选中要操作的Back号;接着“CAS”线为低电平时,则“列地址选通器”被选中,表示列地址A【0:11】地址会被输入到“列地址译码器和锁存器”。

在这里插入图片描述

5.数据的输入输出缓存器

二、SDRAM的命令
控制SDRAM需要用到一系列的命令,各种信号线状态组合产生不同的控制命令
SDRAM的数据通过DQ信号线输出,在与SDRAM进行数据通讯时,16位的数据是同步传输的,但实际应用中我们可能会以8位、16位的宽度存取数据,也就是说16位的数据线并不是所有时候都同时使用的,而且在传输低宽度数据的时候,我们不希望其它数据线表示的数据被录入,这时使用DQM信号线作为掩码信号,控制要读取哪个字节

在这里插入图片描述
1、命令禁止
只要CS引脚为高电平,即表示“命令禁止”(COMMAND INHBIT),它用于禁止SDRAM执行新的命令,但它不能停止当前正在执行的命令。
2、空操作
“空操作”(NO OPERATION),“命令禁止”的反操作,用于选中SDRAM,以便接下来发送命令。
3、行有效
在储存器寻址的时候,需要先访问阵列号(Bank)和行地址,使它处于激活状态。该操作通过"行有效",发送行有效命令时,RAS线为低电平,同时通过BA线以及A线发送Bank地址和行地址。
4、列读写
“读命令”和“写命令”的时序很相似,通过共用的地址线A发送列地址,同时使用WE引脚表示读/写方向,WE为低电平时表示写,高电平时表示读。数据读写时,使用DQM线表示有效的DQ数据线
在这里插入图片描述
5、预充电
SDRAM的寻址具有独占性,所以在进行完读写操作后,如果要对同一个Bank的另一行进行寻址就要将原来有效的行关闭重新发送行/列地址Bank 关闭当前工作行,准备打开新行的操作就是预充电。 (重新打开一个Bank时要进行全局的预充电)

配合使用A10线控制,若A10为高电平时,所有Bank都预充电;A10为低电平时,使用BA线选择要预充电的Bank。

6、刷新
SDRAM要不断进行刷新,才能保证那些久久没被访问的存储单元数据正确

7、加载模式寄存器
有12位对应地址A0~A12 6组寄存器分别为突发长度、突发模式、列地址选通延迟、SDRAM的工作模式、突发特性
在这里插入图片描述
1、Burst Length:突发长度,突发是指在同一行中相邻的存储单元连续进行数据传输的方式
2、BT:设置突发模式,突发模式分为顺序与间隔两种。顺序操作按地址的顺序连续执行,间隔为操作地址是跳跃性
3、CASLatency:列地址选通延迟,在发出读命令(命令同时包含列地址)后,需要等待几个时钟周期数据线DQ才会输出有效数据,这之间的时钟周期就是指CL,CL一般可以设置为2或3个时钟周期
4、OP Mode :SDRAM工作模式:正常模式、测试模式
5、WB :用于配置写操作的突发特性可选择使用BL设置的突发长度或非突发模式

引脚说明(连接到SDRAM):
在这里插入图片描述
FMC_SDCKE线和FMC_SDNE都各有2条,FMC_SDCKE用于控制SDRAM的时钟使能,FMC_SDNE用于控制SDRAM芯片的片选使能。它们用于控制STM32使用不同的存储区域驱动SDRAM,使用编号为0的信号线组会使用STM32的存储器区域1,使用编号为1的信号线组会使用存储器区域2。使用不同存储区域时,STM32访问SDRAM的地址不一样。
在这里插入图片描述
图上有两处 SDRAM Bank 对应有两组数据引脚,其地址对应也不一样
Bank1地址:0x6000 0000 ~ 0x6FFF FFFF 其中有4x64MB的数据里面 ,那么是怎样划分地址的呢?
答:单个64MB的地址计算为:将64化成Bit单位就行了 64x1024x1024 = 67108864 再转化成十六进制为 0x4000000。可知0x6400 0000为一个节点。

寄存器:
1、FMC_SDCR控制寄存器可配置SDCLK的同步时钟频率、突发读使能、写保护、CAS延迟、行列地址位数以及数据总线宽度等。
2、FMC_SDTR时序寄存器用于配置SDRAM访问时的各种时间延迟,如TRP行预充电延迟、TMRD加载模式寄存器激活延迟等。
3、FMC_SDCMR命令模式寄存器用于存储要发送到SDRAM模式寄存器的配置,以及要向SDRAM芯片发送的命令。
4、FMC_SDRTR用于配置SDRAM的自动刷新周期。
控制SDRAM的FMC_SDCR1/FMC_SDCR2控制寄存器、FMC_SDTR1/FMC_SDTR2时序寄存器各有2个,分别对应于SDRAM存储区域1和存储区域2的配置。

FMC的地址映射:
在程序中如何访问SDRAM储存器中的数据呢? 答:当启用FMC初始化完成,其存储单元地址会映射到STM32内部寻址空间;在程序中,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容。

SDRAM的初始化流程
存储矩阵进行预充电—>刷新—>设置模式寄存器
详细操作:
1.给SDRAM上电,并提供稳定的时钟,至少100us;
2.发送“空操作”(NOP)命令;
3.发送“预充电”(PRECHARGE)命令,控制所有Bank进行预充电;
4.发送至少2个“自动刷新”(AUTO REFRESH)命令;
5.发送“加载模式寄存器”(LOAD MODE REGISTER)命令,配置SDRAM的工作参数;
6.初始化流程完毕,可以开始读写数据;
在这里插入图片描述
SDRAM的读写流程
1.发送“行有效”(ACTIVE)命令,发送命令的同时包含行地址和Bank地址,然后等待tRCD时间,tRCD表示行有效命令与读/写命令之间的延迟;
2.发送“读/写”(READ/WRITE)命令,在发送命令的同时发送列地址,完成寻址的地址输入。对于读命令,根据模式寄存器的CL定义,延迟CL个时钟周期后,SDRAM的数据线DQ才输出有效数据,而写命令是没有CL延迟的,主机在发送写命令的同时就可以把要写入的数据用DQ输入到SDRAM中,这是读命令与写命令的时序最主要的区别。图中的读/写命令都通过地址线A10控制自动预充电,而SDRAM接收到带预充电要求的读/写命令后,并不会立即预充电,而是等待tWR时间才开始,tWR表示写命令与预充电之间的延迟;
3.执行“预充电”(auto precharge)命令后,需要等待tRP时间,tRP表示预充电与其它命令之间的延迟;
4.图中的标号处的tRAS,表示自刷新周期,即在前一个“行有效”与 “预充电”命令之间的时间;
5.发送第二次“行有效”(ACTIVE)命令准备读写下一个数据,在图中的标号处的tRC,表示两个行有效命令或两个刷新命令之间的延迟。
在这里插入图片描述

FMC结构体
• 时序结构体:FMC_SDRAMTimingInitTypeDef
• 初始化结构体:FMC_SDRAMInitTypeDef
• 命令结构体:FMC_SDRAMCommandTypeDef
在这里插入图片描述
• FMC_LoadToActiveDelay
本成员设置TMRD延迟(Load Mode Register to Active),即发送加载模式寄存器命令后要等待的时间,过了这段时间才可以发送行有效或刷新命令。

• FMC_ExitSelfRefreshDelay
本成员设置退出TXSR延迟(Exit Self-refresh delay),即退出自我刷新命令后要等待的时间,过了这段时间才可以发送行有效命令。

• FMC_SelfRefreshTime
本成员设置自我刷新时间TRAS,即发送行有效命令后要等待的时间,过了这段时间才执行预充电命令。

• FMC_RowCycleDelay
本成员设置TRC延迟(Row cycle delay),即两个行有效命令之间的延迟,以及两个相邻刷新命令之间的延迟。

• FMC_WriteRecoveryTime
本成员设置TWR延迟(Recovery delay),即写命令和预充电命令之间的延迟,等待这段时间后才开始执行预充电命令。

• FMC_RCDDelay
本成员设置TRCD延迟(Row to column delay),即行有效命令到列读写命令之间的延迟。

在这里插入图片描述
• FMC_Bank
本成员用于选择FMC映射的SDRAM存储区域,可选择存储区域1或2 (FMC_Bank1/2_SDRAM)。

• FMC_ColumnBitsNumber
本成员用于设置要控制的SDRAM的列地址宽度,可选择8-11位(FMC_ColumnBits_Number_8/9/10/11b)。

• FMC_RowBitsNumber
本成员用于设置要控制的SDRAM的行地址宽度,可选择设置成11-13位(FMC_RowBits_Number_11/12/13b)。

• FMC_SDMemoryDataWidth
本成员用于设置要控制的SDRAM的数据宽度,可选择设置成8、16或32位(FMC_SDMemory_Width_8/16/32b)。

• FMC_InternalBankNumber
本成员用于设置要控制的SDRAM的内部Bank数目,可选择设置成2或4个Bank数目(FMC_InternalBank_Number_2/4),请注意区分这个结构体成员与FMC_Bank的区别。

• FMC_CASLatency
本成员用于设置CASLatency即CL的时钟数目,可选择设置为1、2或3个时钟周期(FMC_CAS_Latency_1/2/3)。

• FMC_WriteProtection
本成员用于设置是否使能写保护模式,如果使能了写保护则不能向SDRAM写入数据,正常使用都是禁止写保护的。

• FMC_SDClockPeriod
本成员用于设置FMC与外部SDRAM通讯时的同步时钟参数,可以设置成STM32的HCLK时钟频率的1/2、1/3或禁止输出时钟(FMC_SDClock_Period_2/3或FMC_SDClock_Disable)。

• FMC_ReadBurst
本成员用于设置是否使能突发读取模式,禁止时等效于BL=1,使能时BL的值等于模式寄存器中的配置。

• FMC_ReadPipeDelay
本成员用于配置在CASLatency个时钟周期后,再等待多少个HCLK时钟周期才进行数据采样,在确保正确的前提下,这个值设置为越短越好,可选择设置的参数值为0、 1或2个HCLK时钟周期(FMC_ReadPipe_Delay_0/1/2)。

FMC初始化结构体,除最后一个成员是前面的时序结构体配置外,其它结构体成员的配置都对应到FMC_SDCR中的寄存器位。

配置完SDRAM初始化结构体后,调用FMC_SDRAMInit函数把这些配置写入到FMC的SDRAM控制寄存器及时序寄存器,实现FMC的初始化。

在这里插入图片描述
• FMC_AutoRefreshNumber
在这里插入图片描述
• FMC_CommandTarget
本成员用于选择要控制的FMC存储区域,可选择存储区域1或2(FMC_Command_Target_bank1/2)。

FMC_AutoRefreshNumber
有时需要连续发送多个 “自动刷新”(Auto Refresh)命令时,配置本成员即可控制它发送多少次,可输入参数值为1-16,若发送的是其它命令,本参数值无效。如FMC_CommandMode成员被配置为宏FMC_Command_Mode_AutoRefresh,而FMC_AutoRefreshNumber被设置为
2时,FMC就会控制发送2次自动刷新命令。

• FMC_ModeRegisterDefinition
当向SDRAM发送加载模式寄存器命令时,这个结构体成员的值将通过地址线发送到SDRAM的模式寄存器中,这个成员值长度为13位,各个位一一对应SDRAM的模式寄存器。

时钟配置FMC时钟配置成了90Mhz,相应的计算出:
SDCLK时钟频率为 F= 90MHz,一个时钟周期 T =1/F =1/90M = 1.111×10^8 s = 11 ns
在这里插入图片描述
M后面是6个0
1秒=1000000000 纳秒(ns)
在手册中找到对应的数据信息进而填补上

  FMC_SDRAMTimingInitStruct.FMC_ExitSelfRefreshDelay = 7; //txsr
  FMC_SDRAMTimingInitStruct.FMC_LoadToActiveDelay = 2;  //tmrd
  FMC_SDRAMTimingInitStruct.FMC_RCDDelay = 2;//trcd
  FMC_SDRAMTimingInitStruct.FMC_RowCycleDelay = 6; //trc
  FMC_SDRAMTimingInitStruct.FMC_RPDelay = 2; //trpd
  FMC_SDRAMTimingInitStruct.FMC_SelfRefreshTime = 4; //tras
  FMC_SDRAMTimingInitStruct.FMC_WriteRecoveryTime = 2 ;//twr

在这里插入图片描述
在这里插入图片描述

PLC6045BL研发过程中所遇到的问题:

1.对于FSMC扩展外部存储器件时,在所有引脚包括FSMC的内部配置初始化成功,按复位键时,FSMC相关引脚在示波器会有一串的抖动数据出现 。为在写入其地址时不会产生让其卡死在其阶段中。

以标准库的说明进行初始化:
(1)使用以下函数启用FSMC和相关GPIO的时钟:
(++) RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
(++) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
(2) FSMC 引脚配置
使用以下函数将所涉及的fsmc引脚连接到GPIO_AF_FSMC
GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_FSMC);
通过调用函数,在交替功能模式下配置这些fsmc引脚
GPIO_Init();
(3) 声明FSMC_PCCARD结构体
FSMC_PCCARDInitTypeDef FSMC_PCCARDInitStructure;
并用结构构件的允许值填充FSMC_PCCARDInitStructure变量
(4)通过调用函数初始化PCCARD控制器
FSMC_PCCARDInit(&FSMC_PCCARDInitStructure);
(5)然后启用PCCARD Bank
FSMC_PCCARDCmd(ENABLE);
(6)在这个阶段,您可以从 写 /入 连接到PCCARD Bank的存储器。

如果但是目是进行取地址往里面写入数据会死机。这样也是FSMC初始化不成功的特性。

FSMC初始化成功的话,不会让其卡死在其阶段中。但是目是进行取地址往里面写入数据会死机。这样也是FSMC初始化不成功的特性。
当FSMC配置成功的话,按复位键时会有一串的抖动数据出现
发现一个新问题:开启PC卡模式地址为0x90000000时会死机,而0x60000000数据引脚能正常发送而且运行正常,在H库中,其定义是在0x9000000中能正常使用的。

发现一个新问题:开启PC卡模式地址为0x90000000时会死机,而0x60000000数据引脚能正常发送而且运行正常,在H库中,其定义是在0x9000000中能正常使用的???

重新试用PCCard模式的原装程序启用还是处于死机状态无法正常使用,难道正的使用STM32F429作为代替品吗? 可以考虑替换的问题,还是简单点吧 用标准库来进行其操作,简单点先,预留测试点。

通过购买PLC6045的程序,本套使用另开一个专题讲解使用时注意到的问题进行解决

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢谢~谢先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值