查看: 876|回复: 0
打印 上一主题 下一主题

STM32F407的FSMC实测速度小于理论速度,欢迎大家进来讨论

[复制链接]
跳转到指定楼层
沙发
发表于 2016-5-20 23:08:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做一个项目,需要用到STM32F407的FSMC的功能,看了手册,说读数据最快在一个HCLK搞定,当然读数据时间间隔好像需要2HCLK(网上查阅到的资料,手册上没找到相关说明)
现在我做了个测试,HCLK调整到200M,FSMC的时序配置参数全部设置为0,也就是速度最快的情况,然后用DMA的方式读取数据,在DMA完成中断函数里面翻转一个GPIO,通过测量这个翻转的GPIO频率基本上就能估计到FSMC每读一个数据所消耗的时间。
经过测试(100M的逻辑分析仪抓取翻转引脚时钟信号)发现,每翻转一次的周期时间差不多为1.98us,也就是1980ns,由于是读64字节数据,所以每字节数据消耗的时间平均为1980/64=30.9ns,约5个HCLK的时间,这个和理论上的3个HCLK时间大了2HCLK时间,所以我就纳闷,到底是我配置不对还是说这个芯片本身就是这样的性能?或者说手册上确实只是理论值?
FSMC配置程序如下:
/**
  * @brief  配置FSMC
  * @param  无
  * @retval 无
  */
void FSMC_Config(void)
{
  FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  p;
  FSMC_GPIO_Config();                                                     //FSMC管脚配置
  RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
  //OE时间 = Address setup(0~15)+Data setup(0~255)+Bust turn(0~15)+1,OE总时间必须大于等于3
  p.FSMC_AddressSetupTime = 0;                                           //地址建立时间
  p.FSMC_DataSetupTime = 0;                                              //数据建立时间
  p.FSMC_BusTurnAroundDuration = 0;
  p.FSMC_AddressHoldTime = 0;                                            //地址保持时间
  p.FSMC_CLKDivision = 0;
  p.FSMC_DataLatency = 0;
  p.FSMC_AccessMode = FSMC_AccessMode_A;                                  // 用模式A控制
  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);   
  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表