最近在做一个项目,需要用到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);
}
|