STM32的FSMC總線復(fù)用調(diào)試筆記
調(diào)試FSMC總線復(fù)用模式時(shí)主要遇到以下幾點(diǎn):
1、寄存器的配置,首先注意使能地址數(shù)據(jù)復(fù)用,其次要存儲(chǔ)器類型選擇FSMC_MemoryType_NOR,否則出現(xiàn)不了NADV信號(hào)。
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
2、注意個(gè)GPIO復(fù)用功能的使能,以及時(shí)鐘確定使能。
3、地址總線。在16位模式訪問時(shí),訪問地址的[25..0]位必須先左移一位.。才能正確輸出地址信號(hào),原因是,STM32會(huì)將地址右移一位后在輸出。如果輸出前不左移,會(huì)導(dǎo)致輸出地址錯(cuò)誤,比如當(dāng)我們軟件訪問地址6000 0005H這個(gè)地址時(shí),實(shí)際訪問的地址是6000 0002H。為何右移一位?看中文數(shù)據(jù)手冊(cè)327頁。如下
如表可以知道。當(dāng)16位訪問時(shí),STM32把內(nèi)部地址總線和FSMC地址信號(hào)線正好錯(cuò)移了一位。
這個(gè)主要是在復(fù)用模式下遇到的,至于16位模式下的其他訪問會(huì)不會(huì)遇到這種情況還不知道。待開發(fā)。
附FSMC配置程序和讀函數(shù):
p.FSMC_AddressSetupTime=15;
p.FSMC_AddressHoldTime=15;
p.FSMC_DataSetupTime=15;
p.FSMC_BusTurnAroundDuration=15;
p.FSMC_CLKDivision=0;
p.FSMC_DataLatency=0;
p.FSMC_AccessMode=FSMC_AccessMode_B;
FSMC_NORSRAMInitStructure.FSMC_Bank=FSMC_Bank1_NORSRAM1;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux=FSMC_DataAddressMux_Enable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType=FSMC_MemoryType_NOR;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth=FSMC_MemoryDataWidth_16b;
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); 讀函數(shù)中地址一定要左移 #defineFPGA_ADDRESS0x60000000 #defineFPGA_read(offset)*((volatileunsignedshortint*)(FPGA_ADDRESS+(offset<<1)))