1 /**
2 ******************************************************************************
3 * @file stm32f4xx_ll_fsmc.c
4 * @author MCD Application Team
5 * @brief FSMC Low Layer HAL module driver.
6 *
7 * This file provides firmware functions to manage the following
8 * functionalities of the Flexible Memory Controller (FSMC) peripheral memories:
9 * + Initialization/de-initialization functions
10 * + Peripheral Control functions
11 * + Peripheral State functions
12 *
13 ******************************************************************************
14 * @attention
15 *
16 * Copyright (c) 2016 STMicroelectronics.
17 * All rights reserved.
18 *
19 * This software is licensed under terms that can be found in the LICENSE file
20 * in the root directory of this software component.
21 * If no LICENSE file comes with this software, it is provided AS-IS.
22 *
23 ******************************************************************************
24 @verbatim
25 ==============================================================================
26 ##### FSMC peripheral features #####
27 ==============================================================================
28 [..] The Flexible memory controller (FSMC) includes following memory controllers:
29 (+) The NOR/PSRAM memory controller
30 (+) The NAND/PC Card memory controller
31
32 [..] The FSMC functional block makes the interface with synchronous and asynchronous static
33 memories and 16-bit PC memory cards. Its main purposes are:
34 (+) to translate AHB transactions into the appropriate external device protocol
35 (+) to meet the access time requirements of the external memory devices
36
37 [..] All external memories share the addresses, data and control signals with the controller.
38 Each external device is accessed by means of a unique Chip Select. The FSMC performs
39 only one access at a time to an external device.
40 The main features of the FSMC controller are the following:
41 (+) Interface with static-memory mapped devices including:
42 (++) Static random access memory (SRAM)
43 (++) Read-only memory (ROM)
44 (++) NOR Flash memory/OneNAND Flash memory
45 (++) PSRAM (4 memory banks)
46 (++) 16-bit PC Card compatible devices
47 (++) Two banks of NAND Flash memory with ECC hardware to check up to 8 Kbytes of
48 data
49 (+) Independent Chip Select control for each memory bank
50 (+) Independent configuration for each memory bank
51
52 @endverbatim
53 ******************************************************************************
54 */
55
56 /* Includes ------------------------------------------------------------------*/
57 #include "stm32f4xx_hal.h"
58
59 /** @addtogroup STM32F4xx_HAL_Driver
60 * @{
61 */
62 #if defined(HAL_NOR_MODULE_ENABLED) || defined(HAL_NAND_MODULE_ENABLED) || defined(HAL_PCCARD_MODULE_ENABLED) \
63 || defined(HAL_SRAM_MODULE_ENABLED)
64
65 /** @defgroup FSMC_LL FSMC Low Layer
66 * @brief FSMC driver modules
67 * @{
68 */
69
70 /* Private typedef -----------------------------------------------------------*/
71 /* Private define ------------------------------------------------------------*/
72
73 /** @defgroup FSMC_LL_Private_Constants FSMC Low Layer Private Constants
74 * @{
75 */
76
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
157 /**
158 * @}
159 */
160
161 /* Private macro -------------------------------------------------------------*/
162 /* Private variables ---------------------------------------------------------*/
163 /* Private function prototypes -----------------------------------------------*/
164 /* Exported functions --------------------------------------------------------*/
165
166 /** @defgroup FSMC_LL_Exported_Functions FSMC Low Layer Exported Functions
167 * @{
168 */
169
170 #if defined(FSMC_Bank1)
171
172 /** @defgroup FSMC_LL_Exported_Functions_NORSRAM FSMC Low Layer NOR SRAM Exported Functions
173 * @brief NORSRAM Controller functions
174 *
175 @verbatim
176 ==============================================================================
177 ##### How to use NORSRAM device driver #####
178 ==============================================================================
179
180 [..]
181 This driver contains a set of APIs to interface with the FSMC NORSRAM banks in order
182 to run the NORSRAM external devices.
183
184 (+) FSMC NORSRAM bank reset using the function FSMC_NORSRAM_DeInit()
185 (+) FSMC NORSRAM bank control configuration using the function FSMC_NORSRAM_Init()
186 (+) FSMC NORSRAM bank timing configuration using the function FSMC_NORSRAM_Timing_Init()
187 (+) FSMC NORSRAM bank extended timing configuration using the function
188 FSMC_NORSRAM_Extended_Timing_Init()
189 (+) FSMC NORSRAM bank enable/disable write operation using the functions
190 FSMC_NORSRAM_WriteOperation_Enable()/FSMC_NORSRAM_WriteOperation_Disable()
191
192 @endverbatim
193 * @{
194 */
195
196 /** @defgroup FSMC_LL_NORSRAM_Exported_Functions_Group1 Initialization and de-initialization functions
197 * @brief Initialization and Configuration functions
198 *
199 @verbatim
200 ==============================================================================
201 ##### Initialization and de_initialization functions #####
202 ==============================================================================
203 [..]
204 This section provides functions allowing to:
205 (+) Initialize and configure the FSMC NORSRAM interface
206 (+) De-initialize the FSMC NORSRAM interface
207 (+) Configure the FSMC clock and associated GPIOs
208
209 @endverbatim
210 * @{
211 */
212
213 /**
214 * @brief Initialize the FSMC_NORSRAM device according to the specified
215 * control parameters in the FSMC_NORSRAM_InitTypeDef
216 * @param Device Pointer to NORSRAM device instance
217 * @param Init Pointer to NORSRAM Initialization structure
218 * @retval HAL status
219 */
FSMC_NORSRAM_Init(FSMC_NORSRAM_TypeDef * Device,FSMC_NORSRAM_InitTypeDef * Init)220 HAL_StatusTypeDef FSMC_NORSRAM_Init(FSMC_NORSRAM_TypeDef *Device,
221 FSMC_NORSRAM_InitTypeDef *Init)
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
335 /**
336 * @brief DeInitialize the FSMC_NORSRAM peripheral
337 * @param Device Pointer to NORSRAM device instance
338 * @param ExDevice Pointer to NORSRAM extended mode device instance
339 * @param Bank NORSRAM bank number
340 * @retval HAL status
341 */
FSMC_NORSRAM_DeInit(FSMC_NORSRAM_TypeDef * Device,FSMC_NORSRAM_EXTENDED_TypeDef * ExDevice,uint32_t Bank)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
371 /**
372 * @brief Initialize the FSMC_NORSRAM Timing according to the specified
373 * parameters in the FSMC_NORSRAM_TimingTypeDef
374 * @param Device Pointer to NORSRAM device instance
375 * @param Timing Pointer to NORSRAM Timing structure
376 * @param Bank NORSRAM bank number
377 * @retval HAL status
378 */
FSMC_NORSRAM_Timing_Init(FSMC_NORSRAM_TypeDef * Device,FSMC_NORSRAM_TimingTypeDef * Timing,uint32_t Bank)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
419 /**
420 * @brief Initialize the FSMC_NORSRAM Extended mode Timing according to the specified
421 * parameters in the FSMC_NORSRAM_TimingTypeDef
422 * @param Device Pointer to NORSRAM device instance
423 * @param Timing Pointer to NORSRAM Timing structure
424 * @param Bank NORSRAM bank number
425 * @param ExtendedMode FSMC Extended Mode
426 * This parameter can be one of the following values:
427 * @arg FSMC_EXTENDED_MODE_DISABLE
428 * @arg FSMC_EXTENDED_MODE_ENABLE
429 * @retval HAL status
430 */
FSMC_NORSRAM_Extended_Timing_Init(FSMC_NORSRAM_EXTENDED_TypeDef * Device,FSMC_NORSRAM_TimingTypeDef * Timing,uint32_t Bank,uint32_t ExtendedMode)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 }
464 /**
465 * @}
466 */
467
468 /** @addtogroup FSMC_LL_NORSRAM_Private_Functions_Group2
469 * @brief management functions
470 *
471 @verbatim
472 ==============================================================================
473 ##### FSMC_NORSRAM Control functions #####
474 ==============================================================================
475 [..]
476 This subsection provides a set of functions allowing to control dynamically
477 the FSMC NORSRAM interface.
478
479 @endverbatim
480 * @{
481 */
482
483 /**
484 * @brief Enables dynamically FSMC_NORSRAM write operation.
485 * @param Device Pointer to NORSRAM device instance
486 * @param Bank NORSRAM bank number
487 * @retval HAL status
488 */
FSMC_NORSRAM_WriteOperation_Enable(FSMC_NORSRAM_TypeDef * Device,uint32_t Bank)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
501 /**
502 * @brief Disables dynamically FSMC_NORSRAM write operation.
503 * @param Device Pointer to NORSRAM device instance
504 * @param Bank NORSRAM bank number
505 * @retval HAL status
506 */
FSMC_NORSRAM_WriteOperation_Disable(FSMC_NORSRAM_TypeDef * Device,uint32_t Bank)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
519 /**
520 * @}
521 */
522
523 /**
524 * @}
525 */
526 #endif /* FSMC_Bank1 */
527
528 #if defined(FSMC_Bank2_3)
529
530 /** @defgroup FSMC_LL_Exported_Functions_NAND FSMC Low Layer NAND Exported Functions
531 * @brief NAND Controller functions
532 *
533 @verbatim
534 ==============================================================================
535 ##### How to use NAND device driver #####
536 ==============================================================================
537 [..]
538 This driver contains a set of APIs to interface with the FSMC NAND banks in order
539 to run the NAND external devices.
540
541 (+) FSMC NAND bank reset using the function FSMC_NAND_DeInit()
542 (+) FSMC NAND bank control configuration using the function FSMC_NAND_Init()
543 (+) FSMC NAND bank common space timing configuration using the function
544 FSMC_NAND_CommonSpace_Timing_Init()
545 (+) FSMC NAND bank attribute space timing configuration using the function
546 FSMC_NAND_AttributeSpace_Timing_Init()
547 (+) FSMC NAND bank enable/disable ECC correction feature using the functions
548 FSMC_NAND_ECC_Enable()/FSMC_NAND_ECC_Disable()
549 (+) FSMC NAND bank get ECC correction code using the function FSMC_NAND_GetECC()
550
551 @endverbatim
552 * @{
553 */
554
555 /** @defgroup FSMC_LL_NAND_Exported_Functions_Group1 Initialization and de-initialization functions
556 * @brief Initialization and Configuration functions
557 *
558 @verbatim
559 ==============================================================================
560 ##### Initialization and de_initialization functions #####
561 ==============================================================================
562 [..]
563 This section provides functions allowing to:
564 (+) Initialize and configure the FSMC NAND interface
565 (+) De-initialize the FSMC NAND interface
566 (+) Configure the FSMC clock and associated GPIOs
567
568 @endverbatim
569 * @{
570 */
571
572 /**
573 * @brief Initializes the FSMC_NAND device according to the specified
574 * control parameters in the FSMC_NAND_HandleTypeDef
575 * @param Device Pointer to NAND device instance
576 * @param Init Pointer to NAND Initialization structure
577 * @retval HAL status
578 */
FSMC_NAND_Init(FSMC_NAND_TypeDef * Device,FSMC_NAND_InitTypeDef * Init)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
618 /**
619 * @brief Initializes the FSMC_NAND Common space Timing according to the specified
620 * parameters in the FSMC_NAND_PCC_TimingTypeDef
621 * @param Device Pointer to NAND device instance
622 * @param Timing Pointer to NAND timing structure
623 * @param Bank NAND bank number
624 * @retval HAL status
625 */
FSMC_NAND_CommonSpace_Timing_Init(FSMC_NAND_TypeDef * Device,FSMC_NAND_PCC_TimingTypeDef * Timing,uint32_t Bank)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
658 /**
659 * @brief Initializes the FSMC_NAND Attribute space Timing according to the specified
660 * parameters in the FSMC_NAND_PCC_TimingTypeDef
661 * @param Device Pointer to NAND device instance
662 * @param Timing Pointer to NAND timing structure
663 * @param Bank NAND bank number
664 * @retval HAL status
665 */
FSMC_NAND_AttributeSpace_Timing_Init(FSMC_NAND_TypeDef * Device,FSMC_NAND_PCC_TimingTypeDef * Timing,uint32_t Bank)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
698 /**
699 * @brief DeInitializes the FSMC_NAND device
700 * @param Device Pointer to NAND device instance
701 * @param Bank NAND bank number
702 * @retval HAL status
703 */
FSMC_NAND_DeInit(FSMC_NAND_TypeDef * Device,uint32_t Bank)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
735 /**
736 * @}
737 */
738
739 /** @defgroup HAL_FSMC_NAND_Group2 Peripheral Control functions
740 * @brief management functions
741 *
742 @verbatim
743 ==============================================================================
744 ##### FSMC_NAND Control functions #####
745 ==============================================================================
746 [..]
747 This subsection provides a set of functions allowing to control dynamically
748 the FSMC NAND interface.
749
750 @endverbatim
751 * @{
752 */
753
754
755 /**
756 * @brief Enables dynamically FSMC_NAND ECC feature.
757 * @param Device Pointer to NAND device instance
758 * @param Bank NAND bank number
759 * @retval HAL status
760 */
FSMC_NAND_ECC_Enable(FSMC_NAND_TypeDef * Device,uint32_t Bank)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
781 /**
782 * @brief Disables dynamically FSMC_NAND ECC feature.
783 * @param Device Pointer to NAND device instance
784 * @param Bank NAND bank number
785 * @retval HAL status
786 */
FSMC_NAND_ECC_Disable(FSMC_NAND_TypeDef * Device,uint32_t Bank)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
806 /**
807 * @brief Disables dynamically FSMC_NAND ECC feature.
808 * @param Device Pointer to NAND device instance
809 * @param ECCval Pointer to ECC value
810 * @param Bank NAND bank number
811 * @param Timeout Timeout wait value
812 * @retval HAL status
813 */
FSMC_NAND_GetECC(FSMC_NAND_TypeDef * Device,uint32_t * ECCval,uint32_t Bank,uint32_t Timeout)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
853 /**
854 * @}
855 */
856 #endif /* FSMC_Bank2_3 */
857
858 #if defined(FSMC_Bank4)
859
860 /** @addtogroup FSMC_LL_PCCARD
861 * @brief PCCARD Controller functions
862 *
863 @verbatim
864 ==============================================================================
865 ##### How to use PCCARD device driver #####
866 ==============================================================================
867 [..]
868 This driver contains a set of APIs to interface with the FSMC PCCARD bank in order
869 to run the PCCARD/compact flash external devices.
870
871 (+) FSMC PCCARD bank reset using the function FSMC_PCCARD_DeInit()
872 (+) FSMC PCCARD bank control configuration using the function FSMC_PCCARD_Init()
873 (+) FSMC PCCARD bank common space timing configuration using the function
874 FSMC_PCCARD_CommonSpace_Timing_Init()
875 (+) FSMC PCCARD bank attribute space timing configuration using the function
876 FSMC_PCCARD_AttributeSpace_Timing_Init()
877 (+) FSMC PCCARD bank IO space timing configuration using the function
878 FSMC_PCCARD_IOSpace_Timing_Init()
879 @endverbatim
880 * @{
881 */
882
883 /** @addtogroup FSMC_LL_PCCARD_Private_Functions_Group1
884 * @brief Initialization and Configuration functions
885 *
886 @verbatim
887 ==============================================================================
888 ##### Initialization and de_initialization functions #####
889 ==============================================================================
890 [..]
891 This section provides functions allowing to:
892 (+) Initialize and configure the FSMC PCCARD interface
893 (+) De-initialize the FSMC PCCARD interface
894 (+) Configure the FSMC clock and associated GPIOs
895
896 @endverbatim
897 * @{
898 */
899
900 /**
901 * @brief Initializes the FSMC_PCCARD device according to the specified
902 * control parameters in the FSMC_PCCARD_HandleTypeDef
903 * @param Device Pointer to PCCARD device instance
904 * @param Init Pointer to PCCARD Initialization structure
905 * @retval HAL status
906 */
FSMC_PCCARD_Init(FSMC_PCCARD_TypeDef * Device,FSMC_PCCARD_InitTypeDef * Init)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
933 /**
934 * @brief Initializes the FSMC_PCCARD Common space Timing according to the specified
935 * parameters in the FSMC_NAND_PCC_TimingTypeDef
936 * @param Device Pointer to PCCARD device instance
937 * @param Timing Pointer to PCCARD timing structure
938 * @retval HAL status
939 */
FSMC_PCCARD_CommonSpace_Timing_Init(FSMC_PCCARD_TypeDef * Device,FSMC_NAND_PCC_TimingTypeDef * Timing)940 HAL_StatusTypeDef FSMC_PCCARD_CommonSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device,
941 FSMC_NAND_PCC_TimingTypeDef *Timing)
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
962 /**
963 * @brief Initializes the FSMC_PCCARD Attribute space Timing according to the specified
964 * parameters in the FSMC_NAND_PCC_TimingTypeDef
965 * @param Device Pointer to PCCARD device instance
966 * @param Timing Pointer to PCCARD timing structure
967 * @retval HAL status
968 */
FSMC_PCCARD_AttributeSpace_Timing_Init(FSMC_PCCARD_TypeDef * Device,FSMC_NAND_PCC_TimingTypeDef * Timing)969 HAL_StatusTypeDef FSMC_PCCARD_AttributeSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device,
970 FSMC_NAND_PCC_TimingTypeDef *Timing)
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
991 /**
992 * @brief Initializes the FSMC_PCCARD IO space Timing according to the specified
993 * parameters in the FSMC_NAND_PCC_TimingTypeDef
994 * @param Device Pointer to PCCARD device instance
995 * @param Timing Pointer to PCCARD timing structure
996 * @retval HAL status
997 */
FSMC_PCCARD_IOSpace_Timing_Init(FSMC_PCCARD_TypeDef * Device,FSMC_NAND_PCC_TimingTypeDef * Timing)998 HAL_StatusTypeDef FSMC_PCCARD_IOSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device,
999 FSMC_NAND_PCC_TimingTypeDef *Timing)
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
1020 /**
1021 * @brief DeInitializes the FSMC_PCCARD device
1022 * @param Device Pointer to PCCARD device instance
1023 * @retval HAL status
1024 */
FSMC_PCCARD_DeInit(FSMC_PCCARD_TypeDef * Device)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
1043 /**
1044 * @}
1045 */
1046 #endif /* FSMC_Bank4 */
1047
1048
1049 /**
1050 * @}
1051 */
1052
1053 /**
1054 * @}
1055 */
1056
1057 #endif /* HAL_NOR_MODULE_ENABLED */
1058 /**
1059 * @}
1060 */
1061 /**
1062 * @}
1063 */
1064