2 ******************************************************************************
3 * @file stm32f4xx_ll_fsmc.c
4 * @author MCD Application Team
7 * @brief FSMC Low Layer HAL module driver.
9 * This file provides firmware functions to manage the following
10 * functionalities of the Flexible Static Memory Controller (FSMC) peripheral memories:
11 * + Initialization/de-initialization functions
12 * + Peripheral Control functions
13 * + Peripheral State functions
16 ==============================================================================
17 ##### FSMC peripheral features #####
18 ==============================================================================
19 [..] The Flexible static memory controller (FSMC) includes two memory controllers:
20 (+) The NOR/PSRAM memory controller
21 (+) The NAND/PC Card memory controller
23 [..] The FSMC functional block makes the interface with synchronous and asynchronous static
24 memories, SDRAM memories, and 16-bit PC memory cards. Its main purposes are:
25 (+) to translate AHB transactions into the appropriate external device protocol.
26 (+) to meet the access time requirements of the external memory devices.
28 [..] All external memories share the addresses, data and control signals with the controller.
29 Each external device is accessed by means of a unique Chip Select. The FSMC performs
30 only one access at a time to an external device.
31 The main features of the FSMC controller are the following:
32 (+) Interface with static-memory mapped devices including:
33 (++) Static random access memory (SRAM).
34 (++) Read-only memory (ROM).
35 (++) NOR Flash memory/OneNAND Flash memory.
36 (++) PSRAM (4 memory banks).
37 (++) 16-bit PC Card compatible devices.
38 (++) Two banks of NAND Flash memory with ECC hardware to check up to 8 Kbytes of
40 (+) Independent Chip Select control for each memory bank.
41 (+) Independent configuration for each memory bank.
44 ******************************************************************************
47 * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
49 * Redistribution and use in source and binary forms, with or without modification,
50 * are permitted provided that the following conditions are met:
51 * 1. Redistributions of source code must retain the above copyright notice,
52 * this list of conditions and the following disclaimer.
53 * 2. Redistributions in binary form must reproduce the above copyright notice,
54 * this list of conditions and the following disclaimer in the documentation
55 * and/or other materials provided with the distribution.
56 * 3. Neither the name of STMicroelectronics nor the names of its contributors
57 * may be used to endorse or promote products derived from this software
58 * without specific prior written permission.
60 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
61 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
62 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
63 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
64 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
65 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
66 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
67 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
68 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
69 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
71 ******************************************************************************
74 /* Includes ------------------------------------------------------------------*/
75 #include "stm32f4xx_hal.h"
77 /** @addtogroup STM32F4xx_HAL_Driver
82 * @brief FSMC driver modules
86 #if defined (HAL_SRAM_MODULE_ENABLED) || defined(HAL_NOR_MODULE_ENABLED) || defined(HAL_NAND_MODULE_ENABLED) || defined(HAL_PCCARD_MODULE_ENABLED)
88 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)
90 /* Private typedef -----------------------------------------------------------*/
91 /* Private define ------------------------------------------------------------*/
92 /* Private macro -------------------------------------------------------------*/
93 /* Private variables ---------------------------------------------------------*/
94 /* Private function prototypes -----------------------------------------------*/
95 /* Private functions ---------------------------------------------------------*/
97 /** @defgroup FSMC_Private_Functions
101 /** @defgroup FSMC_NORSRAM Controller functions
102 * @brief NORSRAM Controller functions
105 ==============================================================================
106 ##### How to use NORSRAM device driver #####
107 ==============================================================================
110 This driver contains a set of APIs to interface with the FSMC NORSRAM banks in order
111 to run the NORSRAM external devices.
113 (+) FSMC NORSRAM bank reset using the function FSMC_NORSRAM_DeInit()
114 (+) FSMC NORSRAM bank control configuration using the function FSMC_NORSRAM_Init()
115 (+) FSMC NORSRAM bank timing configuration using the function FSMC_NORSRAM_Timing_Init()
116 (+) FSMC NORSRAM bank extended timing configuration using the function
117 FSMC_NORSRAM_Extended_Timing_Init()
118 (+) FSMC NORSRAM bank enable/disable write operation using the functions
119 FSMC_NORSRAM_WriteOperation_Enable()/FSMC_NORSRAM_WriteOperation_Disable()
125 /** @defgroup HAL_FSMC_NORSRAM_Group1 Initialization/de-initialization functions
126 * @brief Initialization and Configuration functions
129 ==============================================================================
130 ##### Initialization and de_initialization functions #####
131 ==============================================================================
133 This section provides functions allowing to:
134 (+) Initialize and configure the FSMC NORSRAM interface
135 (+) De-initialize the FSMC NORSRAM interface
136 (+) Configure the FSMC clock and associated GPIOs
143 * @brief Initialize the FSMC_NORSRAM device according to the specified
144 * control parameters in the FSMC_NORSRAM_InitTypeDef
145 * @param Device: Pointer to NORSRAM device instance
146 * @param Init: Pointer to NORSRAM Initialization structure
149 HAL_StatusTypeDef
FSMC_NORSRAM_Init(FSMC_NORSRAM_TypeDef
*Device
, FSMC_NORSRAM_InitTypeDef
* Init
)
153 /* Check the parameters */
154 assert_param(IS_FSMC_NORSRAM_BANK(Init
->NSBank
));
155 assert_param(IS_FSMC_MUX(Init
->DataAddressMux
));
156 assert_param(IS_FSMC_MEMORY(Init
->MemoryType
));
157 assert_param(IS_FSMC_NORSRAM_MEMORY_WIDTH(Init
->MemoryDataWidth
));
158 assert_param(IS_FSMC_BURSTMODE(Init
->BurstAccessMode
));
159 assert_param(IS_FSMC_WAIT_POLARITY(Init
->WaitSignalPolarity
));
160 assert_param(IS_FSMC_WRAP_MODE(Init
->WrapMode
));
161 assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(Init
->WaitSignalActive
));
162 assert_param(IS_FSMC_WRITE_OPERATION(Init
->WriteOperation
));
163 assert_param(IS_FSMC_WAITE_SIGNAL(Init
->WaitSignal
));
164 assert_param(IS_FSMC_EXTENDED_MODE(Init
->ExtendedMode
));
165 assert_param(IS_FSMC_ASYNWAIT(Init
->AsynchronousWait
));
166 assert_param(IS_FSMC_WRITE_BURST(Init
->WriteBurst
));
168 /* Set NORSRAM device control parameters */
169 tmpr
= (uint32_t)(Init
->DataAddressMux
|\
171 Init
->MemoryDataWidth
|\
172 Init
->BurstAccessMode
|\
173 Init
->WaitSignalPolarity
|\
175 Init
->WaitSignalActive
|\
176 Init
->WriteOperation
|\
178 Init
->ExtendedMode
|\
179 Init
->AsynchronousWait
|\
183 if(Init
->MemoryType
== FSMC_MEMORY_TYPE_NOR
)
185 tmpr
|= (uint32_t)FSMC_NORSRAM_FLASH_ACCESS_ENABLE
;
188 Device
->BTCR
[Init
->NSBank
] = tmpr
;
195 * @brief DeInitialize the FSMC_NORSRAM peripheral
196 * @param Device: Pointer to NORSRAM device instance
197 * @param ExDevice: Pointer to NORSRAM extended mode device instance
198 * @param Bank: NORSRAM bank number
201 HAL_StatusTypeDef
FSMC_NORSRAM_DeInit(FSMC_NORSRAM_TypeDef
*Device
, FSMC_NORSRAM_EXTENDED_TypeDef
*ExDevice
, uint32_t Bank
)
203 /* Check the parameters */
204 assert_param(IS_FSMC_NORSRAM_DEVICE(Device
));
205 assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(ExDevice
));
207 /* Disable the FSMC_NORSRAM device */
208 __FSMC_NORSRAM_DISABLE(Device
, Bank
);
210 /* De-initialize the FSMC_NORSRAM device */
211 /* FSMC_NORSRAM_BANK1 */
212 if(Bank
== FSMC_NORSRAM_BANK1
)
214 Device
->BTCR
[Bank
] = 0x000030DB;
216 /* FSMC_NORSRAM_BANK2, FSMC_NORSRAM_BANK3 or FSMC_NORSRAM_BANK4 */
219 Device
->BTCR
[Bank
] = 0x000030D2;
222 Device
->BTCR
[Bank
+ 1] = 0x0FFFFFFF;
223 ExDevice
->BWTR
[Bank
] = 0x0FFFFFFF;
230 * @brief Initialize the FSMC_NORSRAM Timing according to the specified
231 * parameters in the FSMC_NORSRAM_TimingTypeDef
232 * @param Device: Pointer to NORSRAM device instance
233 * @param Timing: Pointer to NORSRAM Timing structure
234 * @param Bank: NORSRAM bank number
237 HAL_StatusTypeDef
FSMC_NORSRAM_Timing_Init(FSMC_NORSRAM_TypeDef
*Device
, FSMC_NORSRAM_TimingTypeDef
*Timing
, uint32_t Bank
)
241 /* Check the parameters */
242 assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing
->AddressSetupTime
));
243 assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing
->AddressHoldTime
));
244 assert_param(IS_FSMC_DATASETUP_TIME(Timing
->DataSetupTime
));
245 assert_param(IS_FSMC_TURNAROUND_TIME(Timing
->BusTurnAroundDuration
));
246 assert_param(IS_FSMC_CLK_DIV(Timing
->CLKDivision
));
247 assert_param(IS_FSMC_DATA_LATENCY(Timing
->DataLatency
));
248 assert_param(IS_FSMC_ACCESS_MODE(Timing
->AccessMode
));
250 /* Set FSMC_NORSRAM device timing parameters */
251 tmpr
= (uint32_t)(Timing
->AddressSetupTime
|\
252 ((Timing
->AddressHoldTime
) << 4) |\
253 ((Timing
->DataSetupTime
) << 8) |\
254 ((Timing
->BusTurnAroundDuration
) << 16) |\
255 (((Timing
->CLKDivision
)-1) << 20) |\
256 (((Timing
->DataLatency
)-2) << 24) |\
260 Device
->BTCR
[Bank
+ 1] = tmpr
;
266 * @brief Initialize the FSMC_NORSRAM Extended mode Timing according to the specified
267 * parameters in the FSMC_NORSRAM_TimingTypeDef
268 * @param Device: Pointer to NORSRAM device instance
269 * @param Timing: Pointer to NORSRAM Timing structure
270 * @param Bank: NORSRAM bank number
273 HAL_StatusTypeDef
FSMC_NORSRAM_Extended_Timing_Init(FSMC_NORSRAM_EXTENDED_TypeDef
*Device
, FSMC_NORSRAM_TimingTypeDef
*Timing
, uint32_t Bank
, uint32_t ExtendedMode
)
275 /* Set NORSRAM device timing register for write configuration, if extended mode is used */
276 if(ExtendedMode
== FSMC_EXTENDED_MODE_ENABLE
)
278 /* Check the parameters */
279 assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing
->AddressSetupTime
));
280 assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing
->AddressHoldTime
));
281 assert_param(IS_FSMC_DATASETUP_TIME(Timing
->DataSetupTime
));
282 assert_param(IS_FSMC_TURNAROUND_TIME(Timing
->BusTurnAroundDuration
));
283 assert_param(IS_FSMC_CLK_DIV(Timing
->CLKDivision
));
284 assert_param(IS_FSMC_DATA_LATENCY(Timing
->DataLatency
));
285 assert_param(IS_FSMC_ACCESS_MODE(Timing
->AccessMode
));
287 Device
->BWTR
[Bank
] = (uint32_t)(Timing
->AddressSetupTime
|\
288 ((Timing
->AddressHoldTime
) << 4) |\
289 ((Timing
->DataSetupTime
) << 8) |\
290 ((Timing
->BusTurnAroundDuration
) << 16) |\
291 (((Timing
->CLKDivision
)-1) << 20) |\
292 (((Timing
->DataLatency
)-2) << 24) |\
293 (Timing
->AccessMode
));
297 Device
->BWTR
[Bank
] = 0x0FFFFFFF;
309 /** @defgroup HAL_FSMC_NORSRAM_Group3 Control functions
310 * @brief management functions
313 ==============================================================================
314 ##### FSMC_NORSRAM Control functions #####
315 ==============================================================================
317 This subsection provides a set of functions allowing to control dynamically
318 the FSMC NORSRAM interface.
325 * @brief Enables dynamically FSMC_NORSRAM write operation.
326 * @param Device: Pointer to NORSRAM device instance
327 * @param Bank: NORSRAM bank number
330 HAL_StatusTypeDef
FSMC_NORSRAM_WriteOperation_Enable(FSMC_NORSRAM_TypeDef
*Device
, uint32_t Bank
)
332 /* Enable write operation */
333 Device
->BTCR
[Bank
] |= FSMC_WRITE_OPERATION_ENABLE
;
339 * @brief Disables dynamically FSMC_NORSRAM write operation.
340 * @param Device: Pointer to NORSRAM device instance
341 * @param Bank: NORSRAM bank number
344 HAL_StatusTypeDef
FSMC_NORSRAM_WriteOperation_Disable(FSMC_NORSRAM_TypeDef
*Device
, uint32_t Bank
)
346 /* Disable write operation */
347 Device
->BTCR
[Bank
] &= ~FSMC_WRITE_OPERATION_ENABLE
;
360 /** @defgroup FSMC_PCCARD Controller functions
361 * @brief PCCARD Controller functions
364 ==============================================================================
365 ##### How to use NAND device driver #####
366 ==============================================================================
368 This driver contains a set of APIs to interface with the FSMC NAND banks in order
369 to run the NAND external devices.
371 (+) FSMC NAND bank reset using the function FSMC_NAND_DeInit()
372 (+) FSMC NAND bank control configuration using the function FSMC_NAND_Init()
373 (+) FSMC NAND bank common space timing configuration using the function
374 FSMC_NAND_CommonSpace_Timing_Init()
375 (+) FSMC NAND bank attribute space timing configuration using the function
376 FSMC_NAND_AttributeSpace_Timing_Init()
377 (+) FSMC NAND bank enable/disable ECC correction feature using the functions
378 FSMC_NAND_ECC_Enable()/FSMC_NAND_ECC_Disable()
379 (+) FSMC NAND bank get ECC correction code using the function FSMC_NAND_GetECC()
385 /** @defgroup HAL_FSMC_NAND_Group1 Initialization/de-initialization functions
386 * @brief Initialization and Configuration functions
389 ==============================================================================
390 ##### Initialization and de_initialization functions #####
391 ==============================================================================
393 This section provides functions allowing to:
394 (+) Initialize and configure the FSMC NAND interface
395 (+) De-initialize the FSMC NAND interface
396 (+) Configure the FSMC clock and associated GPIOs
403 * @brief Initializes the FSMC_NAND device according to the specified
404 * control parameters in the FSMC_NAND_HandleTypeDef
405 * @param Device: Pointer to NAND device instance
406 * @param Init: Pointer to NAND Initialization structure
409 HAL_StatusTypeDef
FSMC_NAND_Init(FSMC_NAND_TypeDef
*Device
, FSMC_NAND_InitTypeDef
*Init
)
413 /* Check the parameters */
414 assert_param(IS_FSMC_NAND_BANK(Init
->NandBank
));
415 assert_param(IS_FSMC_WAIT_FEATURE(Init
->Waitfeature
));
416 assert_param(IS_FSMC_NAND_MEMORY_WIDTH(Init
->MemoryDataWidth
));
417 assert_param(IS_FSMC_ECC_STATE(Init
->EccComputation
));
418 assert_param(IS_FSMC_ECCPAGE_SIZE(Init
->ECCPageSize
));
419 assert_param(IS_FSMC_TCLR_TIME(Init
->TCLRSetupTime
));
420 assert_param(IS_FSMC_TAR_TIME(Init
->TARSetupTime
));
422 /* Set NAND device control parameters */
423 tmppcr
= (uint32_t)(Init
->Waitfeature
|\
424 FSMC_PCR_MEMORY_TYPE_NAND
|\
425 Init
->MemoryDataWidth
|\
426 Init
->EccComputation
|\
428 ((Init
->TCLRSetupTime
) << 9) |\
429 ((Init
->TARSetupTime
) << 13)
432 if(Init
->NandBank
== FSMC_NAND_BANK2
)
434 /* NAND bank 2 registers configuration */
435 Device
->PCR2
= tmppcr
;
439 /* NAND bank 3 registers configuration */
440 Device
->PCR3
= tmppcr
;
448 * @brief Initializes the FSMC_NAND Common space Timing according to the specified
449 * parameters in the FSMC_NAND_PCC_TimingTypeDef
450 * @param Device: Pointer to NAND device instance
451 * @param Timing: Pointer to NAND timing structure
452 * @param Bank: NAND bank number
455 HAL_StatusTypeDef
FSMC_NAND_CommonSpace_Timing_Init(FSMC_NAND_TypeDef
*Device
, FSMC_NAND_PCC_TimingTypeDef
*Timing
, uint32_t Bank
)
457 uint32_t tmppmem
= 0;
459 /* Check the parameters */
460 assert_param(IS_FSMC_SETUP_TIME(Timing
->SetupTime
));
461 assert_param(IS_FSMC_WAIT_TIME(Timing
->WaitSetupTime
));
462 assert_param(IS_FSMC_HOLD_TIME(Timing
->HoldSetupTime
));
463 assert_param(IS_FSMC_HIZ_TIME(Timing
->HiZSetupTime
));
465 /* Set FSMC_NAND device timing parameters */
466 tmppmem
= (uint32_t)(Timing
->SetupTime
|\
467 ((Timing
->WaitSetupTime
) << 8) |\
468 ((Timing
->HoldSetupTime
) << 16) |\
469 ((Timing
->HiZSetupTime
) << 24)
472 if(Bank
== FSMC_NAND_BANK2
)
474 /* NAND bank 2 registers configuration */
475 Device
->PMEM2
= tmppmem
;
479 /* NAND bank 3 registers configuration */
480 Device
->PMEM3
= tmppmem
;
487 * @brief Initializes the FSMC_NAND Attribute space Timing according to the specified
488 * parameters in the FSMC_NAND_PCC_TimingTypeDef
489 * @param Device: Pointer to NAND device instance
490 * @param Timing: Pointer to NAND timing structure
491 * @param Bank: NAND bank number
494 HAL_StatusTypeDef
FSMC_NAND_AttributeSpace_Timing_Init(FSMC_NAND_TypeDef
*Device
, FSMC_NAND_PCC_TimingTypeDef
*Timing
, uint32_t Bank
)
496 uint32_t tmppatt
= 0;
498 /* Check the parameters */
499 assert_param(IS_FSMC_SETUP_TIME(Timing
->SetupTime
));
500 assert_param(IS_FSMC_WAIT_TIME(Timing
->WaitSetupTime
));
501 assert_param(IS_FSMC_HOLD_TIME(Timing
->HoldSetupTime
));
502 assert_param(IS_FSMC_HIZ_TIME(Timing
->HiZSetupTime
));
504 /* Set FSMC_NAND device timing parameters */
505 tmppatt
= (uint32_t)(Timing
->SetupTime
|\
506 ((Timing
->WaitSetupTime
) << 8) |\
507 ((Timing
->HoldSetupTime
) << 16) |\
508 ((Timing
->HiZSetupTime
) << 24)
511 if(Bank
== FSMC_NAND_BANK2
)
513 /* NAND bank 2 registers configuration */
514 Device
->PATT2
= tmppatt
;
518 /* NAND bank 3 registers configuration */
519 Device
->PATT3
= tmppatt
;
527 * @brief DeInitializes the FSMC_NAND device
528 * @param Device: Pointer to NAND device instance
529 * @param Bank: NAND bank number
532 HAL_StatusTypeDef
FSMC_NAND_DeInit(FSMC_NAND_TypeDef
*Device
, uint32_t Bank
)
534 /* Disable the NAND Bank */
535 __FSMC_NAND_DISABLE(Device
, Bank
);
537 /* De-initialize the NAND Bank */
538 if(Bank
== FSMC_NAND_BANK2
)
540 /* Set the FSMC_NAND_BANK2 registers to their reset values */
541 Device
->PCR2
= 0x00000018;
542 Device
->SR2
= 0x00000040;
543 Device
->PMEM2
= 0xFCFCFCFC;
544 Device
->PATT2
= 0xFCFCFCFC;
546 /* FSMC_Bank3_NAND */
549 /* Set the FSMC_NAND_BANK3 registers to their reset values */
550 Device
->PCR3
= 0x00000018;
551 Device
->SR3
= 0x00000040;
552 Device
->PMEM3
= 0xFCFCFCFC;
553 Device
->PATT3
= 0xFCFCFCFC;
564 /** @defgroup HAL_FSMC_NAND_Group3 Control functions
565 * @brief management functions
568 ==============================================================================
569 ##### FSMC_NAND Control functions #####
570 ==============================================================================
572 This subsection provides a set of functions allowing to control dynamically
573 the FSMC NAND interface.
581 * @brief Enables dynamically FSMC_NAND ECC feature.
582 * @param Device: Pointer to NAND device instance
583 * @param Bank: NAND bank number
586 HAL_StatusTypeDef
FSMC_NAND_ECC_Enable(FSMC_NAND_TypeDef
*Device
, uint32_t Bank
)
588 /* Enable ECC feature */
589 if(Bank
== FSMC_NAND_BANK2
)
591 Device
->PCR2
|= FSMC_PCR2_ECCEN
;
595 Device
->PCR3
|= FSMC_PCR3_ECCEN
;
603 * @brief Disables dynamically FSMC_NAND ECC feature.
604 * @param Device: Pointer to NAND device instance
605 * @param Bank: NAND bank number
608 HAL_StatusTypeDef
FSMC_NAND_ECC_Disable(FSMC_NAND_TypeDef
*Device
, uint32_t Bank
)
610 /* Disable ECC feature */
611 if(Bank
== FSMC_NAND_BANK2
)
613 Device
->PCR2
&= ~FSMC_PCR2_ECCEN
;
617 Device
->PCR3
&= ~FSMC_PCR3_ECCEN
;
624 * @brief Disables dynamically FSMC_NAND ECC feature.
625 * @param Device: Pointer to NAND device instance
626 * @param ECCval: Pointer to ECC value
627 * @param Bank: NAND bank number
628 * @param Timeout: Timeout wait value
631 HAL_StatusTypeDef
FSMC_NAND_GetECC(FSMC_NAND_TypeDef
*Device
, uint32_t *ECCval
, uint32_t Bank
, uint32_t Timeout
)
633 uint32_t tickstart
= 0;
635 /* Check the parameters */
636 assert_param(IS_FSMC_NAND_DEVICE(Device
));
637 assert_param(IS_FSMC_NAND_BANK(Bank
));
640 tickstart
= HAL_GetTick();
642 /* Wait untill FIFO is empty */
643 while(__FSMC_NAND_GET_FLAG(Device
, Bank
, FSMC_FLAG_FEMPT
))
645 /* Check for the Timeout */
646 if(Timeout
!= HAL_MAX_DELAY
)
648 if((Timeout
== 0)||((HAL_GetTick() - tickstart
) > Timeout
))
655 if(Bank
== FSMC_NAND_BANK2
)
657 /* Get the ECCR2 register value */
658 *ECCval
= (uint32_t)Device
->ECCR2
;
662 /* Get the ECCR3 register value */
663 *ECCval
= (uint32_t)Device
->ECCR3
;
677 /** @defgroup FSMC_PCCARD Controller functions
678 * @brief PCCARD Controller functions
681 ==============================================================================
682 ##### How to use PCCARD device driver #####
683 ==============================================================================
685 This driver contains a set of APIs to interface with the FSMC PCCARD bank in order
686 to run the PCCARD/compact flash external devices.
688 (+) FSMC PCCARD bank reset using the function FSMC_PCCARD_DeInit()
689 (+) FSMC PCCARD bank control configuration using the function FSMC_PCCARD_Init()
690 (+) FSMC PCCARD bank common space timing configuration using the function
691 FSMC_PCCARD_CommonSpace_Timing_Init()
692 (+) FSMC PCCARD bank attribute space timing configuration using the function
693 FSMC_PCCARD_AttributeSpace_Timing_Init()
694 (+) FSMC PCCARD bank IO space timing configuration using the function
695 FSMC_PCCARD_IOSpace_Timing_Init()
701 /** @defgroup HAL_FSMC_PCCARD_Group1 Initialization/de-initialization functions
702 * @brief Initialization and Configuration functions
705 ==============================================================================
706 ##### Initialization and de_initialization functions #####
707 ==============================================================================
709 This section provides functions allowing to:
710 (+) Initialize and configure the FSMC PCCARD interface
711 (+) De-initialize the FSMC PCCARD interface
712 (+) Configure the FSMC clock and associated GPIOs
719 * @brief Initializes the FSMC_PCCARD device according to the specified
720 * control parameters in the FSMC_PCCARD_HandleTypeDef
721 * @param Device: Pointer to PCCARD device instance
722 * @param Init: Pointer to PCCARD Initialization structure
725 HAL_StatusTypeDef
FSMC_PCCARD_Init(FSMC_PCCARD_TypeDef
*Device
, FSMC_PCCARD_InitTypeDef
*Init
)
727 /* Check the parameters */
728 assert_param(IS_FSMC_WAIT_FEATURE(Init
->Waitfeature
));
729 assert_param(IS_FSMC_TCLR_TIME(Init
->TCLRSetupTime
));
730 assert_param(IS_FSMC_TAR_TIME(Init
->TARSetupTime
));
732 /* Set FSMC_PCCARD device control parameters */
733 Device
->PCR4
= (uint32_t)(Init
->Waitfeature
|\
734 FSMC_NAND_PCC_MEM_BUS_WIDTH_16
|\
735 (Init
->TCLRSetupTime
<< 9) |\
736 (Init
->TARSetupTime
<< 13));
743 * @brief Initializes the FSMC_PCCARD Common space Timing according to the specified
744 * parameters in the FSMC_NAND_PCC_TimingTypeDef
745 * @param Device: Pointer to PCCARD device instance
746 * @param Timing: Pointer to PCCARD timing structure
749 HAL_StatusTypeDef
FSMC_PCCARD_CommonSpace_Timing_Init(FSMC_PCCARD_TypeDef
*Device
, FSMC_NAND_PCC_TimingTypeDef
*Timing
)
751 /* Check the parameters */
752 assert_param(IS_FSMC_SETUP_TIME(Timing
->SetupTime
));
753 assert_param(IS_FSMC_WAIT_TIME(Timing
->WaitSetupTime
));
754 assert_param(IS_FSMC_HOLD_TIME(Timing
->HoldSetupTime
));
755 assert_param(IS_FSMC_HIZ_TIME(Timing
->HiZSetupTime
));
757 /* Set PCCARD timing parameters */
758 Device
->PMEM4
= (uint32_t)((Timing
->SetupTime
|\
759 ((Timing
->WaitSetupTime
) << 8) |\
760 (Timing
->HoldSetupTime
) << 16) |\
761 ((Timing
->HiZSetupTime
) << 24)
768 * @brief Initializes the FSMC_PCCARD Attribute space Timing according to the specified
769 * parameters in the FSMC_NAND_PCC_TimingTypeDef
770 * @param Device: Pointer to PCCARD device instance
771 * @param Timing: Pointer to PCCARD timing structure
774 HAL_StatusTypeDef
FSMC_PCCARD_AttributeSpace_Timing_Init(FSMC_PCCARD_TypeDef
*Device
, FSMC_NAND_PCC_TimingTypeDef
*Timing
)
776 /* Check the parameters */
777 assert_param(IS_FSMC_SETUP_TIME(Timing
->SetupTime
));
778 assert_param(IS_FSMC_WAIT_TIME(Timing
->WaitSetupTime
));
779 assert_param(IS_FSMC_HOLD_TIME(Timing
->HoldSetupTime
));
780 assert_param(IS_FSMC_HIZ_TIME(Timing
->HiZSetupTime
));
782 /* Set PCCARD timing parameters */
783 Device
->PATT4
= (uint32_t)((Timing
->SetupTime
|\
784 ((Timing
->WaitSetupTime
) << 8) |\
785 (Timing
->HoldSetupTime
) << 16) |\
786 ((Timing
->HiZSetupTime
) << 24)
793 * @brief Initializes the FSMC_PCCARD IO space Timing according to the specified
794 * parameters in the FSMC_NAND_PCC_TimingTypeDef
795 * @param Device: Pointer to PCCARD device instance
796 * @param Timing: Pointer to PCCARD timing structure
799 HAL_StatusTypeDef
FSMC_PCCARD_IOSpace_Timing_Init(FSMC_PCCARD_TypeDef
*Device
, FSMC_NAND_PCC_TimingTypeDef
*Timing
)
801 /* Check the parameters */
802 assert_param(IS_FSMC_SETUP_TIME(Timing
->SetupTime
));
803 assert_param(IS_FSMC_WAIT_TIME(Timing
->WaitSetupTime
));
804 assert_param(IS_FSMC_HOLD_TIME(Timing
->HoldSetupTime
));
805 assert_param(IS_FSMC_HIZ_TIME(Timing
->HiZSetupTime
));
807 /* Set FSMC_PCCARD device timing parameters */
808 Device
->PIO4
= (uint32_t)((Timing
->SetupTime
|\
809 ((Timing
->WaitSetupTime
) << 8) |\
810 (Timing
->HoldSetupTime
) << 16) |\
811 ((Timing
->HiZSetupTime
) << 24)
818 * @brief DeInitializes the FSMC_PCCARD device
819 * @param Device: Pointer to PCCARD device instance
822 HAL_StatusTypeDef
FSMC_PCCARD_DeInit(FSMC_PCCARD_TypeDef
*Device
)
824 /* Disable the FSMC_PCCARD device */
825 __FSMC_PCCARD_DISABLE(Device
);
827 /* De-initialize the FSMC_PCCARD device */
828 Device
->PCR4
= 0x00000018;
829 Device
->SR4
= 0x00000000;
830 Device
->PMEM4
= 0xFCFCFCFC;
831 Device
->PATT4
= 0xFCFCFCFC;
832 Device
->PIO4
= 0xFCFCFCFC;
845 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */
847 #endif /* HAL_FSMC_MODULE_ENABLED */
857 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/