Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2 | Rev 3 | ||
|---|---|---|---|
| Line 1... | Line 1... | ||
| 1 | /** |
1 | /** |
| 2 | ****************************************************************************** |
2 | ****************************************************************************** |
| 3 | * @file stm32f1xx_ll_fsmc.c |
3 | * @file stm32f1xx_ll_fsmc.c |
| 4 | * @author MCD Application Team |
4 | * @author MCD Application Team |
| 5 | * @brief FSMC Low Layer HAL module driver. |
5 | * @brief FSMC Low Layer HAL module driver. |
| 6 | * |
6 | * |
| 7 | * This file provides firmware functions to manage the following |
7 | * This file provides firmware functions to manage the following |
| 8 | * functionalities of the Flexible Memory Controller (FSMC) peripheral memories: |
8 | * functionalities of the Flexible Memory Controller (FSMC) peripheral memories: |
| 9 | * + Initialization/de-initialization functions |
9 | * + Initialization/de-initialization functions |
| 10 | * + Peripheral Control functions |
10 | * + Peripheral Control functions |
| 11 | * + Peripheral State functions |
11 | * + Peripheral State functions |
| 12 | * |
12 | * |
| 13 | @verbatim |
13 | ****************************************************************************** |
| 14 | ============================================================================== |
14 | * @attention |
| 15 | ##### FSMC peripheral features ##### |
15 | * |
| 16 | ============================================================================== |
16 | * Copyright (c) 2016 STMicroelectronics. |
| 17 | [..] The Flexible memory controller (FSMC) includes following memory controllers: |
17 | * All rights reserved. |
| 18 | (+) The NOR/PSRAM memory controller |
18 | * |
| 19 | (+) The NAND/PC Card memory controller |
19 | * This software is licensed under terms that can be found in the LICENSE file |
| 20 | 20 | * in the root directory of this software component. |
|
| 21 | [..] The FSMC functional block makes the interface with synchronous and asynchronous static |
21 | * If no LICENSE file comes with this software, it is provided AS-IS. |
| 22 | memories and 16-bit PC memory cards. Its main purposes are: |
22 | * |
| 23 | (+) to translate AHB transactions into the appropriate external device protocol |
23 | ****************************************************************************** |
| 24 | (+) to meet the access time requirements of the external memory devices |
24 | @verbatim |
| 25 | 25 | ============================================================================== |
|
| 26 | [..] All external memories share the addresses, data and control signals with the controller. |
26 | ##### FSMC peripheral features ##### |
| 27 | Each external device is accessed by means of a unique Chip Select. The FSMC performs |
27 | ============================================================================== |
| 28 | only one access at a time to an external device. |
28 | [..] The Flexible memory controller (FSMC) includes following memory controllers: |
| 29 | The main features of the FSMC controller are the following: |
29 | (+) The NOR/PSRAM memory controller |
| 30 | (+) Interface with static-memory mapped devices including: |
30 | (+) The NAND/PC Card memory controller |
| 31 | (++) Static random access memory (SRAM) |
31 | |
| 32 | (++) Read-only memory (ROM) |
32 | [..] The FSMC functional block makes the interface with synchronous and asynchronous static |
| 33 | (++) NOR Flash memory/OneNAND Flash memory |
33 | memories and 16-bit PC memory cards. Its main purposes are: |
| 34 | (++) PSRAM (4 memory banks) |
34 | (+) to translate AHB transactions into the appropriate external device protocol |
| 35 | (++) 16-bit PC Card compatible devices |
35 | (+) to meet the access time requirements of the external memory devices |
| 36 | (++) Two banks of NAND Flash memory with ECC hardware to check up to 8 Kbytes of |
36 | |
| 37 | data |
37 | [..] All external memories share the addresses, data and control signals with the controller. |
| 38 | (+) Independent Chip Select control for each memory bank |
38 | Each external device is accessed by means of a unique Chip Select. The FSMC performs |
| 39 | (+) Independent configuration for each memory bank |
39 | only one access at a time to an external device. |
| 40 | 40 | The main features of the FSMC controller are the following: |
|
| 41 | @endverbatim |
41 | (+) Interface with static-memory mapped devices including: |
| 42 | ****************************************************************************** |
42 | (++) Static random access memory (SRAM) |
| 43 | * @attention |
43 | (++) Read-only memory (ROM) |
| 44 | * |
44 | (++) NOR Flash memory/OneNAND Flash memory |
| 45 | * <h2><center>© Copyright (c) 2016 STMicroelectronics. |
45 | (++) PSRAM (4 memory banks) |
| 46 | * All rights reserved.</center></h2> |
46 | (++) 16-bit PC Card compatible devices |
| 47 | * |
47 | (++) Two banks of NAND Flash memory with ECC hardware to check up to 8 Kbytes of |
| 48 | * This software component is licensed by ST under BSD 3-Clause license, |
48 | data |
| 49 | * the "License"; You may not use this file except in compliance with the |
49 | (+) Independent Chip Select control for each memory bank |
| 50 | * License. You may obtain a copy of the License at: |
50 | (+) Independent configuration for each memory bank |
| 51 | * opensource.org/licenses/BSD-3-Clause |
51 | |
| 52 | * |
52 | @endverbatim |
| 53 | ****************************************************************************** |
53 | ****************************************************************************** |
| 54 | */ |
54 | */ |
| 55 | 55 | ||
| 56 | /* Includes ------------------------------------------------------------------*/ |
56 | /* Includes ------------------------------------------------------------------*/ |
| 57 | #include "stm32f1xx_hal.h" |
57 | #include "stm32f1xx_hal.h" |
| 58 | 58 | ||
| 59 | /** @addtogroup STM32F1xx_HAL_Driver |
59 | /** @addtogroup STM32F1xx_HAL_Driver |
| 60 | * @{ |
60 | * @{ |
| 61 | */ |
61 | */ |
| 62 | #if defined(HAL_NOR_MODULE_ENABLED) || defined(HAL_SRAM_MODULE_ENABLED) || defined(HAL_NAND_MODULE_ENABLED) || defined(HAL_PCCARD_MODULE_ENABLED) |
62 | #if defined(HAL_NOR_MODULE_ENABLED) || defined(HAL_NAND_MODULE_ENABLED) || defined(HAL_PCCARD_MODULE_ENABLED) \ |
| 63 | 63 | || defined(HAL_SRAM_MODULE_ENABLED) |
|
| 64 | /** @defgroup FSMC_LL FSMC Low Layer |
64 | |
| 65 | * @brief FSMC driver modules |
65 | /** @defgroup FSMC_LL FSMC Low Layer |
| 66 | * @{ |
66 | * @brief FSMC driver modules |
| 67 | */ |
67 | * @{ |
| 68 | 68 | */ |
|
| 69 | /* Private typedef -----------------------------------------------------------*/ |
69 | |
| 70 | /* Private define ------------------------------------------------------------*/ |
70 | /* Private typedef -----------------------------------------------------------*/ |
| 71 | 71 | /* Private define ------------------------------------------------------------*/ |
|
| 72 | /** @defgroup FSMC_LL_Private_Constants FSMC Low Layer Private Constants |
72 | |
| 73 | * @{ |
73 | /** @defgroup FSMC_LL_Private_Constants FSMC Low Layer Private Constants |
| 74 | */ |
74 | * @{ |
| 75 | 75 | */ |
|
| 76 | /* ----------------------- FSMC registers bit mask --------------------------- */ |
76 | |
| 77 | 77 | /* ----------------------- FSMC registers bit mask --------------------------- */ |
|
| 78 | #if defined(FSMC_BANK1) |
78 | |
| 79 | /* --- BCR Register ---*/ |
79 | #if defined(FSMC_BANK1) |
| 80 | /* BCR register clear mask */ |
80 | /* --- BCR Register ---*/ |
| 81 | 81 | /* BCR register clear mask */ |
|
| 82 | /* --- BTR Register ---*/ |
82 | |
| 83 | /* BTR register clear mask */ |
83 | /* --- BTR Register ---*/ |
| 84 | #define BTR_CLEAR_MASK ((uint32_t)(FSMC_BTRx_ADDSET | FSMC_BTRx_ADDHLD |\ |
84 | /* BTR register clear mask */ |
| 85 | FSMC_BTRx_DATAST | FSMC_BTRx_BUSTURN |\ |
85 | #define BTR_CLEAR_MASK ((uint32_t)(FSMC_BTRx_ADDSET | FSMC_BTRx_ADDHLD |\ |
| 86 | FSMC_BTRx_CLKDIV | FSMC_BTRx_DATLAT |\ |
86 | FSMC_BTRx_DATAST | FSMC_BTRx_BUSTURN |\ |
| 87 | FSMC_BTRx_ACCMOD)) |
87 | FSMC_BTRx_CLKDIV | FSMC_BTRx_DATLAT |\ |
| 88 | 88 | FSMC_BTRx_ACCMOD)) |
|
| 89 | /* --- BWTR Register ---*/ |
89 | |
| 90 | /* BWTR register clear mask */ |
90 | /* --- BWTR Register ---*/ |
| 91 | #if defined(FSMC_BWTRx_BUSTURN) |
91 | /* BWTR register clear mask */ |
| 92 | #define BWTR_CLEAR_MASK ((uint32_t)(FSMC_BWTRx_ADDSET | FSMC_BWTRx_ADDHLD |\ |
92 | #if defined(FSMC_BWTRx_BUSTURN) |
| 93 | FSMC_BWTRx_DATAST | FSMC_BWTRx_BUSTURN |\ |
93 | #define BWTR_CLEAR_MASK ((uint32_t)(FSMC_BWTRx_ADDSET | FSMC_BWTRx_ADDHLD |\ |
| 94 | FSMC_BWTRx_ACCMOD)) |
94 | FSMC_BWTRx_DATAST | FSMC_BWTRx_BUSTURN |\ |
| 95 | #else |
95 | FSMC_BWTRx_ACCMOD)) |
| 96 | #define BWTR_CLEAR_MASK ((uint32_t)(FSMC_BWTRx_ADDSET | FSMC_BWTRx_ADDHLD |\ |
96 | #else |
| 97 | FSMC_BWTRx_DATAST | FSMC_BWTRx_ACCMOD |\ |
97 | #define BWTR_CLEAR_MASK ((uint32_t)(FSMC_BWTRx_ADDSET | FSMC_BWTRx_ADDHLD |\ |
| 98 | FSMC_BWTRx_CLKDIV | FSMC_BWTRx_DATLAT)) |
98 | FSMC_BWTRx_DATAST | FSMC_BWTRx_ACCMOD |\ |
| 99 | #endif /* FSMC_BWTRx_BUSTURN */ |
99 | FSMC_BWTRx_CLKDIV | FSMC_BWTRx_DATLAT)) |
| 100 | #endif /* FSMC_BANK1 */ |
100 | #endif /* FSMC_BWTRx_BUSTURN */ |
| 101 | #if defined(FSMC_BANK3) |
101 | #endif /* FSMC_BANK1 */ |
| 102 | 102 | #if defined(FSMC_BANK3) |
|
| 103 | /* --- PCR Register ---*/ |
103 | |
| 104 | /* PCR register clear mask */ |
104 | /* --- PCR Register ---*/ |
| 105 | #define PCR_CLEAR_MASK ((uint32_t)(FSMC_PCRx_PWAITEN | FSMC_PCRx_PBKEN | \ |
105 | /* PCR register clear mask */ |
| 106 | FSMC_PCRx_PTYP | FSMC_PCRx_PWID | \ |
106 | #define PCR_CLEAR_MASK ((uint32_t)(FSMC_PCRx_PWAITEN | FSMC_PCRx_PBKEN | \ |
| 107 | FSMC_PCRx_ECCEN | FSMC_PCRx_TCLR | \ |
107 | FSMC_PCRx_PTYP | FSMC_PCRx_PWID | \ |
| 108 | FSMC_PCRx_TAR | FSMC_PCRx_ECCPS)) |
108 | FSMC_PCRx_ECCEN | FSMC_PCRx_TCLR | \ |
| 109 | /* --- PMEM Register ---*/ |
109 | FSMC_PCRx_TAR | FSMC_PCRx_ECCPS)) |
| 110 | /* PMEM register clear mask */ |
110 | /* --- PMEM Register ---*/ |
| 111 | #define PMEM_CLEAR_MASK ((uint32_t)(FSMC_PMEMx_MEMSETx | FSMC_PMEMx_MEMWAITx |\ |
111 | /* PMEM register clear mask */ |
| 112 | FSMC_PMEMx_MEMHOLDx | FSMC_PMEMx_MEMHIZx)) |
112 | #define PMEM_CLEAR_MASK ((uint32_t)(FSMC_PMEMx_MEMSETx | FSMC_PMEMx_MEMWAITx |\ |
| 113 | 113 | FSMC_PMEMx_MEMHOLDx | FSMC_PMEMx_MEMHIZx)) |
|
| 114 | /* --- PATT Register ---*/ |
114 | |
| 115 | /* PATT register clear mask */ |
115 | /* --- PATT Register ---*/ |
| 116 | #define PATT_CLEAR_MASK ((uint32_t)(FSMC_PATTx_ATTSETx | FSMC_PATTx_ATTWAITx |\ |
116 | /* PATT register clear mask */ |
| 117 | FSMC_PATTx_ATTHOLDx | FSMC_PATTx_ATTHIZx)) |
117 | #define PATT_CLEAR_MASK ((uint32_t)(FSMC_PATTx_ATTSETx | FSMC_PATTx_ATTWAITx |\ |
| 118 | 118 | FSMC_PATTx_ATTHOLDx | FSMC_PATTx_ATTHIZx)) |
|
| 119 | #endif /* FSMC_BANK3 */ |
119 | |
| 120 | #if defined(FSMC_BANK4) |
120 | #endif /* FSMC_BANK3 */ |
| 121 | /* --- PCR Register ---*/ |
121 | #if defined(FSMC_BANK4) |
| 122 | /* PCR register clear mask */ |
122 | /* --- PCR Register ---*/ |
| 123 | #define PCR4_CLEAR_MASK ((uint32_t)(FSMC_PCR4_PWAITEN | FSMC_PCR4_PBKEN | \ |
123 | /* PCR register clear mask */ |
| 124 | FSMC_PCR4_PTYP | FSMC_PCR4_PWID | \ |
124 | #define PCR4_CLEAR_MASK ((uint32_t)(FSMC_PCR4_PWAITEN | FSMC_PCR4_PBKEN | \ |
| 125 | FSMC_PCR4_ECCEN | FSMC_PCR4_TCLR | \ |
125 | FSMC_PCR4_PTYP | FSMC_PCR4_PWID | \ |
| 126 | FSMC_PCR4_TAR | FSMC_PCR4_ECCPS)) |
126 | FSMC_PCR4_ECCEN | FSMC_PCR4_TCLR | \ |
| 127 | /* --- PMEM Register ---*/ |
127 | FSMC_PCR4_TAR | FSMC_PCR4_ECCPS)) |
| 128 | /* PMEM register clear mask */ |
128 | /* --- PMEM Register ---*/ |
| 129 | #define PMEM4_CLEAR_MASK ((uint32_t)(FSMC_PMEM4_MEMSET4 | FSMC_PMEM4_MEMWAIT4 |\ |
129 | /* PMEM register clear mask */ |
| 130 | FSMC_PMEM4_MEMHOLD4 | FSMC_PMEM4_MEMHIZ4)) |
130 | #define PMEM4_CLEAR_MASK ((uint32_t)(FSMC_PMEM4_MEMSET4 | FSMC_PMEM4_MEMWAIT4 |\ |
| 131 | 131 | FSMC_PMEM4_MEMHOLD4 | FSMC_PMEM4_MEMHIZ4)) |
|
| 132 | /* --- PATT Register ---*/ |
132 | |
| 133 | /* PATT register clear mask */ |
133 | /* --- PATT Register ---*/ |
| 134 | #define PATT4_CLEAR_MASK ((uint32_t)(FSMC_PATT4_ATTSET4 | FSMC_PATT4_ATTWAIT4 |\ |
134 | /* PATT register clear mask */ |
| 135 | FSMC_PATT4_ATTHOLD4 | FSMC_PATT4_ATTHIZ4)) |
135 | #define PATT4_CLEAR_MASK ((uint32_t)(FSMC_PATT4_ATTSET4 | FSMC_PATT4_ATTWAIT4 |\ |
| 136 | 136 | FSMC_PATT4_ATTHOLD4 | FSMC_PATT4_ATTHIZ4)) |
|
| 137 | /* --- PIO4 Register ---*/ |
137 | |
| 138 | /* PIO4 register clear mask */ |
138 | /* --- PIO4 Register ---*/ |
| 139 | #define PIO4_CLEAR_MASK ((uint32_t)(FSMC_PIO4_IOSET4 | FSMC_PIO4_IOWAIT4 | \ |
139 | /* PIO4 register clear mask */ |
| 140 | FSMC_PIO4_IOHOLD4 | FSMC_PIO4_IOHIZ4)) |
140 | #define PIO4_CLEAR_MASK ((uint32_t)(FSMC_PIO4_IOSET4 | FSMC_PIO4_IOWAIT4 | \ |
| 141 | 141 | FSMC_PIO4_IOHOLD4 | FSMC_PIO4_IOHIZ4)) |
|
| 142 | #endif /* FSMC_BANK4 */ |
142 | |
| 143 | 143 | #endif /* FSMC_BANK4 */ |
|
| 144 | /** |
144 | |
| 145 | * @} |
145 | /** |
| 146 | */ |
146 | * @} |
| 147 | 147 | */ |
|
| 148 | /* Private macro -------------------------------------------------------------*/ |
148 | |
| 149 | /* Private variables ---------------------------------------------------------*/ |
149 | /* Private macro -------------------------------------------------------------*/ |
| 150 | /* Private function prototypes -----------------------------------------------*/ |
150 | /* Private variables ---------------------------------------------------------*/ |
| 151 | /* Exported functions --------------------------------------------------------*/ |
151 | /* Private function prototypes -----------------------------------------------*/ |
| 152 | 152 | /* Exported functions --------------------------------------------------------*/ |
|
| 153 | /** @defgroup FSMC_LL_Exported_Functions FSMC Low Layer Exported Functions |
153 | |
| 154 | * @{ |
154 | /** @defgroup FSMC_LL_Exported_Functions FSMC Low Layer Exported Functions |
| 155 | */ |
155 | * @{ |
| 156 | 156 | */ |
|
| 157 | #if defined(FSMC_BANK1) |
157 | |
| 158 | 158 | #if defined(FSMC_BANK1) |
|
| 159 | /** @defgroup FSMC_LL_Exported_Functions_NORSRAM FSMC Low Layer NOR SRAM Exported Functions |
159 | |
| 160 | * @brief NORSRAM Controller functions |
160 | /** @defgroup FSMC_LL_Exported_Functions_NORSRAM FSMC Low Layer NOR SRAM Exported Functions |
| 161 | * |
161 | * @brief NORSRAM Controller functions |
| 162 | @verbatim |
162 | * |
| 163 | ============================================================================== |
163 | @verbatim |
| 164 | ##### How to use NORSRAM device driver ##### |
164 | ============================================================================== |
| 165 | ============================================================================== |
165 | ##### How to use NORSRAM device driver ##### |
| 166 | 166 | ============================================================================== |
|
| 167 | [..] |
167 | |
| 168 | This driver contains a set of APIs to interface with the FSMC NORSRAM banks in order |
168 | [..] |
| 169 | to run the NORSRAM external devices. |
169 | This driver contains a set of APIs to interface with the FSMC NORSRAM banks in order |
| 170 | 170 | to run the NORSRAM external devices. |
|
| 171 | (+) FSMC NORSRAM bank reset using the function FSMC_NORSRAM_DeInit() |
171 | |
| 172 | (+) FSMC NORSRAM bank control configuration using the function FSMC_NORSRAM_Init() |
172 | (+) FSMC NORSRAM bank reset using the function FSMC_NORSRAM_DeInit() |
| 173 | (+) FSMC NORSRAM bank timing configuration using the function FSMC_NORSRAM_Timing_Init() |
173 | (+) FSMC NORSRAM bank control configuration using the function FSMC_NORSRAM_Init() |
| 174 | (+) FSMC NORSRAM bank extended timing configuration using the function |
174 | (+) FSMC NORSRAM bank timing configuration using the function FSMC_NORSRAM_Timing_Init() |
| 175 | FSMC_NORSRAM_Extended_Timing_Init() |
175 | (+) FSMC NORSRAM bank extended timing configuration using the function |
| 176 | (+) FSMC NORSRAM bank enable/disable write operation using the functions |
176 | FSMC_NORSRAM_Extended_Timing_Init() |
| 177 | FSMC_NORSRAM_WriteOperation_Enable()/FSMC_NORSRAM_WriteOperation_Disable() |
177 | (+) FSMC NORSRAM bank enable/disable write operation using the functions |
| 178 | 178 | FSMC_NORSRAM_WriteOperation_Enable()/FSMC_NORSRAM_WriteOperation_Disable() |
|
| 179 | @endverbatim |
179 | |
| 180 | * @{ |
180 | @endverbatim |
| 181 | */ |
181 | * @{ |
| 182 | 182 | */ |
|
| 183 | /** @defgroup FSMC_LL_NORSRAM_Exported_Functions_Group1 Initialization and de-initialization functions |
183 | |
| 184 | * @brief Initialization and Configuration functions |
184 | /** @defgroup FSMC_LL_NORSRAM_Exported_Functions_Group1 Initialization and de-initialization functions |
| 185 | * |
185 | * @brief Initialization and Configuration functions |
| 186 | @verbatim |
186 | * |
| 187 | ============================================================================== |
187 | @verbatim |
| 188 | ##### Initialization and de_initialization functions ##### |
188 | ============================================================================== |
| 189 | ============================================================================== |
189 | ##### Initialization and de_initialization functions ##### |
| 190 | [..] |
190 | ============================================================================== |
| 191 | This section provides functions allowing to: |
191 | [..] |
| 192 | (+) Initialize and configure the FSMC NORSRAM interface |
192 | This section provides functions allowing to: |
| 193 | (+) De-initialize the FSMC NORSRAM interface |
193 | (+) Initialize and configure the FSMC NORSRAM interface |
| 194 | (+) Configure the FSMC clock and associated GPIOs |
194 | (+) De-initialize the FSMC NORSRAM interface |
| 195 | 195 | (+) Configure the FSMC clock and associated GPIOs |
|
| 196 | @endverbatim |
196 | |
| 197 | * @{ |
197 | @endverbatim |
| 198 | */ |
198 | * @{ |
| 199 | 199 | */ |
|
| 200 | /** |
200 | |
| 201 | * @brief Initialize the FSMC_NORSRAM device according to the specified |
201 | /** |
| 202 | * control parameters in the FSMC_NORSRAM_InitTypeDef |
202 | * @brief Initialize the FSMC_NORSRAM device according to the specified |
| 203 | * @param Device Pointer to NORSRAM device instance |
203 | * control parameters in the FSMC_NORSRAM_InitTypeDef |
| 204 | * @param Init Pointer to NORSRAM Initialization structure |
204 | * @param Device Pointer to NORSRAM device instance |
| 205 | * @retval HAL status |
205 | * @param Init Pointer to NORSRAM Initialization structure |
| 206 | */ |
206 | * @retval HAL status |
| 207 | HAL_StatusTypeDef FSMC_NORSRAM_Init(FSMC_NORSRAM_TypeDef *Device, |
207 | */ |
| 208 | FSMC_NORSRAM_InitTypeDef *Init) |
208 | HAL_StatusTypeDef FSMC_NORSRAM_Init(FSMC_NORSRAM_TypeDef *Device, |
| 209 | { |
209 | FSMC_NORSRAM_InitTypeDef *Init) |
| 210 | uint32_t flashaccess; |
210 | { |
| 211 | uint32_t btcr_reg; |
211 | uint32_t flashaccess; |
| 212 | uint32_t mask; |
212 | uint32_t btcr_reg; |
| 213 | 213 | uint32_t mask; |
|
| 214 | /* Check the parameters */ |
214 | |
| 215 | assert_param(IS_FSMC_NORSRAM_DEVICE(Device)); |
215 | /* Check the parameters */ |
| 216 | assert_param(IS_FSMC_NORSRAM_BANK(Init->NSBank)); |
216 | assert_param(IS_FSMC_NORSRAM_DEVICE(Device)); |
| 217 | assert_param(IS_FSMC_MUX(Init->DataAddressMux)); |
217 | assert_param(IS_FSMC_NORSRAM_BANK(Init->NSBank)); |
| 218 | assert_param(IS_FSMC_MEMORY(Init->MemoryType)); |
218 | assert_param(IS_FSMC_MUX(Init->DataAddressMux)); |
| 219 | assert_param(IS_FSMC_NORSRAM_MEMORY_WIDTH(Init->MemoryDataWidth)); |
219 | assert_param(IS_FSMC_MEMORY(Init->MemoryType)); |
| 220 | assert_param(IS_FSMC_BURSTMODE(Init->BurstAccessMode)); |
220 | assert_param(IS_FSMC_NORSRAM_MEMORY_WIDTH(Init->MemoryDataWidth)); |
| 221 | assert_param(IS_FSMC_WAIT_POLARITY(Init->WaitSignalPolarity)); |
221 | assert_param(IS_FSMC_BURSTMODE(Init->BurstAccessMode)); |
| 222 | assert_param(IS_FSMC_WRAP_MODE(Init->WrapMode)); |
222 | assert_param(IS_FSMC_WAIT_POLARITY(Init->WaitSignalPolarity)); |
| 223 | assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(Init->WaitSignalActive)); |
223 | assert_param(IS_FSMC_WRAP_MODE(Init->WrapMode)); |
| 224 | assert_param(IS_FSMC_WRITE_OPERATION(Init->WriteOperation)); |
224 | assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(Init->WaitSignalActive)); |
| 225 | assert_param(IS_FSMC_WAITE_SIGNAL(Init->WaitSignal)); |
225 | assert_param(IS_FSMC_WRITE_OPERATION(Init->WriteOperation)); |
| 226 | assert_param(IS_FSMC_EXTENDED_MODE(Init->ExtendedMode)); |
226 | assert_param(IS_FSMC_WAITE_SIGNAL(Init->WaitSignal)); |
| 227 | assert_param(IS_FSMC_ASYNWAIT(Init->AsynchronousWait)); |
227 | assert_param(IS_FSMC_EXTENDED_MODE(Init->ExtendedMode)); |
| 228 | assert_param(IS_FSMC_WRITE_BURST(Init->WriteBurst)); |
228 | assert_param(IS_FSMC_ASYNWAIT(Init->AsynchronousWait)); |
| 229 | assert_param(IS_FSMC_PAGESIZE(Init->PageSize)); |
229 | assert_param(IS_FSMC_WRITE_BURST(Init->WriteBurst)); |
| 230 | 230 | assert_param(IS_FSMC_PAGESIZE(Init->PageSize)); |
|
| 231 | /* Disable NORSRAM Device */ |
231 | |
| 232 | __FSMC_NORSRAM_DISABLE(Device, Init->NSBank); |
232 | /* Disable NORSRAM Device */ |
| 233 | 233 | __FSMC_NORSRAM_DISABLE(Device, Init->NSBank); |
|
| 234 | /* Set NORSRAM device control parameters */ |
234 | |
| 235 | if (Init->MemoryType == FSMC_MEMORY_TYPE_NOR) |
235 | /* Set NORSRAM device control parameters */ |
| 236 | { |
236 | if (Init->MemoryType == FSMC_MEMORY_TYPE_NOR) |
| 237 | flashaccess = FSMC_NORSRAM_FLASH_ACCESS_ENABLE; |
237 | { |
| 238 | } |
238 | flashaccess = FSMC_NORSRAM_FLASH_ACCESS_ENABLE; |
| 239 | else |
239 | } |
| 240 | { |
240 | else |
| 241 | flashaccess = FSMC_NORSRAM_FLASH_ACCESS_DISABLE; |
241 | { |
| 242 | } |
242 | flashaccess = FSMC_NORSRAM_FLASH_ACCESS_DISABLE; |
| 243 | 243 | } |
|
| 244 | btcr_reg = (flashaccess | \ |
244 | |
| 245 | Init->DataAddressMux | \ |
245 | btcr_reg = (flashaccess | \ |
| 246 | Init->MemoryType | \ |
246 | Init->DataAddressMux | \ |
| 247 | Init->MemoryDataWidth | \ |
247 | Init->MemoryType | \ |
| 248 | Init->BurstAccessMode | \ |
248 | Init->MemoryDataWidth | \ |
| 249 | Init->WaitSignalPolarity | \ |
249 | Init->BurstAccessMode | \ |
| 250 | Init->WaitSignalActive | \ |
250 | Init->WaitSignalPolarity | \ |
| 251 | Init->WriteOperation | \ |
251 | Init->WaitSignalActive | \ |
| 252 | Init->WaitSignal | \ |
252 | Init->WriteOperation | \ |
| 253 | Init->ExtendedMode | \ |
253 | Init->WaitSignal | \ |
| 254 | Init->AsynchronousWait | \ |
254 | Init->ExtendedMode | \ |
| 255 | Init->WriteBurst); |
255 | Init->AsynchronousWait | \ |
| 256 | 256 | Init->WriteBurst); |
|
| 257 | btcr_reg |= Init->WrapMode; |
257 | |
| 258 | btcr_reg |= Init->PageSize; |
258 | btcr_reg |= Init->WrapMode; |
| 259 | 259 | btcr_reg |= Init->PageSize; |
|
| 260 | mask = (FSMC_BCRx_MBKEN | |
260 | |
| 261 | FSMC_BCRx_MUXEN | |
261 | mask = (FSMC_BCRx_MBKEN | |
| 262 | FSMC_BCRx_MTYP | |
262 | FSMC_BCRx_MUXEN | |
| 263 | FSMC_BCRx_MWID | |
263 | FSMC_BCRx_MTYP | |
| 264 | FSMC_BCRx_FACCEN | |
264 | FSMC_BCRx_MWID | |
| 265 | FSMC_BCRx_BURSTEN | |
265 | FSMC_BCRx_FACCEN | |
| 266 | FSMC_BCRx_WAITPOL | |
266 | FSMC_BCRx_BURSTEN | |
| 267 | FSMC_BCRx_WAITCFG | |
267 | FSMC_BCRx_WAITPOL | |
| 268 | FSMC_BCRx_WREN | |
268 | FSMC_BCRx_WAITCFG | |
| 269 | FSMC_BCRx_WAITEN | |
269 | FSMC_BCRx_WREN | |
| 270 | FSMC_BCRx_EXTMOD | |
270 | FSMC_BCRx_WAITEN | |
| 271 | FSMC_BCRx_ASYNCWAIT | |
271 | FSMC_BCRx_EXTMOD | |
| 272 | FSMC_BCRx_CBURSTRW); |
272 | FSMC_BCRx_ASYNCWAIT | |
| 273 | 273 | FSMC_BCRx_CBURSTRW); |
|
| 274 | mask |= FSMC_BCRx_WRAPMOD; |
274 | |
| 275 | mask |= 0x00070000U; /* CPSIZE to be defined in CMSIS file */ |
275 | mask |= FSMC_BCRx_WRAPMOD; |
| 276 | 276 | mask |= 0x00070000U; /* CPSIZE to be defined in CMSIS file */ |
|
| 277 | MODIFY_REG(Device->BTCR[Init->NSBank], mask, btcr_reg); |
277 | |
| 278 | 278 | MODIFY_REG(Device->BTCR[Init->NSBank], mask, btcr_reg); |
|
| 279 | 279 | ||
| 280 | return HAL_OK; |
280 | |
| 281 | } |
281 | return HAL_OK; |
| 282 | 282 | } |
|
| 283 | /** |
283 | |
| 284 | * @brief DeInitialize the FSMC_NORSRAM peripheral |
284 | /** |
| 285 | * @param Device Pointer to NORSRAM device instance |
285 | * @brief DeInitialize the FSMC_NORSRAM peripheral |
| 286 | * @param ExDevice Pointer to NORSRAM extended mode device instance |
286 | * @param Device Pointer to NORSRAM device instance |
| 287 | * @param Bank NORSRAM bank number |
287 | * @param ExDevice Pointer to NORSRAM extended mode device instance |
| 288 | * @retval HAL status |
288 | * @param Bank NORSRAM bank number |
| 289 | */ |
289 | * @retval HAL status |
| 290 | HAL_StatusTypeDef FSMC_NORSRAM_DeInit(FSMC_NORSRAM_TypeDef *Device, |
290 | */ |
| 291 | FSMC_NORSRAM_EXTENDED_TypeDef *ExDevice, uint32_t Bank) |
291 | HAL_StatusTypeDef FSMC_NORSRAM_DeInit(FSMC_NORSRAM_TypeDef *Device, |
| 292 | { |
292 | FSMC_NORSRAM_EXTENDED_TypeDef *ExDevice, uint32_t Bank) |
| 293 | /* Check the parameters */ |
293 | { |
| 294 | assert_param(IS_FSMC_NORSRAM_DEVICE(Device)); |
294 | /* Check the parameters */ |
| 295 | assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(ExDevice)); |
295 | assert_param(IS_FSMC_NORSRAM_DEVICE(Device)); |
| 296 | assert_param(IS_FSMC_NORSRAM_BANK(Bank)); |
296 | assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(ExDevice)); |
| 297 | 297 | assert_param(IS_FSMC_NORSRAM_BANK(Bank)); |
|
| 298 | /* Disable the FSMC_NORSRAM device */ |
298 | |
| 299 | __FSMC_NORSRAM_DISABLE(Device, Bank); |
299 | /* Disable the FSMC_NORSRAM device */ |
| 300 | 300 | __FSMC_NORSRAM_DISABLE(Device, Bank); |
|
| 301 | /* De-initialize the FSMC_NORSRAM device */ |
301 | |
| 302 | /* FSMC_NORSRAM_BANK1 */ |
302 | /* De-initialize the FSMC_NORSRAM device */ |
| 303 | if (Bank == FSMC_NORSRAM_BANK1) |
303 | /* FSMC_NORSRAM_BANK1 */ |
| 304 | { |
304 | if (Bank == FSMC_NORSRAM_BANK1) |
| 305 | Device->BTCR[Bank] = 0x000030DBU; |
305 | { |
| 306 | } |
306 | Device->BTCR[Bank] = 0x000030DBU; |
| 307 | /* FSMC_NORSRAM_BANK2, FSMC_NORSRAM_BANK3 or FSMC_NORSRAM_BANK4 */ |
307 | } |
| 308 | else |
308 | /* FSMC_NORSRAM_BANK2, FSMC_NORSRAM_BANK3 or FSMC_NORSRAM_BANK4 */ |
| 309 | { |
309 | else |
| 310 | Device->BTCR[Bank] = 0x000030D2U; |
310 | { |
| 311 | } |
311 | Device->BTCR[Bank] = 0x000030D2U; |
| 312 | 312 | } |
|
| 313 | Device->BTCR[Bank + 1U] = 0x0FFFFFFFU; |
313 | |
| 314 | ExDevice->BWTR[Bank] = 0x0FFFFFFFU; |
314 | Device->BTCR[Bank + 1U] = 0x0FFFFFFFU; |
| 315 | 315 | ExDevice->BWTR[Bank] = 0x0FFFFFFFU; |
|
| 316 | return HAL_OK; |
316 | |
| 317 | } |
317 | return HAL_OK; |
| 318 | 318 | } |
|
| 319 | /** |
319 | |
| 320 | * @brief Initialize the FSMC_NORSRAM Timing according to the specified |
320 | /** |
| 321 | * parameters in the FSMC_NORSRAM_TimingTypeDef |
321 | * @brief Initialize the FSMC_NORSRAM Timing according to the specified |
| 322 | * @param Device Pointer to NORSRAM device instance |
322 | * parameters in the FSMC_NORSRAM_TimingTypeDef |
| 323 | * @param Timing Pointer to NORSRAM Timing structure |
323 | * @param Device Pointer to NORSRAM device instance |
| 324 | * @param Bank NORSRAM bank number |
324 | * @param Timing Pointer to NORSRAM Timing structure |
| 325 | * @retval HAL status |
325 | * @param Bank NORSRAM bank number |
| 326 | */ |
326 | * @retval HAL status |
| 327 | HAL_StatusTypeDef FSMC_NORSRAM_Timing_Init(FSMC_NORSRAM_TypeDef *Device, |
327 | */ |
| 328 | FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank) |
328 | HAL_StatusTypeDef FSMC_NORSRAM_Timing_Init(FSMC_NORSRAM_TypeDef *Device, |
| 329 | { |
329 | FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank) |
| 330 | 330 | { |
|
| 331 | /* Check the parameters */ |
331 | |
| 332 | assert_param(IS_FSMC_NORSRAM_DEVICE(Device)); |
332 | /* Check the parameters */ |
| 333 | assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime)); |
333 | assert_param(IS_FSMC_NORSRAM_DEVICE(Device)); |
| 334 | assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime)); |
334 | assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime)); |
| 335 | assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime)); |
335 | assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime)); |
| 336 | assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration)); |
336 | assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime)); |
| 337 | assert_param(IS_FSMC_CLK_DIV(Timing->CLKDivision)); |
337 | assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration)); |
| 338 | assert_param(IS_FSMC_DATA_LATENCY(Timing->DataLatency)); |
338 | assert_param(IS_FSMC_CLK_DIV(Timing->CLKDivision)); |
| 339 | assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode)); |
339 | assert_param(IS_FSMC_DATA_LATENCY(Timing->DataLatency)); |
| 340 | assert_param(IS_FSMC_NORSRAM_BANK(Bank)); |
340 | assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode)); |
| 341 | 341 | assert_param(IS_FSMC_NORSRAM_BANK(Bank)); |
|
| 342 | /* Set FSMC_NORSRAM device timing parameters */ |
342 | |
| 343 | MODIFY_REG(Device->BTCR[Bank + 1U], BTR_CLEAR_MASK, (Timing->AddressSetupTime | |
343 | /* Set FSMC_NORSRAM device timing parameters */ |
| 344 | ((Timing->AddressHoldTime) << FSMC_BTRx_ADDHLD_Pos) | |
344 | MODIFY_REG(Device->BTCR[Bank + 1U], BTR_CLEAR_MASK, (Timing->AddressSetupTime | |
| 345 | ((Timing->DataSetupTime) << FSMC_BTRx_DATAST_Pos) | |
345 | ((Timing->AddressHoldTime) << FSMC_BTRx_ADDHLD_Pos) | |
| 346 | ((Timing->BusTurnAroundDuration) << FSMC_BTRx_BUSTURN_Pos) | |
346 | ((Timing->DataSetupTime) << FSMC_BTRx_DATAST_Pos) | |
| 347 | (((Timing->CLKDivision) - 1U) << FSMC_BTRx_CLKDIV_Pos) | |
347 | ((Timing->BusTurnAroundDuration) << FSMC_BTRx_BUSTURN_Pos) | |
| 348 | (((Timing->DataLatency) - 2U) << FSMC_BTRx_DATLAT_Pos) | |
348 | (((Timing->CLKDivision) - 1U) << FSMC_BTRx_CLKDIV_Pos) | |
| 349 | (Timing->AccessMode))); |
349 | (((Timing->DataLatency) - 2U) << FSMC_BTRx_DATLAT_Pos) | |
| 350 | 350 | (Timing->AccessMode))); |
|
| 351 | return HAL_OK; |
351 | |
| 352 | } |
352 | return HAL_OK; |
| 353 | 353 | } |
|
| 354 | /** |
354 | |
| 355 | * @brief Initialize the FSMC_NORSRAM Extended mode Timing according to the specified |
355 | /** |
| 356 | * parameters in the FSMC_NORSRAM_TimingTypeDef |
356 | * @brief Initialize the FSMC_NORSRAM Extended mode Timing according to the specified |
| 357 | * @param Device Pointer to NORSRAM device instance |
357 | * parameters in the FSMC_NORSRAM_TimingTypeDef |
| 358 | * @param Timing Pointer to NORSRAM Timing structure |
358 | * @param Device Pointer to NORSRAM device instance |
| 359 | * @param Bank NORSRAM bank number |
359 | * @param Timing Pointer to NORSRAM Timing structure |
| 360 | * @param ExtendedMode FSMC Extended Mode |
360 | * @param Bank NORSRAM bank number |
| 361 | * This parameter can be one of the following values: |
361 | * @param ExtendedMode FSMC Extended Mode |
| 362 | * @arg FSMC_EXTENDED_MODE_DISABLE |
362 | * This parameter can be one of the following values: |
| 363 | * @arg FSMC_EXTENDED_MODE_ENABLE |
363 | * @arg FSMC_EXTENDED_MODE_DISABLE |
| 364 | * @retval HAL status |
364 | * @arg FSMC_EXTENDED_MODE_ENABLE |
| 365 | */ |
365 | * @retval HAL status |
| 366 | HAL_StatusTypeDef FSMC_NORSRAM_Extended_Timing_Init(FSMC_NORSRAM_EXTENDED_TypeDef *Device, |
366 | */ |
| 367 | FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank, |
367 | HAL_StatusTypeDef FSMC_NORSRAM_Extended_Timing_Init(FSMC_NORSRAM_EXTENDED_TypeDef *Device, |
| 368 | uint32_t ExtendedMode) |
368 | FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank, |
| 369 | { |
369 | uint32_t ExtendedMode) |
| 370 | /* Check the parameters */ |
370 | { |
| 371 | assert_param(IS_FSMC_EXTENDED_MODE(ExtendedMode)); |
371 | /* Check the parameters */ |
| 372 | 372 | assert_param(IS_FSMC_EXTENDED_MODE(ExtendedMode)); |
|
| 373 | /* Set NORSRAM device timing register for write configuration, if extended mode is used */ |
373 | |
| 374 | if (ExtendedMode == FSMC_EXTENDED_MODE_ENABLE) |
374 | /* Set NORSRAM device timing register for write configuration, if extended mode is used */ |
| 375 | { |
375 | if (ExtendedMode == FSMC_EXTENDED_MODE_ENABLE) |
| 376 | /* Check the parameters */ |
376 | { |
| 377 | assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(Device)); |
377 | /* Check the parameters */ |
| 378 | assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime)); |
378 | assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(Device)); |
| 379 | assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime)); |
379 | assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime)); |
| 380 | assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime)); |
380 | assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime)); |
| 381 | #if defined(FSMC_BWTRx_BUSTURN) |
381 | assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime)); |
| 382 | assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration)); |
382 | #if defined(FSMC_BWTRx_BUSTURN) |
| 383 | #else |
383 | assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration)); |
| 384 | assert_param(IS_FSMC_CLK_DIV(Timing->CLKDivision)); |
384 | #else |
| 385 | assert_param(IS_FSMC_DATA_LATENCY(Timing->DataLatency)); |
385 | assert_param(IS_FSMC_CLK_DIV(Timing->CLKDivision)); |
| 386 | #endif /* FSMC_BWTRx_BUSTURN */ |
386 | assert_param(IS_FSMC_DATA_LATENCY(Timing->DataLatency)); |
| 387 | assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode)); |
387 | #endif /* FSMC_BWTRx_BUSTURN */ |
| 388 | assert_param(IS_FSMC_NORSRAM_BANK(Bank)); |
388 | assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode)); |
| 389 | 389 | assert_param(IS_FSMC_NORSRAM_BANK(Bank)); |
|
| 390 | /* Set NORSRAM device timing register for write configuration, if extended mode is used */ |
390 | |
| 391 | #if defined(FSMC_BWTRx_BUSTURN) |
391 | /* Set NORSRAM device timing register for write configuration, if extended mode is used */ |
| 392 | MODIFY_REG(Device->BWTR[Bank], BWTR_CLEAR_MASK, (Timing->AddressSetupTime | |
392 | #if defined(FSMC_BWTRx_BUSTURN) |
| 393 | ((Timing->AddressHoldTime) << FSMC_BWTRx_ADDHLD_Pos) | |
393 | MODIFY_REG(Device->BWTR[Bank], BWTR_CLEAR_MASK, (Timing->AddressSetupTime | |
| 394 | ((Timing->DataSetupTime) << FSMC_BWTRx_DATAST_Pos) | |
394 | ((Timing->AddressHoldTime) << FSMC_BWTRx_ADDHLD_Pos) | |
| 395 | Timing->AccessMode | |
395 | ((Timing->DataSetupTime) << FSMC_BWTRx_DATAST_Pos) | |
| 396 | ((Timing->BusTurnAroundDuration) << FSMC_BWTRx_BUSTURN_Pos))); |
396 | Timing->AccessMode | |
| 397 | #else |
397 | ((Timing->BusTurnAroundDuration) << FSMC_BWTRx_BUSTURN_Pos))); |
| 398 | MODIFY_REG(Device->BWTR[Bank], BWTR_CLEAR_MASK, (Timing->AddressSetupTime | |
398 | #else |
| 399 | ((Timing->AddressHoldTime) << FSMC_BWTRx_ADDHLD_Pos) | |
399 | MODIFY_REG(Device->BWTR[Bank], BWTR_CLEAR_MASK, (Timing->AddressSetupTime | |
| 400 | ((Timing->DataSetupTime) << FSMC_BWTRx_DATAST_Pos) | |
400 | ((Timing->AddressHoldTime) << FSMC_BWTRx_ADDHLD_Pos) | |
| 401 | Timing->AccessMode | |
401 | ((Timing->DataSetupTime) << FSMC_BWTRx_DATAST_Pos) | |
| 402 | (((Timing->CLKDivision) - 1U) << FSMC_BWTRx_CLKDIV_Pos) | |
402 | Timing->AccessMode | |
| 403 | (((Timing->DataLatency) - 2U) << FSMC_BWTRx_DATLAT_Pos))); |
403 | (((Timing->CLKDivision) - 1U) << FSMC_BWTRx_CLKDIV_Pos) | |
| 404 | #endif /* FSMC_BWTRx_BUSTURN */ |
404 | (((Timing->DataLatency) - 2U) << FSMC_BWTRx_DATLAT_Pos))); |
| 405 | } |
405 | #endif /* FSMC_BWTRx_BUSTURN */ |
| 406 | else |
406 | } |
| 407 | { |
407 | else |
| 408 | Device->BWTR[Bank] = 0x0FFFFFFFU; |
408 | { |
| 409 | } |
409 | Device->BWTR[Bank] = 0x0FFFFFFFU; |
| 410 | 410 | } |
|
| 411 | return HAL_OK; |
411 | |
| 412 | } |
412 | return HAL_OK; |
| 413 | /** |
413 | } |
| 414 | * @} |
414 | /** |
| 415 | */ |
415 | * @} |
| 416 | 416 | */ |
|
| 417 | /** @addtogroup FSMC_LL_NORSRAM_Private_Functions_Group2 |
417 | |
| 418 | * @brief management functions |
418 | /** @addtogroup FSMC_LL_NORSRAM_Private_Functions_Group2 |
| 419 | * |
419 | * @brief management functions |
| 420 | @verbatim |
420 | * |
| 421 | ============================================================================== |
421 | @verbatim |
| 422 | ##### FSMC_NORSRAM Control functions ##### |
422 | ============================================================================== |
| 423 | ============================================================================== |
423 | ##### FSMC_NORSRAM Control functions ##### |
| 424 | [..] |
424 | ============================================================================== |
| 425 | This subsection provides a set of functions allowing to control dynamically |
425 | [..] |
| 426 | the FSMC NORSRAM interface. |
426 | This subsection provides a set of functions allowing to control dynamically |
| 427 | 427 | the FSMC NORSRAM interface. |
|
| 428 | @endverbatim |
428 | |
| 429 | * @{ |
429 | @endverbatim |
| 430 | */ |
430 | * @{ |
| 431 | 431 | */ |
|
| 432 | /** |
432 | |
| 433 | * @brief Enables dynamically FSMC_NORSRAM write operation. |
433 | /** |
| 434 | * @param Device Pointer to NORSRAM device instance |
434 | * @brief Enables dynamically FSMC_NORSRAM write operation. |
| 435 | * @param Bank NORSRAM bank number |
435 | * @param Device Pointer to NORSRAM device instance |
| 436 | * @retval HAL status |
436 | * @param Bank NORSRAM bank number |
| 437 | */ |
437 | * @retval HAL status |
| 438 | HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Enable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank) |
438 | */ |
| 439 | { |
439 | HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Enable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank) |
| 440 | /* Check the parameters */ |
440 | { |
| 441 | assert_param(IS_FSMC_NORSRAM_DEVICE(Device)); |
441 | /* Check the parameters */ |
| 442 | assert_param(IS_FSMC_NORSRAM_BANK(Bank)); |
442 | assert_param(IS_FSMC_NORSRAM_DEVICE(Device)); |
| 443 | 443 | assert_param(IS_FSMC_NORSRAM_BANK(Bank)); |
|
| 444 | /* Enable write operation */ |
444 | |
| 445 | SET_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE); |
445 | /* Enable write operation */ |
| 446 | 446 | SET_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE); |
|
| 447 | return HAL_OK; |
447 | |
| 448 | } |
448 | return HAL_OK; |
| 449 | 449 | } |
|
| 450 | /** |
450 | |
| 451 | * @brief Disables dynamically FSMC_NORSRAM write operation. |
451 | /** |
| 452 | * @param Device Pointer to NORSRAM device instance |
452 | * @brief Disables dynamically FSMC_NORSRAM write operation. |
| 453 | * @param Bank NORSRAM bank number |
453 | * @param Device Pointer to NORSRAM device instance |
| 454 | * @retval HAL status |
454 | * @param Bank NORSRAM bank number |
| 455 | */ |
455 | * @retval HAL status |
| 456 | HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Disable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank) |
456 | */ |
| 457 | { |
457 | HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Disable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank) |
| 458 | /* Check the parameters */ |
458 | { |
| 459 | assert_param(IS_FSMC_NORSRAM_DEVICE(Device)); |
459 | /* Check the parameters */ |
| 460 | assert_param(IS_FSMC_NORSRAM_BANK(Bank)); |
460 | assert_param(IS_FSMC_NORSRAM_DEVICE(Device)); |
| 461 | 461 | assert_param(IS_FSMC_NORSRAM_BANK(Bank)); |
|
| 462 | /* Disable write operation */ |
462 | |
| 463 | CLEAR_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE); |
463 | /* Disable write operation */ |
| 464 | 464 | CLEAR_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE); |
|
| 465 | return HAL_OK; |
465 | |
| 466 | } |
466 | return HAL_OK; |
| 467 | 467 | } |
|
| 468 | /** |
468 | |
| 469 | * @} |
469 | /** |
| 470 | */ |
470 | * @} |
| 471 | 471 | */ |
|
| 472 | /** |
472 | |
| 473 | * @} |
473 | /** |
| 474 | */ |
474 | * @} |
| 475 | #endif /* FSMC_BANK1 */ |
475 | */ |
| 476 | 476 | #endif /* FSMC_BANK1 */ |
|
| 477 | #if defined(FSMC_BANK3) |
477 | |
| 478 | 478 | #if defined(FSMC_BANK3) |
|
| 479 | /** @defgroup FSMC_LL_Exported_Functions_NAND FSMC Low Layer NAND Exported Functions |
479 | |
| 480 | * @brief NAND Controller functions |
480 | /** @defgroup FSMC_LL_Exported_Functions_NAND FSMC Low Layer NAND Exported Functions |
| 481 | * |
481 | * @brief NAND Controller functions |
| 482 | @verbatim |
482 | * |
| 483 | ============================================================================== |
483 | @verbatim |
| 484 | ##### How to use NAND device driver ##### |
484 | ============================================================================== |
| 485 | ============================================================================== |
485 | ##### How to use NAND device driver ##### |
| 486 | [..] |
486 | ============================================================================== |
| 487 | This driver contains a set of APIs to interface with the FSMC NAND banks in order |
487 | [..] |
| 488 | to run the NAND external devices. |
488 | This driver contains a set of APIs to interface with the FSMC NAND banks in order |
| 489 | 489 | to run the NAND external devices. |
|
| 490 | (+) FSMC NAND bank reset using the function FSMC_NAND_DeInit() |
490 | |
| 491 | (+) FSMC NAND bank control configuration using the function FSMC_NAND_Init() |
491 | (+) FSMC NAND bank reset using the function FSMC_NAND_DeInit() |
| 492 | (+) FSMC NAND bank common space timing configuration using the function |
492 | (+) FSMC NAND bank control configuration using the function FSMC_NAND_Init() |
| 493 | FSMC_NAND_CommonSpace_Timing_Init() |
493 | (+) FSMC NAND bank common space timing configuration using the function |
| 494 | (+) FSMC NAND bank attribute space timing configuration using the function |
494 | FSMC_NAND_CommonSpace_Timing_Init() |
| 495 | FSMC_NAND_AttributeSpace_Timing_Init() |
495 | (+) FSMC NAND bank attribute space timing configuration using the function |
| 496 | (+) FSMC NAND bank enable/disable ECC correction feature using the functions |
496 | FSMC_NAND_AttributeSpace_Timing_Init() |
| 497 | FSMC_NAND_ECC_Enable()/FSMC_NAND_ECC_Disable() |
497 | (+) FSMC NAND bank enable/disable ECC correction feature using the functions |
| 498 | (+) FSMC NAND bank get ECC correction code using the function FSMC_NAND_GetECC() |
498 | FSMC_NAND_ECC_Enable()/FSMC_NAND_ECC_Disable() |
| 499 | 499 | (+) FSMC NAND bank get ECC correction code using the function FSMC_NAND_GetECC() |
|
| 500 | @endverbatim |
500 | |
| 501 | * @{ |
501 | @endverbatim |
| 502 | */ |
502 | * @{ |
| 503 | 503 | */ |
|
| 504 | /** @defgroup FSMC_LL_NAND_Exported_Functions_Group1 Initialization and de-initialization functions |
504 | |
| 505 | * @brief Initialization and Configuration functions |
505 | /** @defgroup FSMC_LL_NAND_Exported_Functions_Group1 Initialization and de-initialization functions |
| 506 | * |
506 | * @brief Initialization and Configuration functions |
| 507 | @verbatim |
507 | * |
| 508 | ============================================================================== |
508 | @verbatim |
| 509 | ##### Initialization and de_initialization functions ##### |
509 | ============================================================================== |
| 510 | ============================================================================== |
510 | ##### Initialization and de_initialization functions ##### |
| 511 | [..] |
511 | ============================================================================== |
| 512 | This section provides functions allowing to: |
512 | [..] |
| 513 | (+) Initialize and configure the FSMC NAND interface |
513 | This section provides functions allowing to: |
| 514 | (+) De-initialize the FSMC NAND interface |
514 | (+) Initialize and configure the FSMC NAND interface |
| 515 | (+) Configure the FSMC clock and associated GPIOs |
515 | (+) De-initialize the FSMC NAND interface |
| 516 | 516 | (+) Configure the FSMC clock and associated GPIOs |
|
| 517 | @endverbatim |
517 | |
| 518 | * @{ |
518 | @endverbatim |
| 519 | */ |
519 | * @{ |
| 520 | 520 | */ |
|
| 521 | /** |
521 | |
| 522 | * @brief Initializes the FSMC_NAND device according to the specified |
522 | /** |
| 523 | * control parameters in the FSMC_NAND_HandleTypeDef |
523 | * @brief Initializes the FSMC_NAND device according to the specified |
| 524 | * @param Device Pointer to NAND device instance |
524 | * control parameters in the FSMC_NAND_HandleTypeDef |
| 525 | * @param Init Pointer to NAND Initialization structure |
525 | * @param Device Pointer to NAND device instance |
| 526 | * @retval HAL status |
526 | * @param Init Pointer to NAND Initialization structure |
| 527 | */ |
527 | * @retval HAL status |
| 528 | HAL_StatusTypeDef FSMC_NAND_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_InitTypeDef *Init) |
528 | */ |
| 529 | { |
529 | HAL_StatusTypeDef FSMC_NAND_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_InitTypeDef *Init) |
| 530 | /* Check the parameters */ |
530 | { |
| 531 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
531 | /* Check the parameters */ |
| 532 | assert_param(IS_FSMC_NAND_BANK(Init->NandBank)); |
532 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
| 533 | assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature)); |
533 | assert_param(IS_FSMC_NAND_BANK(Init->NandBank)); |
| 534 | assert_param(IS_FSMC_NAND_MEMORY_WIDTH(Init->MemoryDataWidth)); |
534 | assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature)); |
| 535 | assert_param(IS_FSMC_ECC_STATE(Init->EccComputation)); |
535 | assert_param(IS_FSMC_NAND_MEMORY_WIDTH(Init->MemoryDataWidth)); |
| 536 | assert_param(IS_FSMC_ECCPAGE_SIZE(Init->ECCPageSize)); |
536 | assert_param(IS_FSMC_ECC_STATE(Init->EccComputation)); |
| 537 | assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime)); |
537 | assert_param(IS_FSMC_ECCPAGE_SIZE(Init->ECCPageSize)); |
| 538 | assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime)); |
538 | assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime)); |
| 539 | 539 | assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime)); |
|
| 540 | /* Set NAND device control parameters */ |
540 | |
| 541 | if (Init->NandBank == FSMC_NAND_BANK2) |
541 | /* Set NAND device control parameters */ |
| 542 | { |
542 | if (Init->NandBank == FSMC_NAND_BANK2) |
| 543 | /* NAND bank 2 registers configuration */ |
543 | { |
| 544 | MODIFY_REG(Device->PCR2, PCR_CLEAR_MASK, (Init->Waitfeature | |
544 | /* NAND bank 2 registers configuration */ |
| 545 | FSMC_PCR_MEMORY_TYPE_NAND | |
545 | MODIFY_REG(Device->PCR2, PCR_CLEAR_MASK, (Init->Waitfeature | |
| 546 | Init->MemoryDataWidth | |
546 | FSMC_PCR_MEMORY_TYPE_NAND | |
| 547 | Init->EccComputation | |
547 | Init->MemoryDataWidth | |
| 548 | Init->ECCPageSize | |
548 | Init->EccComputation | |
| 549 | ((Init->TCLRSetupTime) << FSMC_PCRx_TCLR_Pos) | |
549 | Init->ECCPageSize | |
| 550 | ((Init->TARSetupTime) << FSMC_PCRx_TAR_Pos))); |
550 | ((Init->TCLRSetupTime) << FSMC_PCRx_TCLR_Pos) | |
| 551 | } |
551 | ((Init->TARSetupTime) << FSMC_PCRx_TAR_Pos))); |
| 552 | else |
552 | } |
| 553 | { |
553 | else |
| 554 | /* NAND bank 3 registers configuration */ |
554 | { |
| 555 | MODIFY_REG(Device->PCR3, PCR_CLEAR_MASK, (Init->Waitfeature | |
555 | /* NAND bank 3 registers configuration */ |
| 556 | FSMC_PCR_MEMORY_TYPE_NAND | |
556 | MODIFY_REG(Device->PCR3, PCR_CLEAR_MASK, (Init->Waitfeature | |
| 557 | Init->MemoryDataWidth | |
557 | FSMC_PCR_MEMORY_TYPE_NAND | |
| 558 | Init->EccComputation | |
558 | Init->MemoryDataWidth | |
| 559 | Init->ECCPageSize | |
559 | Init->EccComputation | |
| 560 | ((Init->TCLRSetupTime) << FSMC_PCRx_TCLR_Pos) | |
560 | Init->ECCPageSize | |
| 561 | ((Init->TARSetupTime) << FSMC_PCRx_TAR_Pos))); |
561 | ((Init->TCLRSetupTime) << FSMC_PCRx_TCLR_Pos) | |
| 562 | } |
562 | ((Init->TARSetupTime) << FSMC_PCRx_TAR_Pos))); |
| 563 | 563 | } |
|
| 564 | return HAL_OK; |
564 | |
| 565 | } |
565 | return HAL_OK; |
| 566 | 566 | } |
|
| 567 | /** |
567 | |
| 568 | * @brief Initializes the FSMC_NAND Common space Timing according to the specified |
568 | /** |
| 569 | * parameters in the FSMC_NAND_PCC_TimingTypeDef |
569 | * @brief Initializes the FSMC_NAND Common space Timing according to the specified |
| 570 | * @param Device Pointer to NAND device instance |
570 | * parameters in the FSMC_NAND_PCC_TimingTypeDef |
| 571 | * @param Timing Pointer to NAND timing structure |
571 | * @param Device Pointer to NAND device instance |
| 572 | * @param Bank NAND bank number |
572 | * @param Timing Pointer to NAND timing structure |
| 573 | * @retval HAL status |
573 | * @param Bank NAND bank number |
| 574 | */ |
574 | * @retval HAL status |
| 575 | HAL_StatusTypeDef FSMC_NAND_CommonSpace_Timing_Init(FSMC_NAND_TypeDef *Device, |
575 | */ |
| 576 | FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank) |
576 | HAL_StatusTypeDef FSMC_NAND_CommonSpace_Timing_Init(FSMC_NAND_TypeDef *Device, |
| 577 | { |
577 | FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank) |
| 578 | /* Check the parameters */ |
578 | { |
| 579 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
579 | /* Check the parameters */ |
| 580 | assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); |
580 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
| 581 | assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); |
581 | assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); |
| 582 | assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); |
582 | assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); |
| 583 | assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); |
583 | assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); |
| 584 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
584 | assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); |
| 585 | 585 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
|
| 586 | /* Set FSMC_NAND device timing parameters */ |
586 | |
| 587 | if (Bank == FSMC_NAND_BANK2) |
587 | /* Set FSMC_NAND device timing parameters */ |
| 588 | { |
588 | if (Bank == FSMC_NAND_BANK2) |
| 589 | /* NAND bank 2 registers configuration */ |
589 | { |
| 590 | MODIFY_REG(Device->PMEM2, PMEM_CLEAR_MASK, (Timing->SetupTime | |
590 | /* NAND bank 2 registers configuration */ |
| 591 | ((Timing->WaitSetupTime) << FSMC_PMEMx_MEMWAITx_Pos) | |
591 | MODIFY_REG(Device->PMEM2, PMEM_CLEAR_MASK, (Timing->SetupTime | |
| 592 | ((Timing->HoldSetupTime) << FSMC_PMEMx_MEMHOLDx_Pos) | |
592 | ((Timing->WaitSetupTime) << FSMC_PMEMx_MEMWAITx_Pos) | |
| 593 | ((Timing->HiZSetupTime) << FSMC_PMEMx_MEMHIZx_Pos))); |
593 | ((Timing->HoldSetupTime) << FSMC_PMEMx_MEMHOLDx_Pos) | |
| 594 | } |
594 | ((Timing->HiZSetupTime) << FSMC_PMEMx_MEMHIZx_Pos))); |
| 595 | else |
595 | } |
| 596 | { |
596 | else |
| 597 | /* NAND bank 3 registers configuration */ |
597 | { |
| 598 | MODIFY_REG(Device->PMEM3, PMEM_CLEAR_MASK, (Timing->SetupTime | |
598 | /* NAND bank 3 registers configuration */ |
| 599 | ((Timing->WaitSetupTime) << FSMC_PMEMx_MEMWAITx_Pos) | |
599 | MODIFY_REG(Device->PMEM3, PMEM_CLEAR_MASK, (Timing->SetupTime | |
| 600 | ((Timing->HoldSetupTime) << FSMC_PMEMx_MEMHOLDx_Pos) | |
600 | ((Timing->WaitSetupTime) << FSMC_PMEMx_MEMWAITx_Pos) | |
| 601 | ((Timing->HiZSetupTime) << FSMC_PMEMx_MEMHIZx_Pos))); |
601 | ((Timing->HoldSetupTime) << FSMC_PMEMx_MEMHOLDx_Pos) | |
| 602 | } |
602 | ((Timing->HiZSetupTime) << FSMC_PMEMx_MEMHIZx_Pos))); |
| 603 | 603 | } |
|
| 604 | return HAL_OK; |
604 | |
| 605 | } |
605 | return HAL_OK; |
| 606 | 606 | } |
|
| 607 | /** |
607 | |
| 608 | * @brief Initializes the FSMC_NAND Attribute space Timing according to the specified |
608 | /** |
| 609 | * parameters in the FSMC_NAND_PCC_TimingTypeDef |
609 | * @brief Initializes the FSMC_NAND Attribute space Timing according to the specified |
| 610 | * @param Device Pointer to NAND device instance |
610 | * parameters in the FSMC_NAND_PCC_TimingTypeDef |
| 611 | * @param Timing Pointer to NAND timing structure |
611 | * @param Device Pointer to NAND device instance |
| 612 | * @param Bank NAND bank number |
612 | * @param Timing Pointer to NAND timing structure |
| 613 | * @retval HAL status |
613 | * @param Bank NAND bank number |
| 614 | */ |
614 | * @retval HAL status |
| 615 | HAL_StatusTypeDef FSMC_NAND_AttributeSpace_Timing_Init(FSMC_NAND_TypeDef *Device, |
615 | */ |
| 616 | FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank) |
616 | HAL_StatusTypeDef FSMC_NAND_AttributeSpace_Timing_Init(FSMC_NAND_TypeDef *Device, |
| 617 | { |
617 | FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank) |
| 618 | /* Check the parameters */ |
618 | { |
| 619 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
619 | /* Check the parameters */ |
| 620 | assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); |
620 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
| 621 | assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); |
621 | assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); |
| 622 | assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); |
622 | assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); |
| 623 | assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); |
623 | assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); |
| 624 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
624 | assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); |
| 625 | 625 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
|
| 626 | /* Set FSMC_NAND device timing parameters */ |
626 | |
| 627 | if (Bank == FSMC_NAND_BANK2) |
627 | /* Set FSMC_NAND device timing parameters */ |
| 628 | { |
628 | if (Bank == FSMC_NAND_BANK2) |
| 629 | /* NAND bank 2 registers configuration */ |
629 | { |
| 630 | MODIFY_REG(Device->PATT2, PATT_CLEAR_MASK, (Timing->SetupTime | |
630 | /* NAND bank 2 registers configuration */ |
| 631 | ((Timing->WaitSetupTime) << FSMC_PATTx_ATTWAITx_Pos) | |
631 | MODIFY_REG(Device->PATT2, PATT_CLEAR_MASK, (Timing->SetupTime | |
| 632 | ((Timing->HoldSetupTime) << FSMC_PATTx_ATTHOLDx_Pos) | |
632 | ((Timing->WaitSetupTime) << FSMC_PATTx_ATTWAITx_Pos) | |
| 633 | ((Timing->HiZSetupTime) << FSMC_PATTx_ATTHIZx_Pos))); |
633 | ((Timing->HoldSetupTime) << FSMC_PATTx_ATTHOLDx_Pos) | |
| 634 | } |
634 | ((Timing->HiZSetupTime) << FSMC_PATTx_ATTHIZx_Pos))); |
| 635 | else |
635 | } |
| 636 | { |
636 | else |
| 637 | /* NAND bank 3 registers configuration */ |
637 | { |
| 638 | MODIFY_REG(Device->PATT3, PATT_CLEAR_MASK, (Timing->SetupTime | |
638 | /* NAND bank 3 registers configuration */ |
| 639 | ((Timing->WaitSetupTime) << FSMC_PATTx_ATTWAITx_Pos) | |
639 | MODIFY_REG(Device->PATT3, PATT_CLEAR_MASK, (Timing->SetupTime | |
| 640 | ((Timing->HoldSetupTime) << FSMC_PATTx_ATTHOLDx_Pos) | |
640 | ((Timing->WaitSetupTime) << FSMC_PATTx_ATTWAITx_Pos) | |
| 641 | ((Timing->HiZSetupTime) << FSMC_PATTx_ATTHIZx_Pos))); |
641 | ((Timing->HoldSetupTime) << FSMC_PATTx_ATTHOLDx_Pos) | |
| 642 | } |
642 | ((Timing->HiZSetupTime) << FSMC_PATTx_ATTHIZx_Pos))); |
| 643 | 643 | } |
|
| 644 | return HAL_OK; |
644 | |
| 645 | } |
645 | return HAL_OK; |
| 646 | 646 | } |
|
| 647 | /** |
647 | |
| 648 | * @brief DeInitializes the FSMC_NAND device |
648 | /** |
| 649 | * @param Device Pointer to NAND device instance |
649 | * @brief DeInitializes the FSMC_NAND device |
| 650 | * @param Bank NAND bank number |
650 | * @param Device Pointer to NAND device instance |
| 651 | * @retval HAL status |
651 | * @param Bank NAND bank number |
| 652 | */ |
652 | * @retval HAL status |
| 653 | HAL_StatusTypeDef FSMC_NAND_DeInit(FSMC_NAND_TypeDef *Device, uint32_t Bank) |
653 | */ |
| 654 | { |
654 | HAL_StatusTypeDef FSMC_NAND_DeInit(FSMC_NAND_TypeDef *Device, uint32_t Bank) |
| 655 | /* Check the parameters */ |
655 | { |
| 656 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
656 | /* Check the parameters */ |
| 657 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
657 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
| 658 | 658 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
|
| 659 | /* Disable the NAND Bank */ |
659 | |
| 660 | __FSMC_NAND_DISABLE(Device, Bank); |
660 | /* Disable the NAND Bank */ |
| 661 | 661 | __FSMC_NAND_DISABLE(Device, Bank); |
|
| 662 | /* De-initialize the NAND Bank */ |
662 | |
| 663 | if (Bank == FSMC_NAND_BANK2) |
663 | /* De-initialize the NAND Bank */ |
| 664 | { |
664 | if (Bank == FSMC_NAND_BANK2) |
| 665 | /* Set the FSMC_NAND_BANK2 registers to their reset values */ |
665 | { |
| 666 | WRITE_REG(Device->PCR2, 0x00000018U); |
666 | /* Set the FSMC_NAND_BANK2 registers to their reset values */ |
| 667 | WRITE_REG(Device->SR2, 0x00000040U); |
667 | WRITE_REG(Device->PCR2, 0x00000018U); |
| 668 | WRITE_REG(Device->PMEM2, 0xFCFCFCFCU); |
668 | WRITE_REG(Device->SR2, 0x00000040U); |
| 669 | WRITE_REG(Device->PATT2, 0xFCFCFCFCU); |
669 | WRITE_REG(Device->PMEM2, 0xFCFCFCFCU); |
| 670 | } |
670 | WRITE_REG(Device->PATT2, 0xFCFCFCFCU); |
| 671 | /* FSMC_Bank3_NAND */ |
671 | } |
| 672 | else |
672 | /* FSMC_Bank3_NAND */ |
| 673 | { |
673 | else |
| 674 | /* Set the FSMC_NAND_BANK3 registers to their reset values */ |
674 | { |
| 675 | WRITE_REG(Device->PCR3, 0x00000018U); |
675 | /* Set the FSMC_NAND_BANK3 registers to their reset values */ |
| 676 | WRITE_REG(Device->SR3, 0x00000040U); |
676 | WRITE_REG(Device->PCR3, 0x00000018U); |
| 677 | WRITE_REG(Device->PMEM3, 0xFCFCFCFCU); |
677 | WRITE_REG(Device->SR3, 0x00000040U); |
| 678 | WRITE_REG(Device->PATT3, 0xFCFCFCFCU); |
678 | WRITE_REG(Device->PMEM3, 0xFCFCFCFCU); |
| 679 | } |
679 | WRITE_REG(Device->PATT3, 0xFCFCFCFCU); |
| 680 | 680 | } |
|
| 681 | return HAL_OK; |
681 | |
| 682 | } |
682 | return HAL_OK; |
| 683 | 683 | } |
|
| 684 | /** |
684 | |
| 685 | * @} |
685 | /** |
| 686 | */ |
686 | * @} |
| 687 | 687 | */ |
|
| 688 | /** @defgroup HAL_FSMC_NAND_Group2 Peripheral Control functions |
688 | |
| 689 | * @brief management functions |
689 | /** @defgroup HAL_FSMC_NAND_Group2 Peripheral Control functions |
| 690 | * |
690 | * @brief management functions |
| 691 | @verbatim |
691 | * |
| 692 | ============================================================================== |
692 | @verbatim |
| 693 | ##### FSMC_NAND Control functions ##### |
693 | ============================================================================== |
| 694 | ============================================================================== |
694 | ##### FSMC_NAND Control functions ##### |
| 695 | [..] |
695 | ============================================================================== |
| 696 | This subsection provides a set of functions allowing to control dynamically |
696 | [..] |
| 697 | the FSMC NAND interface. |
697 | This subsection provides a set of functions allowing to control dynamically |
| 698 | 698 | the FSMC NAND interface. |
|
| 699 | @endverbatim |
699 | |
| 700 | * @{ |
700 | @endverbatim |
| 701 | */ |
701 | * @{ |
| 702 | 702 | */ |
|
| 703 | 703 | ||
| 704 | /** |
704 | |
| 705 | * @brief Enables dynamically FSMC_NAND ECC feature. |
705 | /** |
| 706 | * @param Device Pointer to NAND device instance |
706 | * @brief Enables dynamically FSMC_NAND ECC feature. |
| 707 | * @param Bank NAND bank number |
707 | * @param Device Pointer to NAND device instance |
| 708 | * @retval HAL status |
708 | * @param Bank NAND bank number |
| 709 | */ |
709 | * @retval HAL status |
| 710 | HAL_StatusTypeDef FSMC_NAND_ECC_Enable(FSMC_NAND_TypeDef *Device, uint32_t Bank) |
710 | */ |
| 711 | { |
711 | HAL_StatusTypeDef FSMC_NAND_ECC_Enable(FSMC_NAND_TypeDef *Device, uint32_t Bank) |
| 712 | /* Check the parameters */ |
712 | { |
| 713 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
713 | /* Check the parameters */ |
| 714 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
714 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
| 715 | 715 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
|
| 716 | /* Enable ECC feature */ |
716 | |
| 717 | if (Bank == FSMC_NAND_BANK2) |
717 | /* Enable ECC feature */ |
| 718 | { |
718 | if (Bank == FSMC_NAND_BANK2) |
| 719 | SET_BIT(Device->PCR2, FSMC_PCRx_ECCEN); |
719 | { |
| 720 | } |
720 | SET_BIT(Device->PCR2, FSMC_PCRx_ECCEN); |
| 721 | else |
721 | } |
| 722 | { |
722 | else |
| 723 | SET_BIT(Device->PCR3, FSMC_PCRx_ECCEN); |
723 | { |
| 724 | } |
724 | SET_BIT(Device->PCR3, FSMC_PCRx_ECCEN); |
| 725 | 725 | } |
|
| 726 | return HAL_OK; |
726 | |
| 727 | } |
727 | return HAL_OK; |
| 728 | 728 | } |
|
| 729 | 729 | ||
| 730 | /** |
730 | |
| 731 | * @brief Disables dynamically FSMC_NAND ECC feature. |
731 | /** |
| 732 | * @param Device Pointer to NAND device instance |
732 | * @brief Disables dynamically FSMC_NAND ECC feature. |
| 733 | * @param Bank NAND bank number |
733 | * @param Device Pointer to NAND device instance |
| 734 | * @retval HAL status |
734 | * @param Bank NAND bank number |
| 735 | */ |
735 | * @retval HAL status |
| 736 | HAL_StatusTypeDef FSMC_NAND_ECC_Disable(FSMC_NAND_TypeDef *Device, uint32_t Bank) |
736 | */ |
| 737 | { |
737 | HAL_StatusTypeDef FSMC_NAND_ECC_Disable(FSMC_NAND_TypeDef *Device, uint32_t Bank) |
| 738 | /* Check the parameters */ |
738 | { |
| 739 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
739 | /* Check the parameters */ |
| 740 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
740 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
| 741 | 741 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
|
| 742 | /* Disable ECC feature */ |
742 | |
| 743 | if (Bank == FSMC_NAND_BANK2) |
743 | /* Disable ECC feature */ |
| 744 | { |
744 | if (Bank == FSMC_NAND_BANK2) |
| 745 | CLEAR_BIT(Device->PCR2, FSMC_PCRx_ECCEN); |
745 | { |
| 746 | } |
746 | CLEAR_BIT(Device->PCR2, FSMC_PCRx_ECCEN); |
| 747 | else |
747 | } |
| 748 | { |
748 | else |
| 749 | CLEAR_BIT(Device->PCR3, FSMC_PCRx_ECCEN); |
749 | { |
| 750 | } |
750 | CLEAR_BIT(Device->PCR3, FSMC_PCRx_ECCEN); |
| 751 | 751 | } |
|
| 752 | return HAL_OK; |
752 | |
| 753 | } |
753 | return HAL_OK; |
| 754 | 754 | } |
|
| 755 | /** |
755 | |
| 756 | * @brief Disables dynamically FSMC_NAND ECC feature. |
756 | /** |
| 757 | * @param Device Pointer to NAND device instance |
757 | * @brief Disables dynamically FSMC_NAND ECC feature. |
| 758 | * @param ECCval Pointer to ECC value |
758 | * @param Device Pointer to NAND device instance |
| 759 | * @param Bank NAND bank number |
759 | * @param ECCval Pointer to ECC value |
| 760 | * @param Timeout Timeout wait value |
760 | * @param Bank NAND bank number |
| 761 | * @retval HAL status |
761 | * @param Timeout Timeout wait value |
| 762 | */ |
762 | * @retval HAL status |
| 763 | HAL_StatusTypeDef FSMC_NAND_GetECC(FSMC_NAND_TypeDef *Device, uint32_t *ECCval, uint32_t Bank, |
763 | */ |
| 764 | uint32_t Timeout) |
764 | HAL_StatusTypeDef FSMC_NAND_GetECC(FSMC_NAND_TypeDef *Device, uint32_t *ECCval, uint32_t Bank, |
| 765 | { |
765 | uint32_t Timeout) |
| 766 | uint32_t tickstart; |
766 | { |
| 767 | 767 | uint32_t tickstart; |
|
| 768 | /* Check the parameters */ |
768 | |
| 769 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
769 | /* Check the parameters */ |
| 770 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
770 | assert_param(IS_FSMC_NAND_DEVICE(Device)); |
| 771 | 771 | assert_param(IS_FSMC_NAND_BANK(Bank)); |
|
| 772 | /* Get tick */ |
772 | |
| 773 | tickstart = HAL_GetTick(); |
773 | /* Get tick */ |
| 774 | 774 | tickstart = HAL_GetTick(); |
|
| 775 | /* Wait until FIFO is empty */ |
775 | |
| 776 | while (__FSMC_NAND_GET_FLAG(Device, Bank, FSMC_FLAG_FEMPT) == RESET) |
776 | /* Wait until FIFO is empty */ |
| 777 | { |
777 | while (__FSMC_NAND_GET_FLAG(Device, Bank, FSMC_FLAG_FEMPT) == RESET) |
| 778 | /* Check for the Timeout */ |
778 | { |
| 779 | if (Timeout != HAL_MAX_DELAY) |
779 | /* Check for the Timeout */ |
| 780 | { |
780 | if (Timeout != HAL_MAX_DELAY) |
| 781 | if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) |
781 | { |
| 782 | { |
782 | if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) |
| 783 | return HAL_TIMEOUT; |
783 | { |
| 784 | } |
784 | return HAL_TIMEOUT; |
| 785 | } |
785 | } |
| 786 | } |
786 | } |
| 787 | 787 | } |
|
| 788 | if (Bank == FSMC_NAND_BANK2) |
788 | |
| 789 | { |
789 | if (Bank == FSMC_NAND_BANK2) |
| 790 | /* Get the ECCR2 register value */ |
790 | { |
| 791 | *ECCval = (uint32_t)Device->ECCR2; |
791 | /* Get the ECCR2 register value */ |
| 792 | } |
792 | *ECCval = (uint32_t)Device->ECCR2; |
| 793 | else |
793 | } |
| 794 | { |
794 | else |
| 795 | /* Get the ECCR3 register value */ |
795 | { |
| 796 | *ECCval = (uint32_t)Device->ECCR3; |
796 | /* Get the ECCR3 register value */ |
| 797 | } |
797 | *ECCval = (uint32_t)Device->ECCR3; |
| 798 | 798 | } |
|
| 799 | return HAL_OK; |
799 | |
| 800 | } |
800 | return HAL_OK; |
| 801 | 801 | } |
|
| 802 | /** |
802 | |
| 803 | * @} |
803 | /** |
| 804 | */ |
804 | * @} |
| 805 | #endif /* FSMC_BANK3 */ |
805 | */ |
| 806 | 806 | #endif /* FSMC_BANK3 */ |
|
| 807 | #if defined(FSMC_BANK4) |
807 | |
| 808 | 808 | #if defined(FSMC_BANK4) |
|
| 809 | /** @addtogroup FSMC_LL_PCCARD |
809 | |
| 810 | * @brief PCCARD Controller functions |
810 | /** @addtogroup FSMC_LL_PCCARD |
| 811 | * |
811 | * @brief PCCARD Controller functions |
| 812 | @verbatim |
812 | * |
| 813 | ============================================================================== |
813 | @verbatim |
| 814 | ##### How to use PCCARD device driver ##### |
814 | ============================================================================== |
| 815 | ============================================================================== |
815 | ##### How to use PCCARD device driver ##### |
| 816 | [..] |
816 | ============================================================================== |
| 817 | This driver contains a set of APIs to interface with the FSMC PCCARD bank in order |
817 | [..] |
| 818 | to run the PCCARD/compact flash external devices. |
818 | This driver contains a set of APIs to interface with the FSMC PCCARD bank in order |
| 819 | 819 | to run the PCCARD/compact flash external devices. |
|
| 820 | (+) FSMC PCCARD bank reset using the function FSMC_PCCARD_DeInit() |
820 | |
| 821 | (+) FSMC PCCARD bank control configuration using the function FSMC_PCCARD_Init() |
821 | (+) FSMC PCCARD bank reset using the function FSMC_PCCARD_DeInit() |
| 822 | (+) FSMC PCCARD bank common space timing configuration using the function |
822 | (+) FSMC PCCARD bank control configuration using the function FSMC_PCCARD_Init() |
| 823 | FSMC_PCCARD_CommonSpace_Timing_Init() |
823 | (+) FSMC PCCARD bank common space timing configuration using the function |
| 824 | (+) FSMC PCCARD bank attribute space timing configuration using the function |
824 | FSMC_PCCARD_CommonSpace_Timing_Init() |
| 825 | FSMC_PCCARD_AttributeSpace_Timing_Init() |
825 | (+) FSMC PCCARD bank attribute space timing configuration using the function |
| 826 | (+) FSMC PCCARD bank IO space timing configuration using the function |
826 | FSMC_PCCARD_AttributeSpace_Timing_Init() |
| 827 | FSMC_PCCARD_IOSpace_Timing_Init() |
827 | (+) FSMC PCCARD bank IO space timing configuration using the function |
| 828 | @endverbatim |
828 | FSMC_PCCARD_IOSpace_Timing_Init() |
| 829 | * @{ |
829 | @endverbatim |
| 830 | */ |
830 | * @{ |
| 831 | 831 | */ |
|
| 832 | /** @addtogroup FSMC_LL_PCCARD_Private_Functions_Group1 |
832 | |
| 833 | * @brief Initialization and Configuration functions |
833 | /** @addtogroup FSMC_LL_PCCARD_Private_Functions_Group1 |
| 834 | * |
834 | * @brief Initialization and Configuration functions |
| 835 | @verbatim |
835 | * |
| 836 | ============================================================================== |
836 | @verbatim |
| 837 | ##### Initialization and de_initialization functions ##### |
837 | ============================================================================== |
| 838 | ============================================================================== |
838 | ##### Initialization and de_initialization functions ##### |
| 839 | [..] |
839 | ============================================================================== |
| 840 | This section provides functions allowing to: |
840 | [..] |
| 841 | (+) Initialize and configure the FSMC PCCARD interface |
841 | This section provides functions allowing to: |
| 842 | (+) De-initialize the FSMC PCCARD interface |
842 | (+) Initialize and configure the FSMC PCCARD interface |
| 843 | (+) Configure the FSMC clock and associated GPIOs |
843 | (+) De-initialize the FSMC PCCARD interface |
| 844 | 844 | (+) Configure the FSMC clock and associated GPIOs |
|
| 845 | @endverbatim |
845 | |
| 846 | * @{ |
846 | @endverbatim |
| 847 | */ |
847 | * @{ |
| 848 | 848 | */ |
|
| 849 | /** |
849 | |
| 850 | * @brief Initializes the FSMC_PCCARD device according to the specified |
850 | /** |
| 851 | * control parameters in the FSMC_PCCARD_HandleTypeDef |
851 | * @brief Initializes the FSMC_PCCARD device according to the specified |
| 852 | * @param Device Pointer to PCCARD device instance |
852 | * control parameters in the FSMC_PCCARD_HandleTypeDef |
| 853 | * @param Init Pointer to PCCARD Initialization structure |
853 | * @param Device Pointer to PCCARD device instance |
| 854 | * @retval HAL status |
854 | * @param Init Pointer to PCCARD Initialization structure |
| 855 | */ |
855 | * @retval HAL status |
| 856 | HAL_StatusTypeDef FSMC_PCCARD_Init(FSMC_PCCARD_TypeDef *Device, FSMC_PCCARD_InitTypeDef *Init) |
856 | */ |
| 857 | { |
857 | HAL_StatusTypeDef FSMC_PCCARD_Init(FSMC_PCCARD_TypeDef *Device, FSMC_PCCARD_InitTypeDef *Init) |
| 858 | /* Check the parameters */ |
858 | { |
| 859 | assert_param(IS_FSMC_PCCARD_DEVICE(Device)); |
859 | /* Check the parameters */ |
| 860 | #if defined(FSMC_BANK3) |
860 | assert_param(IS_FSMC_PCCARD_DEVICE(Device)); |
| 861 | assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature)); |
861 | #if defined(FSMC_BANK3) |
| 862 | assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime)); |
862 | assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature)); |
| 863 | assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime)); |
863 | assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime)); |
| 864 | #endif /* FSMC_BANK3 */ |
864 | assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime)); |
| 865 | 865 | #endif /* FSMC_BANK3 */ |
|
| 866 | /* Set FSMC_PCCARD device control parameters */ |
866 | |
| 867 | MODIFY_REG(Device->PCR4, |
867 | /* Set FSMC_PCCARD device control parameters */ |
| 868 | (FSMC_PCRx_PTYP | |
868 | MODIFY_REG(Device->PCR4, |
| 869 | FSMC_PCRx_PWAITEN | |
869 | (FSMC_PCRx_PTYP | |
| 870 | FSMC_PCRx_PWID | |
870 | FSMC_PCRx_PWAITEN | |
| 871 | FSMC_PCRx_TCLR | |
871 | FSMC_PCRx_PWID | |
| 872 | FSMC_PCRx_TAR), |
872 | FSMC_PCRx_TCLR | |
| 873 | (FSMC_PCR_MEMORY_TYPE_PCCARD | |
873 | FSMC_PCRx_TAR), |
| 874 | Init->Waitfeature | |
874 | (FSMC_PCR_MEMORY_TYPE_PCCARD | |
| 875 | FSMC_NAND_PCC_MEM_BUS_WIDTH_16 | |
875 | Init->Waitfeature | |
| 876 | (Init->TCLRSetupTime << FSMC_PCRx_TCLR_Pos) | |
876 | FSMC_NAND_PCC_MEM_BUS_WIDTH_16 | |
| 877 | (Init->TARSetupTime << FSMC_PCRx_TAR_Pos))); |
877 | (Init->TCLRSetupTime << FSMC_PCRx_TCLR_Pos) | |
| 878 | 878 | (Init->TARSetupTime << FSMC_PCRx_TAR_Pos))); |
|
| 879 | return HAL_OK; |
879 | |
| 880 | } |
880 | return HAL_OK; |
| 881 | 881 | } |
|
| 882 | /** |
882 | |
| 883 | * @brief Initializes the FSMC_PCCARD Common space Timing according to the specified |
883 | /** |
| 884 | * parameters in the FSMC_NAND_PCC_TimingTypeDef |
884 | * @brief Initializes the FSMC_PCCARD Common space Timing according to the specified |
| 885 | * @param Device Pointer to PCCARD device instance |
885 | * parameters in the FSMC_NAND_PCC_TimingTypeDef |
| 886 | * @param Timing Pointer to PCCARD timing structure |
886 | * @param Device Pointer to PCCARD device instance |
| 887 | * @retval HAL status |
887 | * @param Timing Pointer to PCCARD timing structure |
| 888 | */ |
888 | * @retval HAL status |
| 889 | HAL_StatusTypeDef FSMC_PCCARD_CommonSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, |
889 | */ |
| 890 | FSMC_NAND_PCC_TimingTypeDef *Timing) |
890 | HAL_StatusTypeDef FSMC_PCCARD_CommonSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, |
| 891 | { |
891 | FSMC_NAND_PCC_TimingTypeDef *Timing) |
| 892 | /* Check the parameters */ |
892 | { |
| 893 | assert_param(IS_FSMC_PCCARD_DEVICE(Device)); |
893 | /* Check the parameters */ |
| 894 | #if defined(FSMC_BANK3) |
894 | assert_param(IS_FSMC_PCCARD_DEVICE(Device)); |
| 895 | assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); |
895 | #if defined(FSMC_BANK3) |
| 896 | assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); |
896 | assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); |
| 897 | assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); |
897 | assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); |
| 898 | assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); |
898 | assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); |
| 899 | #endif /* FSMC_BANK3 */ |
899 | assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); |
| 900 | 900 | #endif /* FSMC_BANK3 */ |
|
| 901 | /* Set PCCARD timing parameters */ |
901 | |
| 902 | MODIFY_REG(Device->PMEM4, PMEM_CLEAR_MASK, |
902 | /* Set PCCARD timing parameters */ |
| 903 | (Timing->SetupTime | |
903 | MODIFY_REG(Device->PMEM4, PMEM_CLEAR_MASK, |
| 904 | ((Timing->WaitSetupTime) << FSMC_PMEMx_MEMWAITx_Pos) | |
904 | (Timing->SetupTime | |
| 905 | ((Timing->HoldSetupTime) << FSMC_PMEMx_MEMHOLDx_Pos) | |
905 | ((Timing->WaitSetupTime) << FSMC_PMEMx_MEMWAITx_Pos) | |
| 906 | ((Timing->HiZSetupTime) << FSMC_PMEMx_MEMHIZx_Pos))); |
906 | ((Timing->HoldSetupTime) << FSMC_PMEMx_MEMHOLDx_Pos) | |
| 907 | 907 | ((Timing->HiZSetupTime) << FSMC_PMEMx_MEMHIZx_Pos))); |
|
| 908 | return HAL_OK; |
908 | |
| 909 | } |
909 | return HAL_OK; |
| 910 | 910 | } |
|
| 911 | /** |
911 | |
| 912 | * @brief Initializes the FSMC_PCCARD Attribute space Timing according to the specified |
912 | /** |
| 913 | * parameters in the FSMC_NAND_PCC_TimingTypeDef |
913 | * @brief Initializes the FSMC_PCCARD Attribute space Timing according to the specified |
| 914 | * @param Device Pointer to PCCARD device instance |
914 | * parameters in the FSMC_NAND_PCC_TimingTypeDef |
| 915 | * @param Timing Pointer to PCCARD timing structure |
915 | * @param Device Pointer to PCCARD device instance |
| 916 | * @retval HAL status |
916 | * @param Timing Pointer to PCCARD timing structure |
| 917 | */ |
917 | * @retval HAL status |
| 918 | HAL_StatusTypeDef FSMC_PCCARD_AttributeSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, |
918 | */ |
| 919 | FSMC_NAND_PCC_TimingTypeDef *Timing) |
919 | HAL_StatusTypeDef FSMC_PCCARD_AttributeSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, |
| 920 | { |
920 | FSMC_NAND_PCC_TimingTypeDef *Timing) |
| 921 | /* Check the parameters */ |
921 | { |
| 922 | assert_param(IS_FSMC_PCCARD_DEVICE(Device)); |
922 | /* Check the parameters */ |
| 923 | #if defined(FSMC_BANK3) |
923 | assert_param(IS_FSMC_PCCARD_DEVICE(Device)); |
| 924 | assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); |
924 | #if defined(FSMC_BANK3) |
| 925 | assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); |
925 | assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); |
| 926 | assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); |
926 | assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); |
| 927 | assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); |
927 | assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); |
| 928 | #endif /* FSMC_BANK3 */ |
928 | assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); |
| 929 | 929 | #endif /* FSMC_BANK3 */ |
|
| 930 | /* Set PCCARD timing parameters */ |
930 | |
| 931 | MODIFY_REG(Device->PATT4, PATT_CLEAR_MASK, |
931 | /* Set PCCARD timing parameters */ |
| 932 | (Timing->SetupTime | |
932 | MODIFY_REG(Device->PATT4, PATT_CLEAR_MASK, |
| 933 | ((Timing->WaitSetupTime) << FSMC_PATTx_ATTWAITx_Pos) | |
933 | (Timing->SetupTime | |
| 934 | ((Timing->HoldSetupTime) << FSMC_PATTx_ATTHOLDx_Pos) | |
934 | ((Timing->WaitSetupTime) << FSMC_PATTx_ATTWAITx_Pos) | |
| 935 | ((Timing->HiZSetupTime) << FSMC_PATTx_ATTHIZx_Pos))); |
935 | ((Timing->HoldSetupTime) << FSMC_PATTx_ATTHOLDx_Pos) | |
| 936 | 936 | ((Timing->HiZSetupTime) << FSMC_PATTx_ATTHIZx_Pos))); |
|
| 937 | return HAL_OK; |
937 | |
| 938 | } |
938 | return HAL_OK; |
| 939 | 939 | } |
|
| 940 | /** |
940 | |
| 941 | * @brief Initializes the FSMC_PCCARD IO space Timing according to the specified |
941 | /** |
| 942 | * parameters in the FSMC_NAND_PCC_TimingTypeDef |
942 | * @brief Initializes the FSMC_PCCARD IO space Timing according to the specified |
| 943 | * @param Device Pointer to PCCARD device instance |
943 | * parameters in the FSMC_NAND_PCC_TimingTypeDef |
| 944 | * @param Timing Pointer to PCCARD timing structure |
944 | * @param Device Pointer to PCCARD device instance |
| 945 | * @retval HAL status |
945 | * @param Timing Pointer to PCCARD timing structure |
| 946 | */ |
946 | * @retval HAL status |
| 947 | HAL_StatusTypeDef FSMC_PCCARD_IOSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, |
947 | */ |
| 948 | FSMC_NAND_PCC_TimingTypeDef *Timing) |
948 | HAL_StatusTypeDef FSMC_PCCARD_IOSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, |
| 949 | { |
949 | FSMC_NAND_PCC_TimingTypeDef *Timing) |
| 950 | /* Check the parameters */ |
950 | { |
| 951 | assert_param(IS_FSMC_PCCARD_DEVICE(Device)); |
951 | /* Check the parameters */ |
| 952 | #if defined(FSMC_BANK3) |
952 | assert_param(IS_FSMC_PCCARD_DEVICE(Device)); |
| 953 | assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); |
953 | #if defined(FSMC_BANK3) |
| 954 | assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); |
954 | assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); |
| 955 | assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); |
955 | assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); |
| 956 | assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); |
956 | assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); |
| 957 | #endif /* FSMC_BANK3 */ |
957 | assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); |
| 958 | 958 | #endif /* FSMC_BANK3 */ |
|
| 959 | /* Set FSMC_PCCARD device timing parameters */ |
959 | |
| 960 | MODIFY_REG(Device->PIO4, PIO4_CLEAR_MASK, |
960 | /* Set FSMC_PCCARD device timing parameters */ |
| 961 | (Timing->SetupTime | |
961 | MODIFY_REG(Device->PIO4, PIO4_CLEAR_MASK, |
| 962 | (Timing->WaitSetupTime << FSMC_PIO4_IOWAIT4_Pos) | |
962 | (Timing->SetupTime | |
| 963 | (Timing->HoldSetupTime << FSMC_PIO4_IOHOLD4_Pos) | |
963 | (Timing->WaitSetupTime << FSMC_PIO4_IOWAIT4_Pos) | |
| 964 | (Timing->HiZSetupTime << FSMC_PIO4_IOHIZ4_Pos))); |
964 | (Timing->HoldSetupTime << FSMC_PIO4_IOHOLD4_Pos) | |
| 965 | 965 | (Timing->HiZSetupTime << FSMC_PIO4_IOHIZ4_Pos))); |
|
| 966 | return HAL_OK; |
966 | |
| 967 | } |
967 | return HAL_OK; |
| 968 | 968 | } |
|
| 969 | /** |
969 | |
| 970 | * @brief DeInitializes the FSMC_PCCARD device |
970 | /** |
| 971 | * @param Device Pointer to PCCARD device instance |
971 | * @brief DeInitializes the FSMC_PCCARD device |
| 972 | * @retval HAL status |
972 | * @param Device Pointer to PCCARD device instance |
| 973 | */ |
973 | * @retval HAL status |
| 974 | HAL_StatusTypeDef FSMC_PCCARD_DeInit(FSMC_PCCARD_TypeDef *Device) |
974 | */ |
| 975 | { |
975 | HAL_StatusTypeDef FSMC_PCCARD_DeInit(FSMC_PCCARD_TypeDef *Device) |
| 976 | /* Check the parameters */ |
976 | { |
| 977 | assert_param(IS_FSMC_PCCARD_DEVICE(Device)); |
977 | /* Check the parameters */ |
| 978 | 978 | assert_param(IS_FSMC_PCCARD_DEVICE(Device)); |
|
| 979 | /* Disable the FSMC_PCCARD device */ |
979 | |
| 980 | __FSMC_PCCARD_DISABLE(Device); |
980 | /* Disable the FSMC_PCCARD device */ |
| 981 | 981 | __FSMC_PCCARD_DISABLE(Device); |
|
| 982 | /* De-initialize the FSMC_PCCARD device */ |
982 | |
| 983 | Device->PCR4 = 0x00000018U; |
983 | /* De-initialize the FSMC_PCCARD device */ |
| 984 | Device->SR4 = 0x00000040U; |
984 | Device->PCR4 = 0x00000018U; |
| 985 | Device->PMEM4 = 0xFCFCFCFCU; |
985 | Device->SR4 = 0x00000040U; |
| 986 | Device->PATT4 = 0xFCFCFCFCU; |
986 | Device->PMEM4 = 0xFCFCFCFCU; |
| 987 | Device->PIO4 = 0xFCFCFCFCU; |
987 | Device->PATT4 = 0xFCFCFCFCU; |
| 988 | 988 | Device->PIO4 = 0xFCFCFCFCU; |
|
| 989 | return HAL_OK; |
989 | |
| 990 | } |
990 | return HAL_OK; |
| 991 | 991 | } |
|
| 992 | /** |
992 | |
| 993 | * @} |
993 | /** |
| 994 | */ |
994 | * @} |
| 995 | #endif /* FSMC_BANK4 */ |
995 | */ |
| 996 | 996 | #endif /* FSMC_BANK4 */ |
|
| 997 | 997 | ||
| 998 | /** |
998 | |
| 999 | * @} |
999 | /** |
| 1000 | */ |
1000 | * @} |
| 1001 | 1001 | */ |
|
| 1002 | /** |
1002 | |
| 1003 | * @} |
1003 | /** |
| 1004 | */ |
1004 | * @} |
| 1005 | 1005 | */ |
|
| 1006 | #endif /* HAL_NOR_MODULE_ENABLED */ |
1006 | |
| 1007 | /** |
1007 | #endif /* HAL_NOR_MODULE_ENABLED */ |
| 1008 | * @} |
1008 | /** |
| 1009 | */ |
1009 | * @} |
| 1010 | /** |
1010 | */ |
| 1011 | * @} |
1011 | /** |
| 1012 | */ |
1012 | * @} |
| 1013 | 1013 | */ |
|
| 1014 | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
- | |