stm32f1xx_ll_fsmc.c 37 KB

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