You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

stm32f1xx_ll_fsmc.c 38KB

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