各位大神麻烦进来看一下,不胜感激!小弟最近使用FSMC功能外接FPGA,FPGA内是一个FIFO模块,当做外部SRAM使用。FSMC驱动代码和原子老大的差不多,可是在main函数中,如果加入延时函数的话,FSMC_D2和FSMC_D3引脚会被直接拉到高电平,不论写入的是什么样的数据都是如此,而其他数据位则可以正常响应。当删除延时函数时,则恢复正常,。困扰我很久了啊,完全不知道怎么回事。
FSMC驱动代码:
[mw_shl_code=c,true]#include "fsmc1.h"
#define Bank1_SRAM1_ADDR ((u32)(0x60000000))
void FSMC1_Init(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_14|GPIO_Pin_15; // //PORTD复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
readWriteTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK 1/36M=27ns
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到
readWriteTiming.FSMC_DataSetupTime = 0x01; //数据保持时间(DATAST)为3个HCLK 4/72M=55ns(对EM的SRAM芯片)
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKDivision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.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_MemoryType_SRAM; //SRAM
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;//存储器数据宽度为16bit
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
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 = &readWriteTiming;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming; //读写同样时序
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
void FSMC_FIFO1_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)
{
*(vu8*)(Bank1_SRAM1_ADDR+WriteAddr)=*pBuffer;
WriteAddr+=1;
pBuffer++;
}
}
void FSMC_FIFO1_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)
{
for(;n!=0;n--)
{
*pBuffer++=*(vu8*)(Bank1_SRAM1_ADDR+ReadAddr);
ReadAddr+=1;
}
}
[/mw_shl_code]
未加入延时函数时的main函数代码:
[mw_shl_code=c,true]#include "led.h"
#include "uart.h"
#include "fsmc1.h"
#include "stm32f10x.h"
void Delay (uint32_t nCount)
{
for(; nCount!=0;nCount--);
}
int main()
{
u32 i=0;
u8 temp=0x00;
LED_Init();
UART_Init();
FSMC1_Init();
LED0_On;
while(1)
{
FSMC_FIFO1_WriteBuffer(&temp,i,1);
}
}
[/mw_shl_code]
加入了延时函数的main函数代码(FSMC_D2和FSMC_D3直接被拉高):
[mw_shl_code=c,true]#include "led.h"
#include "uart.h"
#include "fsmc1.h"
#include "stm32f10x.h"
void Delay (uint32_t nCount)
{
for(; nCount!=0;nCount--);
}
int main()
{
u32 i=0;
u8 temp=0x00;
LED_Init();
UART_Init();
FSMC1_Init();
LED0_On;
while(1)
{
FSMC_FIFO1_WriteBuffer(&temp,i,1);
Dealy(0x50000);
}
}[/mw_shl_code]
求大神救命啊!感激不尽!
|