STM32F4xx_HAL_Driver  1.8.3
stm32f4xx_ll_fsmc.c
Go to the documentation of this file.
1 
56 /* Includes ------------------------------------------------------------------*/
57 #include "stm32f4xx_hal.h"
58 
62 #if defined(HAL_NOR_MODULE_ENABLED) || defined(HAL_NAND_MODULE_ENABLED) || defined(HAL_PCCARD_MODULE_ENABLED) \
63  || defined(HAL_SRAM_MODULE_ENABLED)
64 
70 /* Private typedef -----------------------------------------------------------*/
71 /* Private define ------------------------------------------------------------*/
72 
77 /* ----------------------- FSMC registers bit mask --------------------------- */
78 
79 #if defined(FSMC_Bank1)
80 /* --- BCR Register ---*/
81 /* BCR register clear mask */
82 
83 /* --- BTR Register ---*/
84 /* BTR register clear mask */
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 |\
88  FSMC_BTR1_ACCMOD))
89 
90 /* --- BWTR Register ---*/
91 /* BWTR register clear mask */
92 #define BWTR_CLEAR_MASK ((uint32_t)(FSMC_BWTR1_ADDSET | FSMC_BWTR1_ADDHLD |\
93  FSMC_BWTR1_DATAST | FSMC_BWTR1_BUSTURN |\
94  FSMC_BWTR1_ACCMOD))
95 #endif /* FSMC_Bank1 */
96 #if defined(FSMC_Bank2_3)
97 
98 #if defined (FSMC_PCR_PWAITEN)
99 /* --- PCR Register ---*/
100 /* PCR register clear mask */
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))
105 /* --- PMEM Register ---*/
106 /* PMEM register clear mask */
107 #define PMEM_CLEAR_MASK ((uint32_t)(FSMC_PMEM_MEMSET2 | FSMC_PMEM_MEMWAIT2 |\
108  FSMC_PMEM_MEMHOLD2 | FSMC_PMEM_MEMHIZ2))
109 
110 /* --- PATT Register ---*/
111 /* PATT register clear mask */
112 #define PATT_CLEAR_MASK ((uint32_t)(FSMC_PATT_ATTSET2 | FSMC_PATT_ATTWAIT2 |\
113  FSMC_PATT_ATTHOLD2 | FSMC_PATT_ATTHIZ2))
114 #else
115 /* --- PCR Register ---*/
116 /* PCR register clear mask */
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))
121 /* --- PMEM Register ---*/
122 /* PMEM register clear mask */
123 #define PMEM_CLEAR_MASK ((uint32_t)(FSMC_PMEM2_MEMSET2 | FSMC_PMEM2_MEMWAIT2 |\
124  FSMC_PMEM2_MEMHOLD2 | FSMC_PMEM2_MEMHIZ2))
125 
126 /* --- PATT Register ---*/
127 /* PATT register clear mask */
128 #define PATT_CLEAR_MASK ((uint32_t)(FSMC_PATT2_ATTSET2 | FSMC_PATT2_ATTWAIT2 |\
129  FSMC_PATT2_ATTHOLD2 | FSMC_PATT2_ATTHIZ2))
130 
131 #endif /* FSMC_PCR_PWAITEN */
132 #endif /* FSMC_Bank2_3 */
133 #if defined(FSMC_Bank4)
134 /* --- PCR Register ---*/
135 /* PCR register clear mask */
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))
140 /* --- PMEM Register ---*/
141 /* PMEM register clear mask */
142 #define PMEM4_CLEAR_MASK ((uint32_t)(FSMC_PMEM4_MEMSET4 | FSMC_PMEM4_MEMWAIT4 |\
143  FSMC_PMEM4_MEMHOLD4 | FSMC_PMEM4_MEMHIZ4))
144 
145 /* --- PATT Register ---*/
146 /* PATT register clear mask */
147 #define PATT4_CLEAR_MASK ((uint32_t)(FSMC_PATT4_ATTSET4 | FSMC_PATT4_ATTWAIT4 |\
148  FSMC_PATT4_ATTHOLD4 | FSMC_PATT4_ATTHIZ4))
149 
150 /* --- PIO4 Register ---*/
151 /* PIO4 register clear mask */
152 #define PIO4_CLEAR_MASK ((uint32_t)(FSMC_PIO4_IOSET4 | FSMC_PIO4_IOWAIT4 | \
153  FSMC_PIO4_IOHOLD4 | FSMC_PIO4_IOHIZ4))
154 
155 #endif /* FSMC_Bank4 */
156 
161 /* Private macro -------------------------------------------------------------*/
162 /* Private variables ---------------------------------------------------------*/
163 /* Private function prototypes -----------------------------------------------*/
164 /* Exported functions --------------------------------------------------------*/
165 
170 #if defined(FSMC_Bank1)
171 
220 HAL_StatusTypeDef FSMC_NORSRAM_Init(FSMC_NORSRAM_TypeDef *Device,
222 {
223  uint32_t flashaccess;
224  uint32_t btcr_reg;
225  uint32_t mask;
226 
227  /* Check the parameters */
228  assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
229  assert_param(IS_FSMC_NORSRAM_BANK(Init->NSBank));
230  assert_param(IS_FSMC_MUX(Init->DataAddressMux));
231  assert_param(IS_FSMC_MEMORY(Init->MemoryType));
232  assert_param(IS_FSMC_NORSRAM_MEMORY_WIDTH(Init->MemoryDataWidth));
233  assert_param(IS_FSMC_BURSTMODE(Init->BurstAccessMode));
234  assert_param(IS_FSMC_WAIT_POLARITY(Init->WaitSignalPolarity));
235 #if defined(FSMC_BCR1_WRAPMOD)
236  assert_param(IS_FSMC_WRAP_MODE(Init->WrapMode));
237 #endif /* FSMC_BCR1_WRAPMOD */
238  assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(Init->WaitSignalActive));
239  assert_param(IS_FSMC_WRITE_OPERATION(Init->WriteOperation));
240  assert_param(IS_FSMC_WAITE_SIGNAL(Init->WaitSignal));
241  assert_param(IS_FSMC_EXTENDED_MODE(Init->ExtendedMode));
242  assert_param(IS_FSMC_ASYNWAIT(Init->AsynchronousWait));
243  assert_param(IS_FSMC_WRITE_BURST(Init->WriteBurst));
244 #if defined(FSMC_BCR1_CCLKEN)
245  assert_param(IS_FSMC_CONTINOUS_CLOCK(Init->ContinuousClock));
246 #endif
247 #if defined(FSMC_BCR1_WFDIS)
248  assert_param(IS_FSMC_WRITE_FIFO(Init->WriteFifo));
249 #endif /* FSMC_BCR1_WFDIS */
250  assert_param(IS_FSMC_PAGESIZE(Init->PageSize));
251 
252  /* Disable NORSRAM Device */
253  __FSMC_NORSRAM_DISABLE(Device, Init->NSBank);
254 
255  /* Set NORSRAM device control parameters */
256  if (Init->MemoryType == FSMC_MEMORY_TYPE_NOR)
257  {
258  flashaccess = FSMC_NORSRAM_FLASH_ACCESS_ENABLE;
259  }
260  else
261  {
262  flashaccess = FSMC_NORSRAM_FLASH_ACCESS_DISABLE;
263  }
264 
265  btcr_reg = (flashaccess | \
266  Init->DataAddressMux | \
267  Init->MemoryType | \
268  Init->MemoryDataWidth | \
269  Init->BurstAccessMode | \
270  Init->WaitSignalPolarity | \
271  Init->WaitSignalActive | \
272  Init->WriteOperation | \
273  Init->WaitSignal | \
274  Init->ExtendedMode | \
275  Init->AsynchronousWait | \
276  Init->WriteBurst);
277 
278 #if defined(FSMC_BCR1_WRAPMOD)
279  btcr_reg |= Init->WrapMode;
280 #endif /* FSMC_BCR1_WRAPMOD */
281 #if defined(FSMC_BCR1_CCLKEN)
282  btcr_reg |= Init->ContinuousClock;
283 #endif /* FSMC_BCR1_CCLKEN */
284 #if defined(FSMC_BCR1_WFDIS)
285  btcr_reg |= Init->WriteFifo;
286 #endif /* FSMC_BCR1_WFDIS */
287  btcr_reg |= Init->PageSize;
288 
289  mask = (FSMC_BCR1_MBKEN |
290  FSMC_BCR1_MUXEN |
291  FSMC_BCR1_MTYP |
292  FSMC_BCR1_MWID |
293  FSMC_BCR1_FACCEN |
294  FSMC_BCR1_BURSTEN |
295  FSMC_BCR1_WAITPOL |
296  FSMC_BCR1_WAITCFG |
297  FSMC_BCR1_WREN |
298  FSMC_BCR1_WAITEN |
299  FSMC_BCR1_EXTMOD |
300  FSMC_BCR1_ASYNCWAIT |
301  FSMC_BCR1_CBURSTRW);
302 
303 #if defined(FSMC_BCR1_WRAPMOD)
304  mask |= FSMC_BCR1_WRAPMOD;
305 #endif /* FSMC_BCR1_WRAPMOD */
306 #if defined(FSMC_BCR1_CCLKEN)
307  mask |= FSMC_BCR1_CCLKEN;
308 #endif
309 #if defined(FSMC_BCR1_WFDIS)
310  mask |= FSMC_BCR1_WFDIS;
311 #endif /* FSMC_BCR1_WFDIS */
312  mask |= FSMC_BCR1_CPSIZE;
313 
314  MODIFY_REG(Device->BTCR[Init->NSBank], mask, btcr_reg);
315 
316 #if defined(FSMC_BCR1_CCLKEN)
317  /* Configure synchronous mode when Continuous clock is enabled for bank2..4 */
318  if ((Init->ContinuousClock == FSMC_CONTINUOUS_CLOCK_SYNC_ASYNC) && (Init->NSBank != FSMC_NORSRAM_BANK1))
319  {
320  MODIFY_REG(Device->BTCR[FSMC_NORSRAM_BANK1], FSMC_BCR1_CCLKEN, Init->ContinuousClock);
321  }
322 #endif
323 #if defined(FSMC_BCR1_WFDIS)
324 
325  if (Init->NSBank != FSMC_NORSRAM_BANK1)
326  {
327  /* Configure Write FIFO mode when Write Fifo is enabled for bank2..4 */
328  SET_BIT(Device->BTCR[FSMC_NORSRAM_BANK1], (uint32_t)(Init->WriteFifo));
329  }
330 #endif /* FSMC_BCR1_WFDIS */
331 
332  return HAL_OK;
333 }
334 
342 HAL_StatusTypeDef FSMC_NORSRAM_DeInit(FSMC_NORSRAM_TypeDef *Device,
343  FSMC_NORSRAM_EXTENDED_TypeDef *ExDevice, uint32_t Bank)
344 {
345  /* Check the parameters */
346  assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
347  assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(ExDevice));
348  assert_param(IS_FSMC_NORSRAM_BANK(Bank));
349 
350  /* Disable the FSMC_NORSRAM device */
351  __FSMC_NORSRAM_DISABLE(Device, Bank);
352 
353  /* De-initialize the FSMC_NORSRAM device */
354  /* FSMC_NORSRAM_BANK1 */
355  if (Bank == FSMC_NORSRAM_BANK1)
356  {
357  Device->BTCR[Bank] = 0x000030DBU;
358  }
359  /* FSMC_NORSRAM_BANK2, FSMC_NORSRAM_BANK3 or FSMC_NORSRAM_BANK4 */
360  else
361  {
362  Device->BTCR[Bank] = 0x000030D2U;
363  }
364 
365  Device->BTCR[Bank + 1U] = 0x0FFFFFFFU;
366  ExDevice->BWTR[Bank] = 0x0FFFFFFFU;
367 
368  return HAL_OK;
369 }
370 
379 HAL_StatusTypeDef FSMC_NORSRAM_Timing_Init(FSMC_NORSRAM_TypeDef *Device,
380  FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank)
381 {
382 #if defined(FSMC_BCR1_CCLKEN)
383  uint32_t tmpr;
384 #endif
385 
386  /* Check the parameters */
387  assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
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));
392  assert_param(IS_FSMC_CLK_DIV(Timing->CLKDivision));
393  assert_param(IS_FSMC_DATA_LATENCY(Timing->DataLatency));
394  assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode));
395  assert_param(IS_FSMC_NORSRAM_BANK(Bank));
396 
397  /* Set FSMC_NORSRAM device timing parameters */
398  MODIFY_REG(Device->BTCR[Bank + 1U], BTR_CLEAR_MASK, (Timing->AddressSetupTime |
399  ((Timing->AddressHoldTime) << FSMC_BTR1_ADDHLD_Pos) |
400  ((Timing->DataSetupTime) << FSMC_BTR1_DATAST_Pos) |
401  ((Timing->BusTurnAroundDuration) << FSMC_BTR1_BUSTURN_Pos) |
402  (((Timing->CLKDivision) - 1U) << FSMC_BTR1_CLKDIV_Pos) |
403  (((Timing->DataLatency) - 2U) << FSMC_BTR1_DATLAT_Pos) |
404  (Timing->AccessMode)));
405 
406 #if defined(FSMC_BCR1_CCLKEN)
407  /* Configure Clock division value (in NORSRAM bank 1) when continuous clock is enabled */
408  if (HAL_IS_BIT_SET(Device->BTCR[FSMC_NORSRAM_BANK1], FSMC_BCR1_CCLKEN))
409  {
410  tmpr = (uint32_t)(Device->BTCR[FSMC_NORSRAM_BANK1 + 1U] & ~((0x0FU) << FSMC_BTR1_CLKDIV_Pos));
411  tmpr |= (uint32_t)(((Timing->CLKDivision) - 1U) << FSMC_BTR1_CLKDIV_Pos);
412  MODIFY_REG(Device->BTCR[FSMC_NORSRAM_BANK1 + 1U], FSMC_BTR1_CLKDIV, tmpr);
413  }
414 
415 #endif
416  return HAL_OK;
417 }
418 
431 HAL_StatusTypeDef FSMC_NORSRAM_Extended_Timing_Init(FSMC_NORSRAM_EXTENDED_TypeDef *Device,
432  FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank,
433  uint32_t ExtendedMode)
434 {
435  /* Check the parameters */
436  assert_param(IS_FSMC_EXTENDED_MODE(ExtendedMode));
437 
438  /* Set NORSRAM device timing register for write configuration, if extended mode is used */
439  if (ExtendedMode == FSMC_EXTENDED_MODE_ENABLE)
440  {
441  /* Check the parameters */
442  assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(Device));
443  assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime));
444  assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime));
445  assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime));
446  assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration));
447  assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode));
448  assert_param(IS_FSMC_NORSRAM_BANK(Bank));
449 
450  /* Set NORSRAM device timing register for write configuration, if extended mode is used */
451  MODIFY_REG(Device->BWTR[Bank], BWTR_CLEAR_MASK, (Timing->AddressSetupTime |
452  ((Timing->AddressHoldTime) << FSMC_BWTR1_ADDHLD_Pos) |
453  ((Timing->DataSetupTime) << FSMC_BWTR1_DATAST_Pos) |
454  Timing->AccessMode |
455  ((Timing->BusTurnAroundDuration) << FSMC_BWTR1_BUSTURN_Pos)));
456  }
457  else
458  {
459  Device->BWTR[Bank] = 0x0FFFFFFFU;
460  }
461 
462  return HAL_OK;
463 }
489 HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Enable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank)
490 {
491  /* Check the parameters */
492  assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
493  assert_param(IS_FSMC_NORSRAM_BANK(Bank));
494 
495  /* Enable write operation */
496  SET_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE);
497 
498  return HAL_OK;
499 }
500 
507 HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Disable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank)
508 {
509  /* Check the parameters */
510  assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
511  assert_param(IS_FSMC_NORSRAM_BANK(Bank));
512 
513  /* Disable write operation */
514  CLEAR_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE);
515 
516  return HAL_OK;
517 }
518 
526 #endif /* FSMC_Bank1 */
527 
528 #if defined(FSMC_Bank2_3)
529 
579 HAL_StatusTypeDef FSMC_NAND_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_InitTypeDef *Init)
580 {
581  /* Check the parameters */
582  assert_param(IS_FSMC_NAND_DEVICE(Device));
583  assert_param(IS_FSMC_NAND_BANK(Init->NandBank));
584  assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature));
585  assert_param(IS_FSMC_NAND_MEMORY_WIDTH(Init->MemoryDataWidth));
586  assert_param(IS_FSMC_ECC_STATE(Init->EccComputation));
587  assert_param(IS_FSMC_ECCPAGE_SIZE(Init->ECCPageSize));
588  assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime));
589  assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime));
590 
591  /* Set NAND device control parameters */
592  if (Init->NandBank == FSMC_NAND_BANK2)
593  {
594  /* NAND bank 2 registers configuration */
595  MODIFY_REG(Device->PCR2, PCR_CLEAR_MASK, (Init->Waitfeature |
596  FSMC_PCR_MEMORY_TYPE_NAND |
597  Init->MemoryDataWidth |
598  Init->EccComputation |
599  Init->ECCPageSize |
600  ((Init->TCLRSetupTime) << FSMC_PCR2_TCLR_Pos) |
601  ((Init->TARSetupTime) << FSMC_PCR2_TAR_Pos)));
602  }
603  else
604  {
605  /* NAND bank 3 registers configuration */
606  MODIFY_REG(Device->PCR3, PCR_CLEAR_MASK, (Init->Waitfeature |
607  FSMC_PCR_MEMORY_TYPE_NAND |
608  Init->MemoryDataWidth |
609  Init->EccComputation |
610  Init->ECCPageSize |
611  ((Init->TCLRSetupTime) << FSMC_PCR2_TCLR_Pos) |
612  ((Init->TARSetupTime) << FSMC_PCR2_TAR_Pos)));
613  }
614 
615  return HAL_OK;
616 }
617 
626 HAL_StatusTypeDef FSMC_NAND_CommonSpace_Timing_Init(FSMC_NAND_TypeDef *Device,
627  FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank)
628 {
629  /* Check the parameters */
630  assert_param(IS_FSMC_NAND_DEVICE(Device));
631  assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
632  assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
633  assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
634  assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
635  assert_param(IS_FSMC_NAND_BANK(Bank));
636 
637  /* Set FSMC_NAND device timing parameters */
638  if (Bank == FSMC_NAND_BANK2)
639  {
640  /* NAND bank 2 registers configuration */
641  MODIFY_REG(Device->PMEM2, PMEM_CLEAR_MASK, (Timing->SetupTime |
642  ((Timing->WaitSetupTime) << FSMC_PMEM2_MEMWAIT2_Pos) |
643  ((Timing->HoldSetupTime) << FSMC_PMEM2_MEMHOLD2_Pos) |
644  ((Timing->HiZSetupTime) << FSMC_PMEM2_MEMHIZ2_Pos)));
645  }
646  else
647  {
648  /* NAND bank 3 registers configuration */
649  MODIFY_REG(Device->PMEM3, PMEM_CLEAR_MASK, (Timing->SetupTime |
650  ((Timing->WaitSetupTime) << FSMC_PMEM2_MEMWAIT2_Pos) |
651  ((Timing->HoldSetupTime) << FSMC_PMEM2_MEMHOLD2_Pos) |
652  ((Timing->HiZSetupTime) << FSMC_PMEM2_MEMHIZ2_Pos)));
653  }
654 
655  return HAL_OK;
656 }
657 
666 HAL_StatusTypeDef FSMC_NAND_AttributeSpace_Timing_Init(FSMC_NAND_TypeDef *Device,
667  FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank)
668 {
669  /* Check the parameters */
670  assert_param(IS_FSMC_NAND_DEVICE(Device));
671  assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
672  assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
673  assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
674  assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
675  assert_param(IS_FSMC_NAND_BANK(Bank));
676 
677  /* Set FSMC_NAND device timing parameters */
678  if (Bank == FSMC_NAND_BANK2)
679  {
680  /* NAND bank 2 registers configuration */
681  MODIFY_REG(Device->PATT2, PATT_CLEAR_MASK, (Timing->SetupTime |
682  ((Timing->WaitSetupTime) << FSMC_PATT2_ATTWAIT2_Pos) |
683  ((Timing->HoldSetupTime) << FSMC_PATT2_ATTHOLD2_Pos) |
684  ((Timing->HiZSetupTime) << FSMC_PATT2_ATTHIZ2_Pos)));
685  }
686  else
687  {
688  /* NAND bank 3 registers configuration */
689  MODIFY_REG(Device->PATT3, PATT_CLEAR_MASK, (Timing->SetupTime |
690  ((Timing->WaitSetupTime) << FSMC_PATT2_ATTWAIT2_Pos) |
691  ((Timing->HoldSetupTime) << FSMC_PATT2_ATTHOLD2_Pos) |
692  ((Timing->HiZSetupTime) << FSMC_PATT2_ATTHIZ2_Pos)));
693  }
694 
695  return HAL_OK;
696 }
697 
704 HAL_StatusTypeDef FSMC_NAND_DeInit(FSMC_NAND_TypeDef *Device, uint32_t Bank)
705 {
706  /* Check the parameters */
707  assert_param(IS_FSMC_NAND_DEVICE(Device));
708  assert_param(IS_FSMC_NAND_BANK(Bank));
709 
710  /* Disable the NAND Bank */
711  __FSMC_NAND_DISABLE(Device, Bank);
712 
713  /* De-initialize the NAND Bank */
714  if (Bank == FSMC_NAND_BANK2)
715  {
716  /* Set the FSMC_NAND_BANK2 registers to their reset values */
717  WRITE_REG(Device->PCR2, 0x00000018U);
718  WRITE_REG(Device->SR2, 0x00000040U);
719  WRITE_REG(Device->PMEM2, 0xFCFCFCFCU);
720  WRITE_REG(Device->PATT2, 0xFCFCFCFCU);
721  }
722  /* FSMC_Bank3_NAND */
723  else
724  {
725  /* Set the FSMC_NAND_BANK3 registers to their reset values */
726  WRITE_REG(Device->PCR3, 0x00000018U);
727  WRITE_REG(Device->SR3, 0x00000040U);
728  WRITE_REG(Device->PMEM3, 0xFCFCFCFCU);
729  WRITE_REG(Device->PATT3, 0xFCFCFCFCU);
730  }
731 
732  return HAL_OK;
733 }
734 
761 HAL_StatusTypeDef FSMC_NAND_ECC_Enable(FSMC_NAND_TypeDef *Device, uint32_t Bank)
762 {
763  /* Check the parameters */
764  assert_param(IS_FSMC_NAND_DEVICE(Device));
765  assert_param(IS_FSMC_NAND_BANK(Bank));
766 
767  /* Enable ECC feature */
768  if (Bank == FSMC_NAND_BANK2)
769  {
770  SET_BIT(Device->PCR2, FSMC_PCR2_ECCEN);
771  }
772  else
773  {
774  SET_BIT(Device->PCR3, FSMC_PCR2_ECCEN);
775  }
776 
777  return HAL_OK;
778 }
779 
780 
787 HAL_StatusTypeDef FSMC_NAND_ECC_Disable(FSMC_NAND_TypeDef *Device, uint32_t Bank)
788 {
789  /* Check the parameters */
790  assert_param(IS_FSMC_NAND_DEVICE(Device));
791  assert_param(IS_FSMC_NAND_BANK(Bank));
792 
793  /* Disable ECC feature */
794  if (Bank == FSMC_NAND_BANK2)
795  {
796  CLEAR_BIT(Device->PCR2, FSMC_PCR2_ECCEN);
797  }
798  else
799  {
800  CLEAR_BIT(Device->PCR3, FSMC_PCR2_ECCEN);
801  }
802 
803  return HAL_OK;
804 }
805 
814 HAL_StatusTypeDef FSMC_NAND_GetECC(FSMC_NAND_TypeDef *Device, uint32_t *ECCval, uint32_t Bank,
815  uint32_t Timeout)
816 {
817  uint32_t tickstart;
818 
819  /* Check the parameters */
820  assert_param(IS_FSMC_NAND_DEVICE(Device));
821  assert_param(IS_FSMC_NAND_BANK(Bank));
822 
823  /* Get tick */
824  tickstart = HAL_GetTick();
825 
826  /* Wait until FIFO is empty */
827  while (__FSMC_NAND_GET_FLAG(Device, Bank, FSMC_FLAG_FEMPT) == RESET)
828  {
829  /* Check for the Timeout */
830  if (Timeout != HAL_MAX_DELAY)
831  {
832  if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
833  {
834  return HAL_TIMEOUT;
835  }
836  }
837  }
838 
839  if (Bank == FSMC_NAND_BANK2)
840  {
841  /* Get the ECCR2 register value */
842  *ECCval = (uint32_t)Device->ECCR2;
843  }
844  else
845  {
846  /* Get the ECCR3 register value */
847  *ECCval = (uint32_t)Device->ECCR3;
848  }
849 
850  return HAL_OK;
851 }
852 
856 #endif /* FSMC_Bank2_3 */
857 
858 #if defined(FSMC_Bank4)
859 
907 HAL_StatusTypeDef FSMC_PCCARD_Init(FSMC_PCCARD_TypeDef *Device, FSMC_PCCARD_InitTypeDef *Init)
908 {
909  /* Check the parameters */
910  assert_param(IS_FSMC_PCCARD_DEVICE(Device));
911 #if defined(FSMC_Bank2_3)
912  assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature));
913  assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime));
914  assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime));
915 #endif /* FSMC_Bank2_3 */
916 
917  /* Set FSMC_PCCARD device control parameters */
918  MODIFY_REG(Device->PCR4,
919  (FSMC_PCR4_PTYP |
920  FSMC_PCR4_PWAITEN |
921  FSMC_PCR4_PWID |
922  FSMC_PCR4_TCLR |
923  FSMC_PCR4_TAR),
924  (FSMC_PCR_MEMORY_TYPE_PCCARD |
925  Init->Waitfeature |
926  FSMC_NAND_PCC_MEM_BUS_WIDTH_16 |
927  (Init->TCLRSetupTime << FSMC_PCR4_TCLR_Pos) |
928  (Init->TARSetupTime << FSMC_PCR4_TAR_Pos)));
929 
930  return HAL_OK;
931 }
932 
940 HAL_StatusTypeDef FSMC_PCCARD_CommonSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device,
942 {
943  /* Check the parameters */
944  assert_param(IS_FSMC_PCCARD_DEVICE(Device));
945 #if defined(FSMC_Bank2_3)
946  assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
947  assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
948  assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
949  assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
950 #endif /* FSMC_Bank2_3 */
951 
952  /* Set PCCARD timing parameters */
953  MODIFY_REG(Device->PMEM4, PMEM4_CLEAR_MASK,
954  (Timing->SetupTime |
955  ((Timing->WaitSetupTime) << FSMC_PMEM4_MEMWAIT4_Pos) |
956  ((Timing->HoldSetupTime) << FSMC_PMEM4_MEMHOLD4_Pos) |
957  ((Timing->HiZSetupTime) << FSMC_PMEM4_MEMHIZ4_Pos)));
958 
959  return HAL_OK;
960 }
961 
969 HAL_StatusTypeDef FSMC_PCCARD_AttributeSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device,
971 {
972  /* Check the parameters */
973  assert_param(IS_FSMC_PCCARD_DEVICE(Device));
974 #if defined(FSMC_Bank2_3)
975  assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
976  assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
977  assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
978  assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
979 #endif /* FSMC_Bank2_3 */
980 
981  /* Set PCCARD timing parameters */
982  MODIFY_REG(Device->PATT4, PATT4_CLEAR_MASK,
983  (Timing->SetupTime |
984  ((Timing->WaitSetupTime) << FSMC_PATT4_ATTWAIT4_Pos) |
985  ((Timing->HoldSetupTime) << FSMC_PATT4_ATTHOLD4_Pos) |
986  ((Timing->HiZSetupTime) << FSMC_PATT4_ATTHIZ4_Pos)));
987 
988  return HAL_OK;
989 }
990 
998 HAL_StatusTypeDef FSMC_PCCARD_IOSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device,
1000 {
1001  /* Check the parameters */
1002  assert_param(IS_FSMC_PCCARD_DEVICE(Device));
1003 #if defined(FSMC_Bank2_3)
1004  assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
1005  assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
1006  assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
1007  assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
1008 #endif /* FSMC_Bank2_3 */
1009 
1010  /* Set FSMC_PCCARD device timing parameters */
1011  MODIFY_REG(Device->PIO4, PIO4_CLEAR_MASK,
1012  (Timing->SetupTime |
1013  (Timing->WaitSetupTime << FSMC_PIO4_IOWAIT4_Pos) |
1014  (Timing->HoldSetupTime << FSMC_PIO4_IOHOLD4_Pos) |
1015  (Timing->HiZSetupTime << FSMC_PIO4_IOHIZ4_Pos)));
1016 
1017  return HAL_OK;
1018 }
1019 
1025 HAL_StatusTypeDef FSMC_PCCARD_DeInit(FSMC_PCCARD_TypeDef *Device)
1026 {
1027  /* Check the parameters */
1028  assert_param(IS_FSMC_PCCARD_DEVICE(Device));
1029 
1030  /* Disable the FSMC_PCCARD device */
1031  __FSMC_PCCARD_DISABLE(Device);
1032 
1033  /* De-initialize the FSMC_PCCARD device */
1034  Device->PCR4 = 0x00000018U;
1035  Device->SR4 = 0x00000040U;
1036  Device->PMEM4 = 0xFCFCFCFCU;
1037  Device->PATT4 = 0xFCFCFCFCU;
1038  Device->PIO4 = 0xFCFCFCFCU;
1039 
1040  return HAL_OK;
1041 }
1042 
1046 #endif /* FSMC_Bank4 */
1047 
1048 
1057 #endif /* HAL_NOR_MODULE_ENABLED */
FSMC NAND Configuration Structure definition.
FSMC NAND Timing parameters structure definition.
FSMC NORSRAM Configuration Structure definition.
FSMC NORSRAM Timing parameters structure definition.
FSMC PCCARD Configuration Structure definition.
HAL_StatusTypeDef FSMC_NAND_AttributeSpace_Timing_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank)
Initializes the FSMC_NAND Attribute space Timing according to the specified parameters in the FSMC_NA...
HAL_StatusTypeDef FSMC_NAND_DeInit(FSMC_NAND_TypeDef *Device, uint32_t Bank)
DeInitializes the FSMC_NAND device.
HAL_StatusTypeDef FSMC_NAND_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_InitTypeDef *Init)
Initializes the FSMC_NAND device according to the specified control parameters in the FSMC_NAND_Handl...
HAL_StatusTypeDef FSMC_NAND_CommonSpace_Timing_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank)
Initializes the FSMC_NAND Common space Timing according to the specified parameters in the FSMC_NAND_...
HAL_StatusTypeDef FSMC_NORSRAM_Init(FSMC_NORSRAM_TypeDef *Device, FSMC_NORSRAM_InitTypeDef *Init)
Initialize the FSMC_NORSRAM device according to the specified control parameters in the FSMC_NORSRAM_...
HAL_StatusTypeDef FSMC_NORSRAM_Extended_Timing_Init(FSMC_NORSRAM_EXTENDED_TypeDef *Device, FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank, uint32_t ExtendedMode)
Initialize the FSMC_NORSRAM Extended mode Timing according to the specified parameters in the FSMC_NO...
HAL_StatusTypeDef FSMC_NORSRAM_DeInit(FSMC_NORSRAM_TypeDef *Device, FSMC_NORSRAM_EXTENDED_TypeDef *ExDevice, uint32_t Bank)
DeInitialize the FSMC_NORSRAM peripheral.
HAL_StatusTypeDef FSMC_NORSRAM_Timing_Init(FSMC_NORSRAM_TypeDef *Device, FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank)
Initialize the FSMC_NORSRAM Timing according to the specified parameters in the FSMC_NORSRAM_TimingTy...
HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Enable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank)
Enables dynamically FSMC_NORSRAM write operation.
HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Disable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank)
Disables dynamically FSMC_NORSRAM write operation.
HAL_StatusTypeDef FSMC_PCCARD_DeInit(FSMC_PCCARD_TypeDef *Device)
DeInitializes the FSMC_PCCARD device.
HAL_StatusTypeDef FSMC_PCCARD_Init(FSMC_PCCARD_TypeDef *Device, FSMC_PCCARD_InitTypeDef *Init)
Initializes the FSMC_PCCARD device according to the specified control parameters in the FSMC_PCCARD_H...
HAL_StatusTypeDef FSMC_PCCARD_IOSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing)
Initializes the FSMC_PCCARD IO space Timing according to the specified parameters in the FSMC_NAND_PC...
HAL_StatusTypeDef FSMC_PCCARD_AttributeSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing)
Initializes the FSMC_PCCARD Attribute space Timing according to the specified parameters in the FSMC_...
HAL_StatusTypeDef FSMC_PCCARD_CommonSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing)
Initializes the FSMC_PCCARD Common space Timing according to the specified parameters in the FSMC_NAN...
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
HAL_StatusTypeDef FSMC_NAND_ECC_Enable(FSMC_NAND_TypeDef *Device, uint32_t Bank)
Enables dynamically FSMC_NAND ECC feature.
HAL_StatusTypeDef FSMC_NAND_ECC_Disable(FSMC_NAND_TypeDef *Device, uint32_t Bank)
Disables dynamically FSMC_NAND ECC feature.
HAL_StatusTypeDef FSMC_NAND_GetECC(FSMC_NAND_TypeDef *Device, uint32_t *ECCval, uint32_t Bank, uint32_t Timeout)
Disables dynamically FSMC_NAND ECC feature.
This file contains all the functions prototypes for the HAL module driver.