STM32 FSMC 总结

STM32 FSMC 总结_第1张图片

背景

 

做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模式的时序图,如下:

STM32 FSMC 总结_第2张图片

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

 

 

采用的是地址线和数据线交叉复用和异步方式的,所以,相应的查找交叉复用的时序图,如下:STM32 FSMC 总结_第3张图片

STM32 FSMC 总结_第4张图片

 

 

 

 

 

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

 

你可能感兴趣的:(Profibus-DP,嵌入式)