這是一段對nor存儲器的時序進行編程的函數,函數形式為void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct),里面只有一個參數,這個參數為指針類型,指向一段數據結構,這個數據結構就保存着對時序進行配置的的各個參數,這個結構的詳細內容為
1 typedef struct 2 { 3 uint32_t FSMC_Bank;//nor被分為四塊,其中這個參數是說明對那個塊編程 4 uint32_t FSMC_DataAddressMux;//地址\數據是否復用 5 uint32_t FSMC_MemoryType;//存儲器類型 6 uint32_t FSMC_MemoryDataWidth;//數據總線寬度 8位/16位 7 uint32_t FSMC_BurstAccessMode;//是否進行成組模式訪問 8 uint32_t FSMC_WaitSignalPolarity;//等待信號有效級性 9 uint32_t FSMC_WrapMode;//該位決定控制器是否支持把非對齊的AHB成組操作分割成2次線性操作;該位僅在存儲器的成組模式下有效。 10 uint32_t FSMC_WaitSignalActive;//當閃存存儲器處於成組傳輸模式時,NWAIT信號指示從閃存存儲器出來的數據是否有效或是否需要插入等待周期。該位決定存儲器是在等待狀態之前的一個時鍾周期產生NWAIT信號,還是在等待狀態期間產生NWAIT信號。 11 uint32_t FSMC_WriteOperation;//該位指示FSMC是否允許/禁止對存儲器的寫操作。 12 uint32_t FSMC_WaitSignal;//當閃存存儲器處於成組傳輸模式時,這一位允許/禁止通過NWAIT信號插入等待狀態。 13 uint32_t FSMC_ExtendedMode;//該位允許FSMC使用FSMC_BWTR寄存器,即允許讀和寫使用不同的時序。 14 uint32_t FSMC_WriteBurst; //對於處於成組傳輸模式的閃存存儲器,這一位允許/禁止通過NWAIT信號插入等待狀態。讀操作的同步成組傳輸協議使能位是FSMC_BCRx寄存器的BURSTEN位。 15 FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct;//讀時序配置指針 16 FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;//寫時序配置指針 17 }FSMC_NORSRAMInitTypeDef;
兩個指針的結構如下
1 typedef struct 2 { 3 uint32_t FSMC_AddressSetupTime;//這些位定義地址的建立時間,適用於SRAM、ROM和異步總線復用模式的 NOR閃存操作。 4 uint32_t FSMC_AddressHoldTime;//這些位定義地址的保持時間,適用於SRAM、ROM和異步總線復用模式的 NOR閃存操作。 5 uint32_t FSMC_DataSetupTime;//這些位定義數據的保持時間,適用於SRAM、ROM和異步總線復用模式的NOR閃存操作。 6 uint32_t FSMC_BusTurnAroundDuration;//這些位用於定義一次讀操作之后在總線上的延遲(僅適用於總線復用模式的NOR閃存操作),一次讀操作之后控制器需要在數據總線上為下次操作送出地址,這個延遲就是為了防止總線沖突。如果擴展的存儲器系統不包含總線復用模式的存儲器,或最慢的存儲器可以在6個HCLK時鍾周期內將數據總線恢復到高阻狀態,可以設置這個參數為其最小值。 7 uint32_t FSMC_CLKDivision;//定義CLK時鍾輸出信號的周期,以HCLK周期數表示: 8 uint32_t FSMC_DataLatency;//處於同步成組模式的NOR閃存,需要定義在讀取第一個數據之前等待的存儲器周期數目。 這個時間參數不是以HCLK表示,而是以閃存時鍾(CLK)表示。在訪問異步NOR閃存、SRAM或ROM時,這個參數不起作用。操作CRAM時,這個參數必須為0。 9 uint32_t FSMC_AccessMode; //訪問模式 10 }FSMC_NORSRAMTimingInitTypeDef;
函數內容如下
1 void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) 2 { 3 /* 驗證參數*/ 4 assert_param(IS_FSMC_NORSRAM_BANK(FSMC_NORSRAMInitStruct->FSMC_Bank)); 5 assert_param(IS_FSMC_MUX(FSMC_NORSRAMInitStruct->FSMC_DataAddressMux)); 6 assert_param(IS_FSMC_MEMORY(FSMC_NORSRAMInitStruct->FSMC_MemoryType)); 7 assert_param(IS_FSMC_MEMORY_WIDTH(FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth)); 8 assert_param(IS_FSMC_BURSTMODE(FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode)); 9 assert_param(IS_FSMC_WAIT_POLARITY(FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity)); 10 assert_param(IS_FSMC_WRAP_MODE(FSMC_NORSRAMInitStruct->FSMC_WrapMode)); 11 assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive)); 12 assert_param(IS_FSMC_WRITE_OPERATION(FSMC_NORSRAMInitStruct->FSMC_WriteOperation)); 13 assert_param(IS_FSMC_WAITE_SIGNAL(FSMC_NORSRAMInitStruct->FSMC_WaitSignal)); 14 assert_param(IS_FSMC_EXTENDED_MODE(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode)); 15 assert_param(IS_FSMC_WRITE_BURST(FSMC_NORSRAMInitStruct->FSMC_WriteBurst)); 16 assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime)); 17 assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime)); 18 assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime)); 19 assert_param(IS_FSMC_TURNAROUND_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration)); 20 assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision)); 21 assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency)); 22 assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode)); 23 /* 將控制參數組合成32位數據送給 FSMC_Bank 寄存器,其中 FSMC_Bank 為偏移地址*/ 24 FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 25 (uint32_t)FSMC_NORSRAMInitStruct->FSMC_DataAddressMux | 26 FSMC_NORSRAMInitStruct->FSMC_MemoryType | 27 FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth | 28 FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode | 29 FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity | 30 FSMC_NORSRAMInitStruct->FSMC_WrapMode | 31 FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive | 32 FSMC_NORSRAMInitStruct->FSMC_WriteOperation | 33 FSMC_NORSRAMInitStruct->FSMC_WaitSignal | 34 FSMC_NORSRAMInitStruct->FSMC_ExtendedMode | 35 FSMC_NORSRAMInitStruct->FSMC_WriteBurst; 36 //如果為NOR內存 37 if(FSMC_NORSRAMInitStruct->FSMC_MemoryType == FSMC_MemoryType_NOR) 38 { 39 //允許對NOR閃存存儲器的訪問操作 40 FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] |= (uint32_t)BCR_FACCEN_Set; 41 } 42 /* 將參數組合,操作時序配置寄存器 FSMC_Bank 為偏移地址 +1(+4)指向時序配置寄存器*/ 43 FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] = 44 (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime | 45 (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) | 46 (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) | 47 (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | 48 (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) | 49 (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) | 50 FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode; 51 /* 是否使用寫時序*/ 52 if(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode == FSMC_ExtendedMode_Enable) 53 { 54 //寫時序配置參數是否正確 55 assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime)); 56 assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime)); 57 assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime)); 58 assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision)); 59 assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency)); 60 assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode)); 61 //正確則組合參數賦給寫時序配置寄存器其中 FSMC_Bank和上面一樣為偏移地址,則基地址為寫時序配置寄存器組的基地址 62 FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 63 (uint32_t)FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime | 64 (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime << 4 )| 65 (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime << 8) | 66 (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision << 20) | 67 (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency << 24) | 68 FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode; 69 } 70 else 71 { 72 //否則寫時序配置寄存器無效 73 FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 0x0FFFFFFF; 74 } 75 }