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