/** ****************************************************************************** * @brief EXMC functions of the firmware library. ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "gd32f10x_exmc.h" #include "gd32f10x_rcc.h" /** @addtogroup GD32F10x_Firmware * @{ */ /** @defgroup EXMC * @brief EXMC driver modules * @{ */ /** @defgroup EXMC_Private_Defines * @{ */ /* EXMC Bank1 SCTLRx_BAKEN and SCTLRx_NORAEN Mask */ #define SCTLR_BAKEN_SET ((uint32_t)0x00000001) #define SCTLR_BAKEN_RESET ((uint32_t)0x000FFFFE) /* EXMC Bank1 SCTLRx_NOREN Mask */ #define SCTLR_NOREN_SET ((uint32_t)0x00000040) /* EXMC Bank2/3/4 CTLRx_BAKEN Mask */ #define CTLR_BAKEN_SET ((uint32_t)0x00000004) #define CTLR_BAKEN_RESET ((uint32_t)0x000FFFFB) /* EXMC Bank2/3/4 CTLRx_ECCEN Mask */ #define CTLR_ECCEN_SET ((uint32_t)0x00000040) #define CTLR_ECCEN_RESET ((uint32_t)0x000FFFBF) /* EXMC Bank2/3/4 CTLRx_MTYPE Mask */ #define CTLR_EMTYP_NAND ((uint32_t)0x00000008) /* EXMC Bank1 Register Reset mask*/ #define BANK1_SCTLR1_RESET ((uint32_t)0x000030DB) #define BANK1_SCTLR_RESET ((uint32_t)0x000030D2) #define BANK1_STR_RESET ((uint32_t)0x0FFFFFFF) #define BANK1_SWTR_RESET ((uint32_t)0x0FFFFFFF) /* EXMC Bank2/3 Register Reset mask*/ #define BANK2_3_CTLR_RESET ((uint32_t)0x00000018) #define BANK2_3_SIR_RESET ((uint32_t)0x00000040) #define BANK2_3_COMTR_RESET ((uint32_t)0xFCFCFCFC) #define BANK2_3_ATTR_RESET ((uint32_t)0xFCFCFCFC) /* EXMC Bank4 Register Reset mask*/ #define BANK4_CTLR_RESET ((uint32_t)0x00000018) #define BANK4_SIR_RESET ((uint32_t)0x00000000) #define BANK4_COMTR_RESET ((uint32_t)0xFCFCFCFC) #define BANK4_ATTR_RESET ((uint32_t)0xFCFCFCFC) #define BANK4_IOTR_RESET ((uint32_t)0xFCFCFCFC) /* EXMC register bit offset */ #define STR_AHT_OFFSET ((uint32_t)0x00000004) #define STR_DST_OFFSET ((uint32_t)0x00000008) #define STR_BUSLAT_OFFSET ((uint32_t)0x00000010) #define STR_CDIV_OFFSET ((uint32_t)0x00000014) #define STR_DLAT_OFFSET ((uint32_t)0x00000018) #define SWTR_AHT_OFFSET ((uint32_t)0x00000004) #define SWTR_DST_OFFSET ((uint32_t)0x00000008) #define SWTR_CDIV_OFFSET ((uint32_t)0x00000014) #define SWTR_DLAT_OFFSET ((uint32_t)0x00000018) #define CTLR_CTR_OFFSET ((uint32_t)0x00000009) #define CTLR_ATR_OFFSET ((uint32_t)0x0000000D) #define COMTR_COMWT_OFFSET ((uint32_t)0x00000008) #define COMTR_COMHT_OFFSET ((uint32_t)0x00000010) #define COMTR_COMHIZT_OFFSET ((uint32_t)0x00000018) #define ATTR_ATTWT_OFFSET ((uint32_t)0x00000008) #define ATTR_ATTHT_OFFSET ((uint32_t)0x00000010) #define ATTR_ATTHIZT_OFFSET ((uint32_t)0x00000018) #define IOTR_IOTWT_OFFSET ((uint32_t)0x00000008) #define IOTR_IOHT_OFFSET ((uint32_t)0x00000010) #define IOTR_IOHIZT_OFFSET ((uint32_t)0x00000018) #define SIR_INTEN_OFFSET ((uint32_t)0x00000003) /** * @} */ /** @defgroup EXMC_Private_Functions * @{ */ /** * @brief Reset the Bank1 NOR/SRAM registers. * @param EXMC_NORSRAMBank: specifies the Region of Bank1. * This parameter can be one of the following values: * @arg EXMC_BANK1_NORSRAM1: the Region1 of Bank1 * @arg EXMC_BANK1_NORSRAM2: the Region2 of Bank1 * @arg EXMC_BANK1_NORSRAM3: the Region3 of Bank1 * @arg EXMC_BANK1_NORSRAM4: the Region4 of Bank1 * @retval None */ void EXMC_NORSRAM_DeInit(uint32_t EXMC_NORSRAMBank) { switch (EXMC_NORSRAMBank) { case EXMC_BANK1_NORSRAM1: { /* the Region1 of Bank1 */ EXMC_BANK1->SCTLR1 = BANK1_SCTLR1_RESET; EXMC_BANK1->STR1 = BANK1_STR_RESET; EXMC_BANK1_WT->SWTR1 = BANK1_SWTR_RESET; break; } case EXMC_BANK1_NORSRAM2: { /* the Region2 of Bank1 */ EXMC_BANK1->SCTLR2 = BANK1_SCTLR_RESET; EXMC_BANK1->STR2 = BANK1_STR_RESET; EXMC_BANK1_WT->SWTR2 = BANK1_SWTR_RESET; break; } case EXMC_BANK1_NORSRAM3: { /* the Region3 of Bank1 */ EXMC_BANK1->SCTLR3 = BANK1_SCTLR_RESET; EXMC_BANK1->STR3 = BANK1_STR_RESET; EXMC_BANK1_WT->SWTR3 = BANK1_SWTR_RESET; break; } case EXMC_BANK1_NORSRAM4: { /* the Region4 of Bank1 */ EXMC_BANK1->SCTLR4 = BANK1_SCTLR_RESET; EXMC_BANK1->STR4 = BANK1_STR_RESET; EXMC_BANK1_WT->SWTR4 = BANK1_SWTR_RESET; break; } default: break; } } /** * @brief Reset the Bank2 or Bank3 NAND registers. * @param EXMC_NANDBank: specifies the Bank2 or Bank3 to be used. * This parameter can be one of the following values: * @arg EXMC_BANK2_NAND: Bank2 * @arg EXMC_BANK3_NAND: Bank3 * @retval None */ void EXMC_NAND_DeInit(uint32_t EXMC_NANDBank) { if (EXMC_NANDBank == EXMC_BANK2_NAND) { /* Reset the Bank2 NAND registers */ EXMC_BANK2->CTLR2 = BANK2_3_CTLR_RESET; EXMC_BANK2->SIR2 = BANK2_3_SIR_RESET; EXMC_BANK2->COMTR2 = BANK2_3_COMTR_RESET; EXMC_BANK2->ATTR2 = BANK2_3_ATTR_RESET; } /* EXMC_Bank3_NAND */ else { /* Reset the Bank3 NAND registers */ EXMC_BANK3->CTLR3 = BANK2_3_CTLR_RESET; EXMC_BANK3->SIR3 = BANK2_3_SIR_RESET; EXMC_BANK3->COMTR3 = BANK2_3_COMTR_RESET; EXMC_BANK3->ATTR3 = BANK2_3_ATTR_RESET; } } /** * @brief Reset the Bank4 PCCARD registers. * @param None * @retval None */ void EXMC_PCCARD_DeInit(void) { /* Reset EXMC Bank4 PCCARD registers */ EXMC_BANK4->CTLR4 = BANK4_CTLR_RESET; EXMC_BANK4->SIR4 = BANK4_SIR_RESET; EXMC_BANK4->COMTR4 = BANK4_COMTR_RESET; EXMC_BANK4->ATTR4 = BANK4_ATTR_RESET; EXMC_BANK4->IOTR4 = BANK4_IOTR_RESET; } /** * @brief Initializes the EXMC Bank1 NOR/SRAM parameters. * @param EXMC_NORSRAMInitParaStruct : the struct EXMC_NORSRAMInitPara pointer * @retval None */ void EXMC_NORSRAM_Init(EXMC_NORSRAMInitPara *EXMC_NORSRAMInitParaStruct) { uint32_t temp_SCTLR = 0x00000000, temp_STR = 0x00000000, temp_SWTR = 0x00000000; temp_SCTLR = (uint32_t)EXMC_NORSRAMInitParaStruct->EXMC_AddressDataMux | EXMC_NORSRAMInitParaStruct->EXMC_MemoryType | EXMC_NORSRAMInitParaStruct->EXMC_DatabusWidth | EXMC_NORSRAMInitParaStruct->EXMC_BurstMode | EXMC_NORSRAMInitParaStruct->EXMC_NWAITPolarity | EXMC_NORSRAMInitParaStruct->EXMC_WrapBurstMode | EXMC_NORSRAMInitParaStruct->EXMC_NWAITConfig | EXMC_NORSRAMInitParaStruct->EXMC_MemoryWrite | EXMC_NORSRAMInitParaStruct->EXMC_NWAITSignal | EXMC_NORSRAMInitParaStruct->EXMC_ExtendedMode | EXMC_NORSRAMInitParaStruct->EXMC_AsynWait | EXMC_NORSRAMInitParaStruct->EXMC_WriteMode; temp_STR = (uint32_t)EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_AsynAddressSetupTime | (EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_AsynAddressHoldTime << STR_AHT_OFFSET) | (EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_AsynDataSetupTime << STR_DST_OFFSET) | (EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_BusLatency << STR_BUSLAT_OFFSET) | (EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_SynCLKDivision << STR_CDIV_OFFSET) | (EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_SynDataLatency << STR_DLAT_OFFSET) | EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_AsynAccessMode; if (EXMC_NORSRAMInitParaStruct->EXMC_MemoryType == EXMC_MEMORY_TYPE_NOR) { temp_SCTLR |= (uint32_t)SCTLR_NOREN_SET; } if (EXMC_NORSRAMInitParaStruct->EXMC_ExtendedMode == EXMC_EXTENDED_MODE_ENABLE) { temp_SWTR = (uint32_t)EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_AsynAddressSetupTime | (EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_AsynAddressHoldTime << SWTR_AHT_OFFSET) | (EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_AsynDataSetupTime << SWTR_DST_OFFSET) | (EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_SynCLKDivision << SWTR_CDIV_OFFSET) | (EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_SynDataLatency << SWTR_DLAT_OFFSET) | EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_AsynAccessMode; } else { temp_SWTR = BANK1_SWTR_RESET; } switch (EXMC_NORSRAMInitParaStruct->EXMC_NORSRAMBank) { case EXMC_BANK1_NORSRAM1: { /* Bank1 NOR/SRAM Region1 registers configuration */ EXMC_BANK1->SCTLR1 = temp_SCTLR; EXMC_BANK1->STR1 = temp_STR; EXMC_BANK1_WT->SWTR1 = temp_SWTR; break; } case EXMC_BANK1_NORSRAM2: { /* Bank1 NOR/SRAM Region2 registers configuration */ EXMC_BANK1->SCTLR2 = temp_SCTLR; EXMC_BANK1->STR2 = temp_STR; EXMC_BANK1_WT->SWTR2 = temp_SWTR; break; } case EXMC_BANK1_NORSRAM3: { /* Bank1 NOR/SRAM Region3 registers configuration */ EXMC_BANK1->SCTLR3 = temp_SCTLR; EXMC_BANK1->STR3 = temp_STR; EXMC_BANK1_WT->SWTR3 = temp_SWTR; break; } case EXMC_BANK1_NORSRAM4: { /* Bank1 NOR/SRAM Region4 registers configuration */ EXMC_BANK1->SCTLR4 = temp_SCTLR; EXMC_BANK1->STR4 = temp_STR; EXMC_BANK1_WT->SWTR4 = temp_SWTR; break; } default: break; } } /** * @brief Initialize the EXMC Bank2 or Bank3 NAND parameters. * @param EXMC_NANDInitParaStruct : the struct EXMC_NANDInitPara pointer * @retval None */ void EXMC_NAND_Init(EXMC_NANDInitPara *EXMC_NANDInitParaStruct) { uint32_t temp_CTLR = 0x00000000, temp_COMTR = 0x00000000, temp_ATTR = 0x00000000; temp_CTLR = (uint32_t)EXMC_NANDInitParaStruct->EXMC_WaitFeature | CTLR_EMTYP_NAND | EXMC_NANDInitParaStruct->EXMC_DatabusWidth | EXMC_NANDInitParaStruct->EXMC_ECCLogic | EXMC_NANDInitParaStruct->EXMC_ECCSize | (EXMC_NANDInitParaStruct->EXMC_CTRLatency << CTLR_CTR_OFFSET) | (EXMC_NANDInitParaStruct->EXMC_ATRLatency << CTLR_ATR_OFFSET); temp_COMTR = (uint32_t)EXMC_NANDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_SetupTime | (EXMC_NANDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_WaitTime << COMTR_COMWT_OFFSET) | (EXMC_NANDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_HoldTime << COMTR_COMHT_OFFSET) | (EXMC_NANDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_DatabusHiZTime << COMTR_COMHIZT_OFFSET); temp_ATTR = (uint32_t)EXMC_NANDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_SetupTime | (EXMC_NANDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_WaitTime << ATTR_ATTWT_OFFSET) | (EXMC_NANDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_HoldTime << ATTR_ATTHT_OFFSET) | (EXMC_NANDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_DatabusHiZTime << ATTR_ATTHIZT_OFFSET); if (EXMC_NANDInitParaStruct->EXMC_NANDBank == EXMC_BANK2_NAND) { /* Configure the EXMC_Bank2 NAND registers using the value of parameters */ EXMC_BANK2->CTLR2 = temp_CTLR; EXMC_BANK2->COMTR2 = temp_COMTR; EXMC_BANK2->ATTR2 = temp_ATTR; } else { /* EXMC_Bank3_NAND registers configuration */ EXMC_BANK3->CTLR3 = temp_CTLR; EXMC_BANK3->COMTR3 = temp_COMTR; EXMC_BANK3->ATTR3 = temp_ATTR; } } /** * @brief Initialize the EXMC Bank4 PCCARD parameters. * @param EXMC_PCCARDInitParaStruct : the struct EXMC_PCCARDInitPara pointer. * @retval None */ void EXMC_PCCARD_Init(EXMC_PCCARDInitPara *EXMC_PCCARDInitParaStruct) { /* Configure the EXMC_Bank4_PCCARD CTLR4 register using the value of parameters */ EXMC_BANK4->CTLR4 = (uint32_t)EXMC_PCCARDInitParaStruct->EXMC_WaitFeature | EXMC_DATABUS_WIDTH_16B | (EXMC_PCCARDInitParaStruct->EXMC_CTRLatency << CTLR_CTR_OFFSET) | (EXMC_PCCARDInitParaStruct->EXMC_ATRLatency << CTLR_ATR_OFFSET); /* Configure the EXMC_Bank4_PCCARD COMTR4 register using the value of parameters */ EXMC_BANK4->COMTR4 = (uint32_t)EXMC_PCCARDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_SetupTime | (EXMC_PCCARDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_WaitTime << COMTR_COMWT_OFFSET) | (EXMC_PCCARDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_HoldTime << COMTR_COMHT_OFFSET) | (EXMC_PCCARDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_DatabusHiZTime << COMTR_COMHIZT_OFFSET); /* Configure the EXMC_Bank4_PCCARD ATTR4 register using the value of parameters */ EXMC_BANK4->ATTR4 = (uint32_t)EXMC_PCCARDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_SetupTime | (EXMC_PCCARDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_WaitTime << ATTR_ATTWT_OFFSET) | (EXMC_PCCARDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_HoldTime << ATTR_ATTHT_OFFSET) | (EXMC_PCCARDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_DatabusHiZTime << ATTR_ATTHIZT_OFFSET); /* Configure the EXMC_Bank4_PCCARD IOTR4 register using the value of parameters */ EXMC_BANK4->IOTR4 = (uint32_t)EXMC_PCCARDInitParaStruct->EXMC_IOSpaceTimingParaStruct->EXMC_SetupTime | (EXMC_PCCARDInitParaStruct->EXMC_IOSpaceTimingParaStruct->EXMC_WaitTime << IOTR_IOTWT_OFFSET) | (EXMC_PCCARDInitParaStruct->EXMC_IOSpaceTimingParaStruct->EXMC_HoldTime << IOTR_IOHT_OFFSET) | (EXMC_PCCARDInitParaStruct->EXMC_IOSpaceTimingParaStruct->EXMC_DatabusHiZTime << IOTR_IOHIZT_OFFSET); } /** * @brief Initialize the struct EXMC_NORSRAMInitPara * @param EXMC_NORSRAMInitParaStruct: the struct EXMC_NORSRAMInitPara pointer * @retval None */ void EXMC_NORSRAMStruct_Init(EXMC_NORSRAMInitPara *EXMC_NORSRAMInitParaStruct) { EXMC_NORSRAMInitParaStruct->EXMC_NORSRAMBank = EXMC_BANK1_NORSRAM1; EXMC_NORSRAMInitParaStruct->EXMC_AddressDataMux = EXMC_ADDRESS_DATA_MUX_ENABLE; EXMC_NORSRAMInitParaStruct->EXMC_MemoryType = EXMC_MEMORY_TYPE_SRAM; EXMC_NORSRAMInitParaStruct->EXMC_DatabusWidth = EXMC_DATABUS_WIDTH_8B; EXMC_NORSRAMInitParaStruct->EXMC_BurstMode = EXMC_BURST_MODE_DISABLE; EXMC_NORSRAMInitParaStruct->EXMC_NWAITPolarity = EXMC_NWAIT_POLARITY_LOW; EXMC_NORSRAMInitParaStruct->EXMC_WrapBurstMode = EXMC_WRAP_BURST_MODE_DISABLE; EXMC_NORSRAMInitParaStruct->EXMC_NWAITConfig = EXMC_NWAIT_CONFIG_BEFORE; EXMC_NORSRAMInitParaStruct->EXMC_MemoryWrite = EXMC_MEMORY_WRITE_ENABLE; EXMC_NORSRAMInitParaStruct->EXMC_NWAITSignal = EXMC_NWAIT_SIGNAL_ENABLE; EXMC_NORSRAMInitParaStruct->EXMC_ExtendedMode = EXMC_EXTENDED_MODE_DISABLE; EXMC_NORSRAMInitParaStruct->EXMC_AsynWait = EXMC_ASYN_WAIT_DISABLE; EXMC_NORSRAMInitParaStruct->EXMC_WriteMode = EXMC_ASYN_WRITE; EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_AsynAddressSetupTime = 0xF; EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_AsynAddressHoldTime = 0xF; EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_AsynDataSetupTime = 0xFF; EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_BusLatency = 0xF; EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_SynCLKDivision = 0xF; EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_SynDataLatency = 0xF; EXMC_NORSRAMInitParaStruct->EXMC_ReadWriteTimingParaStruct->EXMC_AsynAccessMode = EXMC_ACCESS_MODE_A; EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_AsynAddressSetupTime = 0xF; EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_AsynAddressHoldTime = 0xF; EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_AsynDataSetupTime = 0xFF; EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_BusLatency = 0xF; EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_SynCLKDivision = 0xF; EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_SynDataLatency = 0xF; EXMC_NORSRAMInitParaStruct->EXMC_WriteTimingParaStruct->EXMC_AsynAccessMode = EXMC_ACCESS_MODE_A; } /** * @brief Initialize the struct EXMC_NANDInitPara * @param EXMC_NANDInitParaStruct: the struct EXMC_NANDInitPara pointer. * @retval None */ void EXMC_NANDStruct_Init(EXMC_NANDInitPara *EXMC_NANDInitParaStruct) { EXMC_NANDInitParaStruct->EXMC_NANDBank = EXMC_BANK2_NAND; EXMC_NANDInitParaStruct->EXMC_WaitFeature = EXMC_WAIT_FEATURE_DISABLE; EXMC_NANDInitParaStruct->EXMC_DatabusWidth = EXMC_DATABUS_WIDTH_8B; EXMC_NANDInitParaStruct->EXMC_ECCLogic = EXMC_ECC_LOGIC_DISABLE; EXMC_NANDInitParaStruct->EXMC_ECCSize = EXMC_ECC_SIZE_256BYTES; EXMC_NANDInitParaStruct->EXMC_CTRLatency = 0x0; EXMC_NANDInitParaStruct->EXMC_ATRLatency = 0x0; EXMC_NANDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_SetupTime = 0xFC; EXMC_NANDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_WaitTime = 0xFC; EXMC_NANDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_HoldTime = 0xFC; EXMC_NANDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_DatabusHiZTime = 0xFC; EXMC_NANDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_SetupTime = 0xFC; EXMC_NANDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_WaitTime = 0xFC; EXMC_NANDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_HoldTime = 0xFC; EXMC_NANDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_DatabusHiZTime = 0xFC; } /** * @brief Initialize the struct EXMC_PCCARDInitParaStruct * @param EXMC_PCCARDInitPara: the struct EXMC_PCCARDInitParaStruct pointer. * @retval None */ void EXMC_PCCARDStruct_Init(EXMC_PCCARDInitPara *EXMC_PCCARDInitParaStruct) { EXMC_PCCARDInitParaStruct->EXMC_WaitFeature = EXMC_WAIT_FEATURE_DISABLE; EXMC_PCCARDInitParaStruct->EXMC_CTRLatency = 0x0; EXMC_PCCARDInitParaStruct->EXMC_ATRLatency = 0x0; EXMC_PCCARDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_SetupTime = 0xFC; EXMC_PCCARDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_WaitTime = 0xFC; EXMC_PCCARDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_HoldTime = 0xFC; EXMC_PCCARDInitParaStruct->EXMC_CommonSpaceTimingParaStruct->EXMC_DatabusHiZTime = 0xFC; EXMC_PCCARDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_SetupTime = 0xFC; EXMC_PCCARDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_WaitTime = 0xFC; EXMC_PCCARDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_HoldTime = 0xFC; EXMC_PCCARDInitParaStruct->EXMC_AttributeSpaceTimingParaStruct->EXMC_DatabusHiZTime = 0xFC; EXMC_PCCARDInitParaStruct->EXMC_IOSpaceTimingParaStruct->EXMC_SetupTime = 0xFC; EXMC_PCCARDInitParaStruct->EXMC_IOSpaceTimingParaStruct->EXMC_WaitTime = 0xFC; EXMC_PCCARDInitParaStruct->EXMC_IOSpaceTimingParaStruct->EXMC_HoldTime = 0xFC; EXMC_PCCARDInitParaStruct->EXMC_IOSpaceTimingParaStruct->EXMC_DatabusHiZTime = 0xFC; } /** * @brief Enable or disable the specified Region of Bank1. * @param EXMC_NORSRAMBank: specifies the Region of Bank1. * This parameter can be one of the following values: * @arg EXMC_BANK1_NORSRAM1: the Region1 of Bank1 * @arg EXMC_BANK1_NORSRAM2: the Region2 of Bank1 * @arg EXMC_BANK1_NORSRAM3: the Region3 of Bank1 * @arg EXMC_BANK1_NORSRAM4: the Region4 of Bank1 * @param NewValue: new value of the specified Region of Bank1. * This parameter can be: ENABLE or DISABLE. * @retval None */ void EXMC_NORSRAM_Enable(uint32_t EXMC_NORSRAMBank, TypeState NewValue) { if (NewValue != DISABLE) { /* Enable the selected NOR/SRAM Bank by setting the PBKEN bit in the BCRx register */ switch (EXMC_NORSRAMBank) { case EXMC_BANK1_NORSRAM1: EXMC_BANK1->SCTLR1 |= SCTLR_BAKEN_SET; break; case EXMC_BANK1_NORSRAM2: EXMC_BANK1->SCTLR2 |= SCTLR_BAKEN_SET; break; case EXMC_BANK1_NORSRAM3: EXMC_BANK1->SCTLR3 |= SCTLR_BAKEN_SET; break; case EXMC_BANK1_NORSRAM4: EXMC_BANK1->SCTLR4 |= SCTLR_BAKEN_SET; break; default: break; } } else { /* Disable the selected NOR/SRAM Bank by clearing the PBKEN bit in the BCRx register */ switch (EXMC_NORSRAMBank) { case EXMC_BANK1_NORSRAM1: EXMC_BANK1->SCTLR1 &= SCTLR_BAKEN_RESET; break; case EXMC_BANK1_NORSRAM2: EXMC_BANK1->SCTLR2 &= SCTLR_BAKEN_RESET; break; case EXMC_BANK1_NORSRAM3: EXMC_BANK1->SCTLR3 &= SCTLR_BAKEN_RESET; break; case EXMC_BANK1_NORSRAM4: EXMC_BANK1->SCTLR4 &= SCTLR_BAKEN_RESET; break; default: break; } } } /** * @brief Enable or disable the specified NAND Bank2 or Bank3. * @param EXMC_NANDBank: specifies the NAND Bank. * This parameter can be one of the following values: * @arg EXMC_BANK2_NAND: the NAND Bank2 * @arg EXMC_BANK3_NAND: the NAND Bank3 * @param NewValue: new value of the specified Bank. * This parameter can be: ENABLE or DISABLE. * @retval None */ void EXMC_NAND_Enable(uint32_t EXMC_NANDBank, TypeState NewValue) { if (NewValue != DISABLE) { /* Enable the selected NAND Bank by setting the PBKEN bit in the PCRx register */ if (EXMC_NANDBank == EXMC_BANK2_NAND) { EXMC_BANK2->CTLR2 |= CTLR_BAKEN_SET; } else { EXMC_BANK3->CTLR3 |= CTLR_BAKEN_SET; } } else { /* Disable the selected NAND Bank by clearing the PBKEN bit in the PCRx register */ if (EXMC_NANDBank == EXMC_BANK2_NAND) { EXMC_BANK2->CTLR2 &= CTLR_BAKEN_RESET; } else { EXMC_BANK3->CTLR3 &= CTLR_BAKEN_RESET; } } } /** * @brief Enable or disable the Bank4 of PCCARD. * @param NewValue: new value of the PCCARD Bank. * This parameter can be: ENABLE or DISABLE. * @retval None */ void EXMC_PCCARD_Enable(TypeState NewValue) { if (NewValue != DISABLE) { /* Enable the PCCARD Bank */ EXMC_BANK4->CTLR4 |= CTLR_BAKEN_SET; } else { /* Disable the PCCARD Bank */ EXMC_BANK4->CTLR4 &= CTLR_BAKEN_RESET; } } /** * @brief Enable or disable the EXMC_CTLR1_ECCEN control bit. * @param EXMC_NANDBank: specifies the NAND Bank. * This parameter can be one of the following values: * @arg EXMC_BANK2_NAND: the NAND Bank2 * @arg EXMC_BANK3_NAND: the NAND Bank3 * @param NewValue: new value of the EXMC Bank2 or Bank3 ECC calculation. * This parameter can be: ENABLE or DISABLE. * @retval None */ void EXMC_NANDECC_Enable(uint32_t EXMC_NANDBank, TypeState NewValue) { if (NewValue != DISABLE) { /* Enable the selected NAND Bank ECC function by setting the ECCEN bit in the PCRx register */ if (EXMC_NANDBank == EXMC_BANK2_NAND) { EXMC_BANK2->CTLR2 |= CTLR_ECCEN_SET; } else { EXMC_BANK3->CTLR3 |= CTLR_ECCEN_SET; } } else { /* Disable the selected NAND Bank ECC function by clearing the ECCEN bit in the PCRx register */ if (EXMC_NANDBank == EXMC_BANK2_NAND) { EXMC_BANK2->CTLR2 &= CTLR_ECCEN_RESET; } else { EXMC_BANK3->CTLR3 &= CTLR_ECCEN_RESET; } } } /** * @brief Get the EXMC_ECCR value. * @param EXMC_NANDBank: specifies the NAND Bank. * This parameter can be one of the following values: * @arg EXMC_BANK2_NAND: the NAND Bank2 * @arg EXMC_BANK3_NAND: the NAND Bank3 * @retval The Error Correction Code (ECC) value. */ uint32_t EXMC_GetECC(uint32_t EXMC_NANDBank) { if (EXMC_NANDBank == EXMC_BANK2_NAND) { return (EXMC_BANK2->ECCR2); } else { return (EXMC_BANK3->ECCR3); } } /** * @brief Enable or disable the specified EXMC Bank2/3/4 interrupts. * @param EXMC_PCNANDBank: specifies the NAND Bank or PCCARD Bank. * This parameter can be one of the following values: * @arg EXMC_BANK2_NAND: the NAND Bank2 * @arg EXMC_BANK3_NAND: the NAND Bank3 * @arg EXMC_BANK4_PCCARD: the PCCARD Bank4 * @param EXMC_INT: the EXMC interrupt sources. * This parameter can be any combination of the following values: * @arg EXMC_INT_RISE: Rising edge detection interrupt * @arg EXMC_INT_LEVEL: Level edge detection interrupt * @arg EXMC_INT_FALL: Falling edge detection interrupt * @param NewValue: new value of the specified EXMC interrupts. * This parameter can be: ENABLE or DISABLE. * @retval None */ void EXMC_INTConfig(uint32_t EXMC_PCNANDBank, uint32_t EXMC_INT, TypeState NewValue) { if (NewValue != DISABLE) { /* Enable the specified EXMC_Bank2 interrupts */ if (EXMC_PCNANDBank == EXMC_BANK2_NAND) { EXMC_BANK2->SIR2 |= EXMC_INT; } /* Enable the specified EXMC_Bank3 interrupts */ else if (EXMC_PCNANDBank == EXMC_BANK3_NAND) { EXMC_BANK3->SIR3 |= EXMC_INT; } /* Enable the specified EXMC_Bank4 interrupts */ else { EXMC_BANK4->SIR4 |= EXMC_INT; } } else { /* Disable the specified EXMC_Bank2 interrupts */ if (EXMC_PCNANDBank == EXMC_BANK2_NAND) { EXMC_BANK2->SIR2 &= ~((uint32_t)EXMC_INT); } /* Disable the specified EXMC_Bank3 interrupts */ else if (EXMC_PCNANDBank == EXMC_BANK3_NAND) { EXMC_BANK3->SIR3 &= ~((uint32_t)EXMC_INT); } /* Disable the specified EXMC_Bank4 interrupts */ else { EXMC_BANK4->SIR4 &= ~((uint32_t)EXMC_INT); } } } /** * @brief Get the bit flag of EXMC_SIRx register. * @param EXMC_PCNANDBank: specifies the NAND Bank or PCCARD Bank. * This parameter can be one of the following values: * @arg EXMC_BANK2_NAND: the NAND Bank2 * @arg EXMC_BANK3_NAND: the NAND Bank3 * @arg EXMC_BANK4_PCCARD: the PCCARD Bank4 * @param EXMC_FLAG: the flag of EXMC_SIRx register. * This parameter can be one of the following values: * @arg EXMC_FLAG_RISE: Rising egde detection Flag * @arg EXMC_FLAG_LEVEL: Level detection Flag * @arg EXMC_FLAG_FALL: Falling egde detection Flag * @arg EXMC_FLAG_FIFOE: FIFO empty Flag * @retval The new value of EXMC_FLAG (SET or RESET). */ TypeState EXMC_GetBitState(uint32_t EXMC_PCNANDBank, uint32_t EXMC_FLAG) { uint32_t temp_SIR = 0x00000000; /* the NAND Bank2 */ if (EXMC_PCNANDBank == EXMC_BANK2_NAND) { temp_SIR = EXMC_BANK2->SIR2; } /* the NAND Bank3 */ else if (EXMC_PCNANDBank == EXMC_BANK3_NAND) { temp_SIR = EXMC_BANK3->SIR3; } /* the PCCARD Bank4 */ else { temp_SIR = EXMC_BANK4->SIR4; } if ((temp_SIR & EXMC_FLAG) != (uint16_t)RESET) { /* EXMC_FLAG is set */ return SET; } else { /* EXMC_FLAG is reset */ return RESET; } } /** * @brief Clear the bit flag of EXMC_SIRx register. * @param EXMC_PCNANDBank: specifies the NAND Bank or PCCARD Bank. * This parameter can be one of the following values: * @arg EXMC_BANK2_NAND: the NAND Bank2 * @arg EXMC_BANK3_NAND: the NAND Bank3 * @arg EXMC_BANK4_PCCARD: the PCCARD Bank4 * @param EXMC_FLAG: the flag of EXMC_SIRx register. * This parameter can be any combination of the following values: * @arg EXMC_FLAG_RISE: Rising egde detection Flag * @arg EXMC_FLAG_LEVEL: Level detection Flag * @arg EXMC_FLAG_FALL: Falling egde detection Flag * @retval None */ void EXMC_ClearBitState(uint32_t EXMC_PCNANDBank, uint32_t EXMC_FLAG) { if (EXMC_PCNANDBank == EXMC_BANK2_NAND) { EXMC_BANK2->SIR2 &= ~EXMC_FLAG; } else if (EXMC_PCNANDBank == EXMC_BANK3_NAND) { EXMC_BANK3->SIR3 &= ~EXMC_FLAG; } /* EXMC_Bank4_PCCARD*/ else { EXMC_BANK4->SIR4 &= ~EXMC_FLAG; } } /** * @brief Get the interrupt bit flag. * @param EXMC_PCNANDBank: specifies the NAND Bank or PCCARD Bank. * This parameter can be one of the following values: * @arg EXMC_BANK2_NAND: the NAND Bank2 * @arg EXMC_BANK3_NAND: the NAND Bank3 * @arg EXMC_BANK4_PCCARD: the PCCARD Bank4 * @param EXMC_INT: the interrupt bit flag. * This parameter can be one of the following values: * @arg EXMC_INT_RISE: Rising edge detection interrupt * @arg EXMC_INT_LEVEL: Level edge detection interrupt * @arg EXMC_INT_FALL: Falling edge detection interrupt * @retval The new value of EXMC_INT (SET or RESET). */ TypeState EXMC_GetIntBitState(uint32_t EXMC_PCNANDBank, uint32_t EXMC_INT) { uint32_t temp_SIR = 0x00000000, temp_INTState = 0x00000000, temp_INTEnable = 0x00000000; if (EXMC_PCNANDBank == EXMC_BANK2_NAND) { temp_SIR = EXMC_BANK2->SIR2; } else if (EXMC_PCNANDBank == EXMC_BANK3_NAND) { temp_SIR = EXMC_BANK3->SIR3; } /* EXMC_Bank4_PCCARD*/ else { temp_SIR = EXMC_BANK4->SIR4; } temp_INTState = temp_SIR & EXMC_INT; temp_INTEnable = temp_SIR & (EXMC_INT >> SIR_INTEN_OFFSET); if ((temp_INTState != (uint32_t)RESET) && (temp_INTEnable != (uint32_t)RESET)) { return SET; } else { return RESET; } } /** * @brief Clear the interrupt bit flag. * @param EXMC_PCNANDBank: specifies the NAND Bank or PCCARD Bank. * This parameter can be one of the following values: * @arg EXMC_BANK2_NAND: the NAND Bank2 * @arg EXMC_BANK3_NAND: the NAND Bank3 * @arg EXMC_BANK4_PCCARD: the PCCARD Bank4 * @param EXMC_INT: the interrupt bit flag. * This parameter can be any combination of the following values: * @arg EXMC_FLAG_RISE: Rising edge detection interrupt * @arg EXMC_FLAG_LEVEL: Level edge detection interrupt * @arg EXMC_FLAG_FALL: Falling edge detection interrupt * @retval None */ void EXMC_ClearIntBitState(uint32_t EXMC_PCNANDBank, uint32_t EXMC_INT) { if (EXMC_PCNANDBank == EXMC_BANK2_NAND) { EXMC_BANK2->SIR2 &= ~(EXMC_INT >> SIR_INTEN_OFFSET); } else if (EXMC_PCNANDBank == EXMC_BANK3_NAND) { EXMC_BANK3->SIR3 &= ~(EXMC_INT >> SIR_INTEN_OFFSET); } /* EXMC_Bank4_PCCARD*/ else { EXMC_BANK4->SIR4 &= ~(EXMC_INT >> SIR_INTEN_OFFSET); } } /** * @} */ /** * @} */ /** * @} */