原理:STM32F407与FPGA之间的通讯可以总结成STM32将FPGA当作一个片外的SRAM,读写FPGA后,FPGA内部的门电路发生变化,将这些变化变为0或1做输入给FPGA。
1、硬件连接
stm32连接SRAM的引脚固定为那几个,所以选择不多,确认好引脚即可。
2、cubemx设置SRAM。
FSMC配置生成的代码:
添加的FSMC读写代码:stm32获取fpga的数据,直接通过地址映射,读取地址即可得到数据。
main函数中初始化FSMC及中断中调用读,只有读没有写入。
FPGA代码:
遇到的问题:
1、实际使用的FPGA是国产AGM的要用一个软件转换原来的Quartus工程才能下载。要学习软件使用。
2、读出的结果不正确要改代码。
读取的结果是:
实际应该是 170 、1、2、3、4、5、6、7、8所以要将偏移地址x2,就是WriteAddr和ReadAddr都x2这样输出的结果正确,如下图:
通讯成功,在STM32的手册中有说明当数据位为16时,地址除以2作为实际寻址地址。注意采用的FSMC的模式是模式A,它的时序如下:也就是要写入和发送时才将写入引脚和读取引脚拉低,不用提前拉低数据。FSCM直接挂在最高的时钟总线AHB3下,因为FSCM对速度要求很高。时钟信号来自于 HCLK(默认 168MHz),控制器的同
步时钟输出就是由它分频得到。
在FSMC初始化中有相关设定:FSMC_ACCESS_MODEA.
3、读取的数据是固定的几个值 256、32512。
256/32768 = 1/128 32512/32768 = 127/128 根据AD说明手册这是输入量程超了的结果。经测试AD测量不准是因为AINP和AINN引脚的输入超过+312.5mv,正常250mv使得AD的输出异常。短接AINP和AINN,AD输出50%占空比的方波符合预期,读取的数据也刚好是满量程32767的一半16383.
问题解决:硬件组修改了板子的配置,AD读取数据正常。