STM32 FSMC 通信时序验证记录

一、FSMC外设及其配置
FSMC全称是Flexible static memory controller,我在这里暂且翻译为可配置静态储存控制器。STM32 官方参考手册给出的说明是,FSMC接口能够用来连接同步或异步储存。主要用来在AHB总线和外部设备之间传输数据,该模块可以通过配置满足外部设备的时序要求。
除此之外FSMC还可以用作其他用途,本文中FSMC模块用来和FPGA并行通信,撰写此文,旨在记录STM32 FSMC模块时序。
注:以下记录基于STM32F1 100引脚芯片,更高密度芯片兼容更多类型的储存,并将允许地址总线和数据总线分开。其他高端系列STM32支持wait信号,以及其他更灵活的配置。
时序验证时采取如下配置。使用CUBE配置STM32 FSMC为PSRAM异步通信模式,数据地址复用。时序配置中已经在CUBE允许的情况下调的尽可能的快,地址建立时间,地址保持时间,数据建立时间全设为1.
在这里插入图片描述
在CUBE中配置完成后生成代码,无需再进行其他初始化,即可开始通信。
二、STM32 FSMC地址空间
查阅官方参考手册,FSMC的PSRAM模式地址空间为60000000h到6FFFFFFFh。共计64Mbyte的空间。
在这里插入图片描述
实际通信中已经配置数据总线为16位,每次通信传输2byte数据,故STM32内部地址和外部FPGA 16位寄存器对应关系为,STM32地址加2对应FPGA寄存器地址加1,和储存器通信同理,官方参考手册说明如下。
在这里插入图片描述
实际通信时,代码非常简单,直接对地址读写即可。
向FPGA写代码如下:
*(__IO uint16_t *)(ADDR_BASE + (FPGA_ADDR << 1)) = data;
读FPGA代码如下:
data = *(__IO uint16_t *)(ADDR_BASE + (FPGA_ADDR << 1));
其中ADDR_BASE 为 60000000h。
三、FPGA侧分析时序
通信波形记录如下。
在这里插入图片描述
该波形为STM32向FPGA先连续写两次,再连续读两次波形。其中cs0对应FSMC NEx,wr为FSMC写信号NEW,rd为FSMC读信号NOE。波形抓取采样时钟为100MHz,STM32时钟为72MHz。
可以算出从第一次写开始到第二次写开始时间为0.16us,从第一读开始到第二个读开始时间为0.22us。
四、STM32侧分析时序
对比STM32指令运行时间。STM32读写测试代码如下:
在这里插入图片描述
使用STM32 定时器5计时,该定时器配置为已72MHz的频率计数,先记录向FPGA写一次的时间16和读一次的时间24,再记录向FPGA写两次的时间28和读两次的时间40。可以算出写一次需要12个时钟周期,读一次需要16个时钟周期,换算成时间,分别为0.166667us和0.2222222us,与FPGA测得的时间基本一致。

发布了2 篇原创文章 · 获赞 8 · 访问量 59

猜你喜欢

转载自blog.csdn.net/linzhe_deep/article/details/104915900