首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 FSMC 总结

STM32 FSMC 总结

背景
DP开发过程中,需要将DP芯片和ARM芯片进行通信,一般有两种方式:
1)IO端口(总线)方式来进行通信;
2)FSMC-存储器映射方式来进行通信;
之前的开发是采用第一种方式在F103芯片上开发,现在换F4平台,采用第二种方式来进行交互数据。
FSMC的基础
FSMC功能是类似 51 单片机的存储器映射功能,能管理多个外部不同种类的存储设备,具有方便,简单,快捷的优点。
目前支持的类型有:SRAMROMPSRAMNOR FlashNANDFlash
存储器
更多的关于FSMC的资料需要阅读STM32 手册对于FSMC的详细介绍。
VPC3+C   +    ARM     +     FSMC实现细节描述
1)首先了解VPC3+C该芯片的时序图,VPC3的存储器提供两种访问方式:
a) 数据线和地址线不复用模式,手册中叫做C165模式;
b) 数据线和地址线交叉复用,手册中叫做80C32模式;
   为了节约IO的数量,决定采用80C32模式,手册中对此描述为同步模式,个人觉得有歧义。
2)查找80C32模式的时序图,如下:

3)在STM32数据手册中查找与80C32时序图一致的时序图。

采用的是地址线和数据线交叉复用和异步方式的,所以,相应的查找交叉复用的时序图,如下:

4)对比时序图发现,互联的线有
FSMC_NADV
加反向器(VPC3地址锁存控制信号)
ALE
FSMC_AD
数据线(地址线)
AB
FSMC_A
地址线
DB
FSMC_NWE
写信号
XWR
FSMC_NRD
读信号
XRD
由于VPC3内部自带地址锁存器,所以外部可以不加锁存器了,按照VPC3手册推荐,用了8个地址线,寻址2K空间,剩余的用作地址片选信号,这里有个小技巧,片选其中一个引脚,加反相器,同时也将STM32地址唯一映射为VPC3的确定地址。我当时调试代码时未理解透该细节,导致浪费了不少时间。
5)代码的调试
FSMC的代码采用STM32官方库函数来实现,在新平台下面需要注意一些几点:
A)新平台采用的系统时钟是否由于外部晶振变化而变化,需要对系统时钟进行配置,具体的配   置是在STM32F4xx.c 文件中。

系统时钟 = (HSE或者HSI/PLL_M )*PLL_N /PLL_P;
B)新平台时钟加快后对于FSMC的时间的设置的影响,在异步模式下,主要是考虑地址生成时间,地址保持时间,数据生成时间,这几个参数需要参考对应的外部存储器的参数来进行设定。
6)调试中遇到最大的两个问题
a) 外部晶振更改后为重新进行系统时钟的配置,我调用RCC_GetClocksFreq()来获取当前系统的时钟,是168M,这个是根据上面的计算公式计算出来,由于宏定义的数据未更改,所以表面上市正确的,但是和实际的情况却不符合。
b) 对于片选信号的理解,我是在配置FSMC功能后重新对地址线上的片选信号进行IO的操作,经过观看GPIO口的数据后,发现拉高该端口了,其实,FSMC是一个自动的过程,在FSMC操作额过程中,即便我之前拉高该端口,FSMC在地址操作时会将之前的IO口操作的结果给覆盖掉,导致数据写入不成功这个也是我对于片选的理解不彻底而造成的。
结束语
本次FSMC的调试过程中,学到了许多的知识,硬件电路的如何连接,信号线的选择,对FSMC 的理解和操作,时序图的匹配这个一个大体过程,基本掌握了硬件设计人员原理图线路连接过程,以及软件调试。
继承事业,薪火相传
返回列表