STM32与FPGA通信:利用FSMC接口实现
一、简介
这次实验使用到的是STM32的G474E-EVAL板,FPGA使用的是安路科技的EG4系列开发板。原理是用STM32上的FSMC接口与FPGA建立通信线路,FSMC为并行接口,可以大幅度提高通信的速率,对于串行速率达不到要求的可以考虑此种方式。
这里插一句题外话我们场景中经常需要用到STM32和FPGA相连的一个情形不仅是因为这个可以使用STM32强大的控制功能,而是因为STM32的管脚其实非常少,相对地FPGA强大的并行计算的能力加之可以有很多管脚(40-50个轻轻松松),非常适合我们将一部分运算分给FPGA去做。
二、STM32端
2.1 CubeMX配置
- Chip Select 信号为 为片选信号,选择外设的地址,这是因为我们可能会有多个外设挂在STM32的外南,用这个信号来确定当前选定的是哪一个外设。
- Memory Type 选择的是外设的类型,分为如下图2几种,这里我们选用的是 Muxed PSROM,如果及外设是显示屏的话可以选择LCD interface
- Data/Address 这里就是地址和数据的位宽,我们选择16bit已经足够了。
- Clock 这里我们使用异步模式,失能时钟。
- Address Valid 地址有效性同样失能。
- Wait 等待信号,不勾选这里,表示失能。
- Byte enable 字节失能,这个信号主要是用来决定发送数据的时候是否切片,这个自行选择,这里我们不选。
最后的配置结果上图1 所示。管脚配置如下图3所示。
最后就可以生成工程代码了,这需要注意的是最好勾选下图红框所示,使每个外设的层次更加清晰,后续可以更快速的定位代码所在。
2.2 例程
种类我们为了更加便于理解入门,我们使用这个CubeMX中的G4的固件包里面自带的这个例程,常用的路径如下图所示,在你CubeMX的安装路径下面:
使用MDK打开工程以后找到主函数里面的读写操作:
我在这里为了便于调试,修改了发送的内容和地址,但是功能上不变化的。
下面是FMC的时序设置,这里需要注意的是你所写的值有的时候并不就是你填的值,可能加上1才是实际上的值,比如图中圈起来的busturnaround。
这里的时序设置还有很多需要注意的点,比如说根据手册有的值只有两位,所以只能在0-3中取;还有的情况是要满足一些建立保持时间,这些信息需要仔细研读手册,我这里读的是RM0440,当中可以找到标准的时序图。
上图中的额绿色线是NWE信号,下面两根是DATA[0]和DATA[1]信号,经过验证满足手册中的时序图。