62#if defined(HAL_NOR_MODULE_ENABLED) || defined(HAL_NAND_MODULE_ENABLED) || defined(HAL_PCCARD_MODULE_ENABLED) \
63 || defined(HAL_SRAM_MODULE_ENABLED)
79#if defined(FSMC_Bank1)
85#define BTR_CLEAR_MASK ((uint32_t)(FSMC_BTR1_ADDSET | FSMC_BTR1_ADDHLD |\
86 FSMC_BTR1_DATAST | FSMC_BTR1_BUSTURN |\
87 FSMC_BTR1_CLKDIV | FSMC_BTR1_DATLAT |\
92#define BWTR_CLEAR_MASK ((uint32_t)(FSMC_BWTR1_ADDSET | FSMC_BWTR1_ADDHLD |\
93 FSMC_BWTR1_DATAST | FSMC_BWTR1_BUSTURN |\
96#if defined(FSMC_Bank2_3)
98#if defined (FSMC_PCR_PWAITEN)
101#define PCR_CLEAR_MASK ((uint32_t)(FSMC_PCR_PWAITEN | FSMC_PCR_PBKEN | \
102 FSMC_PCR_PTYP | FSMC_PCR_PWID | \
103 FSMC_PCR_ECCEN | FSMC_PCR_TCLR | \
104 FSMC_PCR_TAR | FSMC_PCR_ECCPS))
107#define PMEM_CLEAR_MASK ((uint32_t)(FSMC_PMEM_MEMSET2 | FSMC_PMEM_MEMWAIT2 |\
108 FSMC_PMEM_MEMHOLD2 | FSMC_PMEM_MEMHIZ2))
112#define PATT_CLEAR_MASK ((uint32_t)(FSMC_PATT_ATTSET2 | FSMC_PATT_ATTWAIT2 |\
113 FSMC_PATT_ATTHOLD2 | FSMC_PATT_ATTHIZ2))
117#define PCR_CLEAR_MASK ((uint32_t)(FSMC_PCR2_PWAITEN | FSMC_PCR2_PBKEN | \
118 FSMC_PCR2_PTYP | FSMC_PCR2_PWID | \
119 FSMC_PCR2_ECCEN | FSMC_PCR2_TCLR | \
120 FSMC_PCR2_TAR | FSMC_PCR2_ECCPS))
123#define PMEM_CLEAR_MASK ((uint32_t)(FSMC_PMEM2_MEMSET2 | FSMC_PMEM2_MEMWAIT2 |\
124 FSMC_PMEM2_MEMHOLD2 | FSMC_PMEM2_MEMHIZ2))
128#define PATT_CLEAR_MASK ((uint32_t)(FSMC_PATT2_ATTSET2 | FSMC_PATT2_ATTWAIT2 |\
129 FSMC_PATT2_ATTHOLD2 | FSMC_PATT2_ATTHIZ2))
133#if defined(FSMC_Bank4)
136#define PCR4_CLEAR_MASK ((uint32_t)(FSMC_PCR4_PWAITEN | FSMC_PCR4_PBKEN | \
137 FSMC_PCR4_PTYP | FSMC_PCR4_PWID | \
138 FSMC_PCR4_ECCEN | FSMC_PCR4_TCLR | \
139 FSMC_PCR4_TAR | FSMC_PCR4_ECCPS))
142#define PMEM4_CLEAR_MASK ((uint32_t)(FSMC_PMEM4_MEMSET4 | FSMC_PMEM4_MEMWAIT4 |\
143 FSMC_PMEM4_MEMHOLD4 | FSMC_PMEM4_MEMHIZ4))
147#define PATT4_CLEAR_MASK ((uint32_t)(FSMC_PATT4_ATTSET4 | FSMC_PATT4_ATTWAIT4 |\
148 FSMC_PATT4_ATTHOLD4 | FSMC_PATT4_ATTHIZ4))
152#define PIO4_CLEAR_MASK ((uint32_t)(FSMC_PIO4_IOSET4 | FSMC_PIO4_IOWAIT4 | \
153 FSMC_PIO4_IOHOLD4 | FSMC_PIO4_IOHIZ4))
170#if defined(FSMC_Bank1)
221 const FSMC_NORSRAM_InitTypeDef *Init)
223 uint32_t flashaccess;
232 assert_param(IS_FSMC_NORSRAM_MEMORY_WIDTH(Init->MemoryDataWidth));
234 assert_param(IS_FSMC_WAIT_POLARITY(Init->WaitSignalPolarity));
235#if defined(FSMC_BCR1_WRAPMOD)
238 assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(Init->WaitSignalActive));
239 assert_param(IS_FSMC_WRITE_OPERATION(Init->WriteOperation));
241 assert_param(IS_FSMC_EXTENDED_MODE(Init->ExtendedMode));
244#if defined(FSMC_BCR1_CCLKEN)
245 assert_param(IS_FSMC_CONTINOUS_CLOCK(Init->ContinuousClock));
247#if defined(FSMC_BCR1_WFDIS)
253 __FSMC_NORSRAM_DISABLE(Device, Init->NSBank);
256 if (Init->MemoryType == FSMC_MEMORY_TYPE_NOR)
258 flashaccess = FSMC_NORSRAM_FLASH_ACCESS_ENABLE;
262 flashaccess = FSMC_NORSRAM_FLASH_ACCESS_DISABLE;
265 btcr_reg = (flashaccess | \
266 Init->DataAddressMux | \
268 Init->MemoryDataWidth | \
269 Init->BurstAccessMode | \
270 Init->WaitSignalPolarity | \
271 Init->WaitSignalActive | \
272 Init->WriteOperation | \
274 Init->ExtendedMode | \
275 Init->AsynchronousWait | \
278#if defined(FSMC_BCR1_WRAPMOD)
279 btcr_reg |= Init->WrapMode;
281#if defined(FSMC_BCR1_CCLKEN)
282 btcr_reg |= Init->ContinuousClock;
284#if defined(FSMC_BCR1_WFDIS)
285 btcr_reg |= Init->WriteFifo;
287 btcr_reg |= Init->PageSize;
289 mask = (FSMC_BCR1_MBKEN |
300 FSMC_BCR1_ASYNCWAIT |
303#if defined(FSMC_BCR1_WRAPMOD)
304 mask |= FSMC_BCR1_WRAPMOD;
306#if defined(FSMC_BCR1_CCLKEN)
307 mask |= FSMC_BCR1_CCLKEN;
309#if defined(FSMC_BCR1_WFDIS)
310 mask |= FSMC_BCR1_WFDIS;
312 mask |= FSMC_BCR1_CPSIZE;
314 MODIFY_REG(Device->BTCR[Init->NSBank], mask, btcr_reg);
316#if defined(FSMC_BCR1_CCLKEN)
318 if ((Init->ContinuousClock == FSMC_CONTINUOUS_CLOCK_SYNC_ASYNC) && (Init->NSBank != FSMC_NORSRAM_BANK1))
320 MODIFY_REG(Device->BTCR[FSMC_NORSRAM_BANK1], FSMC_BCR1_CCLKEN, Init->ContinuousClock);
323#if defined(FSMC_BCR1_WFDIS)
325 if (Init->NSBank != FSMC_NORSRAM_BANK1)
328 SET_BIT(Device->BTCR[FSMC_NORSRAM_BANK1], (uint32_t)(Init->WriteFifo));
343 FSMC_NORSRAM_EXTENDED_TypeDef *ExDevice, uint32_t Bank)
347 assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(ExDevice));
351 __FSMC_NORSRAM_DISABLE(Device, Bank);
355 if (Bank == FSMC_NORSRAM_BANK1)
357 Device->BTCR[Bank] = 0x000030DBU;
362 Device->BTCR[Bank] = 0x000030D2U;
365 Device->BTCR[Bank + 1U] = 0x0FFFFFFFU;
366 ExDevice->BWTR[Bank] = 0x0FFFFFFFU;
380 const FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank)
382#if defined(FSMC_BCR1_CCLKEN)
388 assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime));
389 assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime));
390 assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime));
391 assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration));
393 assert_param(IS_FSMC_DATA_LATENCY(Timing->DataLatency));
398 Device->BTCR[Bank + 1U] =
399 (Timing->AddressSetupTime << FSMC_BTR1_ADDSET_Pos) |
400 (Timing->AddressHoldTime << FSMC_BTR1_ADDHLD_Pos) |
401 (Timing->DataSetupTime << FSMC_BTR1_DATAST_Pos) |
402 (Timing->BusTurnAroundDuration << FSMC_BTR1_BUSTURN_Pos) |
403 ((Timing->CLKDivision - 1U) << FSMC_BTR1_CLKDIV_Pos) |
404 ((Timing->DataLatency - 2U) << FSMC_BTR1_DATLAT_Pos) |
407#if defined(FSMC_BCR1_CCLKEN)
409 if (
HAL_IS_BIT_SET(Device->BTCR[FSMC_NORSRAM_BANK1], FSMC_BCR1_CCLKEN))
411 tmpr = (uint32_t)(Device->BTCR[FSMC_NORSRAM_BANK1 + 1U] & ~((0x0FU) << FSMC_BTR1_CLKDIV_Pos));
412 tmpr |= (uint32_t)(((Timing->CLKDivision) - 1U) << FSMC_BTR1_CLKDIV_Pos);
413 MODIFY_REG(Device->BTCR[FSMC_NORSRAM_BANK1 + 1U], FSMC_BTR1_CLKDIV, tmpr);
432HAL_StatusTypeDef FSMC_NORSRAM_Extended_Timing_Init(FSMC_NORSRAM_EXTENDED_TypeDef *Device,
433 const FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank,
434 uint32_t ExtendedMode)
440 if (ExtendedMode == FSMC_EXTENDED_MODE_ENABLE)
444 assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime));
445 assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime));
446 assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime));
447 assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration));
452 MODIFY_REG(Device->BWTR[Bank], BWTR_CLEAR_MASK, (Timing->AddressSetupTime |
453 ((Timing->AddressHoldTime) << FSMC_BWTR1_ADDHLD_Pos) |
454 ((Timing->DataSetupTime) << FSMC_BWTR1_DATAST_Pos) |
456 ((Timing->BusTurnAroundDuration) << FSMC_BWTR1_BUSTURN_Pos)));
460 Device->BWTR[Bank] = 0x0FFFFFFFU;
490HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Enable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank)
497 SET_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE);
508HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Disable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank)
515 CLEAR_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE);
529#if defined(FSMC_Bank2_3)
580HAL_StatusTypeDef FSMC_NAND_Init(FSMC_NAND_TypeDef *Device,
const FSMC_NAND_InitTypeDef *Init)
586 assert_param(IS_FSMC_NAND_MEMORY_WIDTH(Init->MemoryDataWidth));
593 if (Init->NandBank == FSMC_NAND_BANK2)
596 MODIFY_REG(Device->PCR2, PCR_CLEAR_MASK, (Init->Waitfeature |
597 FSMC_PCR_MEMORY_TYPE_NAND |
598 Init->MemoryDataWidth |
599 Init->EccComputation |
601 ((Init->TCLRSetupTime) << FSMC_PCR2_TCLR_Pos) |
602 ((Init->TARSetupTime) << FSMC_PCR2_TAR_Pos)));
607 MODIFY_REG(Device->PCR3, PCR_CLEAR_MASK, (Init->Waitfeature |
608 FSMC_PCR_MEMORY_TYPE_NAND |
609 Init->MemoryDataWidth |
610 Init->EccComputation |
612 ((Init->TCLRSetupTime) << FSMC_PCR2_TCLR_Pos) |
613 ((Init->TARSetupTime) << FSMC_PCR2_TAR_Pos)));
628 const FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank)
639 if (Bank == FSMC_NAND_BANK2)
642 WRITE_REG(Device->PMEM2, (Timing->SetupTime |
643 ((Timing->WaitSetupTime) << FSMC_PMEM2_MEMWAIT2_Pos) |
644 ((Timing->HoldSetupTime) << FSMC_PMEM2_MEMHOLD2_Pos) |
645 ((Timing->HiZSetupTime) << FSMC_PMEM2_MEMHIZ2_Pos)));
650 WRITE_REG(Device->PMEM3, (Timing->SetupTime |
651 ((Timing->WaitSetupTime) << FSMC_PMEM2_MEMWAIT2_Pos) |
652 ((Timing->HoldSetupTime) << FSMC_PMEM2_MEMHOLD2_Pos) |
653 ((Timing->HiZSetupTime) << FSMC_PMEM2_MEMHIZ2_Pos)));
668 const FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank)
679 if (Bank == FSMC_NAND_BANK2)
682 WRITE_REG(Device->PATT2, (Timing->SetupTime |
683 ((Timing->WaitSetupTime) << FSMC_PATT2_ATTWAIT2_Pos) |
684 ((Timing->HoldSetupTime) << FSMC_PATT2_ATTHOLD2_Pos) |
685 ((Timing->HiZSetupTime) << FSMC_PATT2_ATTHIZ2_Pos)));
690 WRITE_REG(Device->PATT3, (Timing->SetupTime |
691 ((Timing->WaitSetupTime) << FSMC_PATT2_ATTWAIT2_Pos) |
692 ((Timing->HoldSetupTime) << FSMC_PATT2_ATTHOLD2_Pos) |
693 ((Timing->HiZSetupTime) << FSMC_PATT2_ATTHIZ2_Pos)));
712 __FSMC_NAND_DISABLE(Device, Bank);
715 if (Bank == FSMC_NAND_BANK2)
718 WRITE_REG(Device->PCR2, 0x00000018U);
719 WRITE_REG(Device->SR2, 0x00000040U);
720 WRITE_REG(Device->PMEM2, 0xFCFCFCFCU);
721 WRITE_REG(Device->PATT2, 0xFCFCFCFCU);
727 WRITE_REG(Device->PCR3, 0x00000018U);
728 WRITE_REG(Device->SR3, 0x00000040U);
729 WRITE_REG(Device->PMEM3, 0xFCFCFCFCU);
730 WRITE_REG(Device->PATT3, 0xFCFCFCFCU);
769 if (Bank == FSMC_NAND_BANK2)
771 SET_BIT(Device->PCR2, FSMC_PCR2_ECCEN);
775 SET_BIT(Device->PCR3, FSMC_PCR2_ECCEN);
795 if (Bank == FSMC_NAND_BANK2)
797 CLEAR_BIT(Device->PCR2, FSMC_PCR2_ECCEN);
801 CLEAR_BIT(Device->PCR3, FSMC_PCR2_ECCEN);
815HAL_StatusTypeDef FSMC_NAND_GetECC(
const FSMC_NAND_TypeDef *Device, uint32_t *ECCval, uint32_t Bank,
828 while (__FSMC_NAND_GET_FLAG(Device, Bank, FSMC_FLAG_FEMPT) == RESET)
833 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
840 if (Bank == FSMC_NAND_BANK2)
843 *ECCval = (uint32_t)Device->ECCR2;
848 *ECCval = (uint32_t)Device->ECCR3;
859#if defined(FSMC_Bank4)
908HAL_StatusTypeDef FSMC_PCCARD_Init(FSMC_PCCARD_TypeDef *Device,
const FSMC_PCCARD_InitTypeDef *Init)
912#if defined(FSMC_Bank2_3)
919 MODIFY_REG(Device->PCR4,
925 (FSMC_PCR_MEMORY_TYPE_PCCARD |
927 FSMC_NAND_PCC_MEM_BUS_WIDTH_16 |
928 (Init->TCLRSetupTime << FSMC_PCR4_TCLR_Pos) |
929 (Init->TARSetupTime << FSMC_PCR4_TAR_Pos)));
941HAL_StatusTypeDef FSMC_PCCARD_CommonSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device,
942 const FSMC_NAND_PCC_TimingTypeDef *Timing)
946#if defined(FSMC_Bank2_3)
954 WRITE_REG(Device->PMEM4, (Timing->SetupTime |
955 ((Timing->WaitSetupTime) << FSMC_PMEM4_MEMWAIT4_Pos) |
956 ((Timing->HoldSetupTime) << FSMC_PMEM4_MEMHOLD4_Pos) |
957 ((Timing->HiZSetupTime) << FSMC_PMEM4_MEMHIZ4_Pos)));
969HAL_StatusTypeDef FSMC_PCCARD_AttributeSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device,
970 const FSMC_NAND_PCC_TimingTypeDef *Timing)
974#if defined(FSMC_Bank2_3)
982 WRITE_REG(Device->PATT4, (Timing->SetupTime |
983 ((Timing->WaitSetupTime) << FSMC_PATT4_ATTWAIT4_Pos) |
984 ((Timing->HoldSetupTime) << FSMC_PATT4_ATTHOLD4_Pos) |
985 ((Timing->HiZSetupTime) << FSMC_PATT4_ATTHIZ4_Pos)));
998 const FSMC_NAND_PCC_TimingTypeDef *Timing)
1002#if defined(FSMC_Bank2_3)
1004 assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
1005 assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
1010 WRITE_REG(Device->PIO4, (Timing->SetupTime |
1011 (Timing->WaitSetupTime << FSMC_PIO4_IOWAIT4_Pos) |
1012 (Timing->HoldSetupTime << FSMC_PIO4_IOHOLD4_Pos) |
1013 (Timing->HiZSetupTime << FSMC_PIO4_IOHIZ4_Pos)));
1029 __FSMC_PCCARD_DISABLE(Device);
1032 Device->PCR4 = 0x00000018U;
1033 Device->SR4 = 0x00000040U;
1034 Device->PMEM4 = 0xFCFCFCFCU;
1035 Device->PATT4 = 0xFCFCFCFCU;
1036 Device->PIO4 = 0xFCFCFCFCU;
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
#define HAL_IS_BIT_SET(REG, BIT)
HAL_StatusTypeDef
HAL Status structures definition.