
以前用单片机做的,正常工作很长时间,现在想转到stm32,采用fsmc,外接32K铁电FM28V020,一直不正常,现象是只能读出0x100-0x1FF的内容(正确),0x0-0xff也是0x100-0x1ff的内容,然后所有的地址内容不停循环0x100-0x1ff,NADV已经反向给74HC573,初始化程序在后面, 最后,直接用一个F103VET6实验板,什么都不接,只是下载这个程序,用示波器观察,发现如下问题 ![]() 1. PE11(DA8),信号幅值明显与其他DA0-DA15的幅值低很多 (这个是2V档) ![]() PE13的信号(1V档) ![]() FMSC初始化后,所有DA0-DA15,理论上引脚信号幅值应该是一样的,为什么PF11就不一样?,最后只有在PE11上上拉一个2K电阻,信号幅值就上去了,如果对PE11采用IO模式,Out_PP输出,信号幅值很正常 PCB原理图 ![]() ALE已经反向输出到573的 现在是用的什么都不挂接的实验板,信号还是一样,说明是F103VE自身的问题,这个怎么解释,如果FSMC初始化不正确,为什么0x100-0x1FF的内容写入和读出都是正确的?只是所有地址数据都是在0X100-0X1FF循环 FMSC程序 //初始化外部SRAM void FSMC_SRAM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef p; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE); /* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.07(NE1) PD.08(D13), PD.09(D14), PD.10(D15), PD.14(D0), PD.15(D1) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOD, &GPIO_InitStructure); /* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10), PE.14(D11), PE.15(D12) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOE, &GPIO_InitStructure); p.FSMC_AddressSetupTime = 5; p.FSMC_AddressHoldTime = 5; p.FSMC_DataSetupTime = 15; p.FSMC_BusTurnAroundDuration = 5; p.FSMC_CLKDivision = 0; p.FSMC_DataLatency = 0; p.FSMC_AccessMode = FSMC_AccessMode_B;(改过D,一样现象) FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR; (改过PSRAM,一样现象) 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); /* Enable FSMC Bank4_SRAM Bank */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); } |
还有没有别的板子了,换一块试试
还是建议你先检查下硬件连接以及电源供应情况。
可以先不管这个功能,试试别的外设工作是否正常。
另外, 基于你上面配置代码尝试调整后验证下:
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
还有,注意NE1片选对应的起始地址别弄错了,
评分
查看全部评分
评分
查看全部评分
建议在调试界面检查MUXEN是否设置。
断开连接 看看是否能输出高。
评分
查看全部评分
难怪!说怎么你那原理图的管脚标注不像STM32的。
其实用STM32的FSCM访问外部存储器不难的,线连对、地址给对都没太大问题。
至于FSMC的配置参考例程,ST官方参考代码里都有。
还是建议你重点检查下的硬件连接和相关配置。
我直接用开发板(见前面的图),什么都不接,示波器测量PE11,电压幅值就很低,程序应该没问题的