×
单片机 > 单片机程序设计 > 详情

STM32 FSMC 总结

发布时间:2020-06-16 发布时间:
|

背景


做DP开发过程中,需要将DP芯片和ARM芯片进行通信,一般有两种方式:

1)IO端口(总线)方式来进行通信;

2)FSMC-存储器映射方式来进行通信;


之前的开发是采用第一种方式在F103芯片上开发,现在换F4平台,采用第二种方式来进行交互数据。


FSMC的基础


FSMC功能是类似 51 单片机的存储器映射功能,能管理多个外部不同种类的存储设备,具有方便,简单,快捷的优点。


目前支持的类型有:SRAM、ROM、PSRAM、NOR Flash和NANDFlash 存储器。

更多的关于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 的理解和操作,时序图的匹配这个一个大体过程,基本掌握了硬件设计人员原理图线路连接过程,以及软件调试。


关键字:STM32  FSMC 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址