Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 

1062 rindas
39 KiB

  1. /**
  2. ******************************************************************************
  3. * @file stm32f4xx_ll_fsmc.c
  4. * @author MCD Application Team
  5. * @brief FSMC Low Layer HAL module driver.
  6. *
  7. * This file provides firmware functions to manage the following
  8. * functionalities of the Flexible Memory Controller (FSMC) peripheral memories:
  9. * + Initialization/de-initialization functions
  10. * + Peripheral Control functions
  11. * + Peripheral State functions
  12. *
  13. ******************************************************************************
  14. * @attention
  15. *
  16. * Copyright (c) 2016 STMicroelectronics.
  17. * All rights reserved.
  18. *
  19. * This software is licensed under terms that can be found in the LICENSE file
  20. * in the root directory of this software component.
  21. * If no LICENSE file comes with this software, it is provided AS-IS.
  22. *
  23. ******************************************************************************
  24. @verbatim
  25. ==============================================================================
  26. ##### FSMC peripheral features #####
  27. ==============================================================================
  28. [..] The Flexible memory controller (FSMC) includes following memory controllers:
  29. (+) The NOR/PSRAM memory controller
  30. (+) The NAND/PC Card memory controller
  31. [..] 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 "stm32f4xx_hal.h"
  54. /** @addtogroup STM32F4xx_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_BTR1_ADDSET | FSMC_BTR1_ADDHLD |\
  75. FSMC_BTR1_DATAST | FSMC_BTR1_BUSTURN |\
  76. FSMC_BTR1_CLKDIV | FSMC_BTR1_DATLAT |\
  77. FSMC_BTR1_ACCMOD))
  78. /* --- BWTR Register ---*/
  79. /* BWTR register clear mask */
  80. #define BWTR_CLEAR_MASK ((uint32_t)(FSMC_BWTR1_ADDSET | FSMC_BWTR1_ADDHLD |\
  81. FSMC_BWTR1_DATAST | FSMC_BWTR1_BUSTURN |\
  82. FSMC_BWTR1_ACCMOD))
  83. #endif /* FSMC_Bank1 */
  84. #if defined(FSMC_Bank2_3)
  85. #if defined (FSMC_PCR_PWAITEN)
  86. /* --- PCR Register ---*/
  87. /* PCR register clear mask */
  88. #define PCR_CLEAR_MASK ((uint32_t)(FSMC_PCR_PWAITEN | FSMC_PCR_PBKEN | \
  89. FSMC_PCR_PTYP | FSMC_PCR_PWID | \
  90. FSMC_PCR_ECCEN | FSMC_PCR_TCLR | \
  91. FSMC_PCR_TAR | FSMC_PCR_ECCPS))
  92. /* --- PMEM Register ---*/
  93. /* PMEM register clear mask */
  94. #define PMEM_CLEAR_MASK ((uint32_t)(FSMC_PMEM_MEMSET2 | FSMC_PMEM_MEMWAIT2 |\
  95. FSMC_PMEM_MEMHOLD2 | FSMC_PMEM_MEMHIZ2))
  96. /* --- PATT Register ---*/
  97. /* PATT register clear mask */
  98. #define PATT_CLEAR_MASK ((uint32_t)(FSMC_PATT_ATTSET2 | FSMC_PATT_ATTWAIT2 |\
  99. FSMC_PATT_ATTHOLD2 | FSMC_PATT_ATTHIZ2))
  100. #else
  101. /* --- PCR Register ---*/
  102. /* PCR register clear mask */
  103. #define PCR_CLEAR_MASK ((uint32_t)(FSMC_PCR2_PWAITEN | FSMC_PCR2_PBKEN | \
  104. FSMC_PCR2_PTYP | FSMC_PCR2_PWID | \
  105. FSMC_PCR2_ECCEN | FSMC_PCR2_TCLR | \
  106. FSMC_PCR2_TAR | FSMC_PCR2_ECCPS))
  107. /* --- PMEM Register ---*/
  108. /* PMEM register clear mask */
  109. #define PMEM_CLEAR_MASK ((uint32_t)(FSMC_PMEM2_MEMSET2 | FSMC_PMEM2_MEMWAIT2 |\
  110. FSMC_PMEM2_MEMHOLD2 | FSMC_PMEM2_MEMHIZ2))
  111. /* --- PATT Register ---*/
  112. /* PATT register clear mask */
  113. #define PATT_CLEAR_MASK ((uint32_t)(FSMC_PATT2_ATTSET2 | FSMC_PATT2_ATTWAIT2 |\
  114. FSMC_PATT2_ATTHOLD2 | FSMC_PATT2_ATTHIZ2))
  115. #endif /* FSMC_PCR_PWAITEN */
  116. #endif /* FSMC_Bank2_3 */
  117. #if defined(FSMC_Bank4)
  118. /* --- PCR Register ---*/
  119. /* PCR register clear mask */
  120. #define PCR4_CLEAR_MASK ((uint32_t)(FSMC_PCR4_PWAITEN | FSMC_PCR4_PBKEN | \
  121. FSMC_PCR4_PTYP | FSMC_PCR4_PWID | \
  122. FSMC_PCR4_ECCEN | FSMC_PCR4_TCLR | \
  123. FSMC_PCR4_TAR | FSMC_PCR4_ECCPS))
  124. /* --- PMEM Register ---*/
  125. /* PMEM register clear mask */
  126. #define PMEM4_CLEAR_MASK ((uint32_t)(FSMC_PMEM4_MEMSET4 | FSMC_PMEM4_MEMWAIT4 |\
  127. FSMC_PMEM4_MEMHOLD4 | FSMC_PMEM4_MEMHIZ4))
  128. /* --- PATT Register ---*/
  129. /* PATT register clear mask */
  130. #define PATT4_CLEAR_MASK ((uint32_t)(FSMC_PATT4_ATTSET4 | FSMC_PATT4_ATTWAIT4 |\
  131. FSMC_PATT4_ATTHOLD4 | FSMC_PATT4_ATTHIZ4))
  132. /* --- PIO4 Register ---*/
  133. /* PIO4 register clear mask */
  134. #define PIO4_CLEAR_MASK ((uint32_t)(FSMC_PIO4_IOSET4 | FSMC_PIO4_IOWAIT4 | \
  135. FSMC_PIO4_IOHOLD4 | FSMC_PIO4_IOHIZ4))
  136. #endif /* FSMC_Bank4 */
  137. /**
  138. * @}
  139. */
  140. /* Private macro -------------------------------------------------------------*/
  141. /* Private variables ---------------------------------------------------------*/
  142. /* Private function prototypes -----------------------------------------------*/
  143. /* Exported functions --------------------------------------------------------*/
  144. /** @defgroup FSMC_LL_Exported_Functions FSMC Low Layer Exported Functions
  145. * @{
  146. */
  147. #if defined(FSMC_Bank1)
  148. /** @defgroup FSMC_LL_Exported_Functions_NORSRAM FSMC Low Layer NOR SRAM Exported Functions
  149. * @brief NORSRAM Controller functions
  150. *
  151. @verbatim
  152. ==============================================================================
  153. ##### How to use NORSRAM device driver #####
  154. ==============================================================================
  155. [..]
  156. This driver contains a set of APIs to interface with the FSMC NORSRAM banks in order
  157. to run the NORSRAM external devices.
  158. (+) FSMC NORSRAM bank reset using the function FSMC_NORSRAM_DeInit()
  159. (+) FSMC NORSRAM bank control configuration using the function FSMC_NORSRAM_Init()
  160. (+) FSMC NORSRAM bank timing configuration using the function FSMC_NORSRAM_Timing_Init()
  161. (+) FSMC NORSRAM bank extended timing configuration using the function
  162. FSMC_NORSRAM_Extended_Timing_Init()
  163. (+) FSMC NORSRAM bank enable/disable write operation using the functions
  164. FSMC_NORSRAM_WriteOperation_Enable()/FSMC_NORSRAM_WriteOperation_Disable()
  165. @endverbatim
  166. * @{
  167. */
  168. /** @defgroup FSMC_LL_NORSRAM_Exported_Functions_Group1 Initialization and de-initialization functions
  169. * @brief Initialization and Configuration functions
  170. *
  171. @verbatim
  172. ==============================================================================
  173. ##### Initialization and de_initialization functions #####
  174. ==============================================================================
  175. [..]
  176. This section provides functions allowing to:
  177. (+) Initialize and configure the FSMC NORSRAM interface
  178. (+) De-initialize the FSMC NORSRAM interface
  179. (+) Configure the FSMC clock and associated GPIOs
  180. @endverbatim
  181. * @{
  182. */
  183. /**
  184. * @brief Initialize the FSMC_NORSRAM device according to the specified
  185. * control parameters in the FSMC_NORSRAM_InitTypeDef
  186. * @param Device Pointer to NORSRAM device instance
  187. * @param Init Pointer to NORSRAM Initialization structure
  188. * @retval HAL status
  189. */
  190. HAL_StatusTypeDef FSMC_NORSRAM_Init(FSMC_NORSRAM_TypeDef *Device,
  191. const FSMC_NORSRAM_InitTypeDef *Init)
  192. {
  193. uint32_t flashaccess;
  194. uint32_t btcr_reg;
  195. uint32_t mask;
  196. /* Check the parameters */
  197. assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
  198. assert_param(IS_FSMC_NORSRAM_BANK(Init->NSBank));
  199. assert_param(IS_FSMC_MUX(Init->DataAddressMux));
  200. assert_param(IS_FSMC_MEMORY(Init->MemoryType));
  201. assert_param(IS_FSMC_NORSRAM_MEMORY_WIDTH(Init->MemoryDataWidth));
  202. assert_param(IS_FSMC_BURSTMODE(Init->BurstAccessMode));
  203. assert_param(IS_FSMC_WAIT_POLARITY(Init->WaitSignalPolarity));
  204. #if defined(FSMC_BCR1_WRAPMOD)
  205. assert_param(IS_FSMC_WRAP_MODE(Init->WrapMode));
  206. #endif /* FSMC_BCR1_WRAPMOD */
  207. assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(Init->WaitSignalActive));
  208. assert_param(IS_FSMC_WRITE_OPERATION(Init->WriteOperation));
  209. assert_param(IS_FSMC_WAITE_SIGNAL(Init->WaitSignal));
  210. assert_param(IS_FSMC_EXTENDED_MODE(Init->ExtendedMode));
  211. assert_param(IS_FSMC_ASYNWAIT(Init->AsynchronousWait));
  212. assert_param(IS_FSMC_WRITE_BURST(Init->WriteBurst));
  213. #if defined(FSMC_BCR1_CCLKEN)
  214. assert_param(IS_FSMC_CONTINOUS_CLOCK(Init->ContinuousClock));
  215. #endif /* FSMC_BCR1_CCLKEN */
  216. #if defined(FSMC_BCR1_WFDIS)
  217. assert_param(IS_FSMC_WRITE_FIFO(Init->WriteFifo));
  218. #endif /* FSMC_BCR1_WFDIS */
  219. assert_param(IS_FSMC_PAGESIZE(Init->PageSize));
  220. /* Disable NORSRAM Device */
  221. __FSMC_NORSRAM_DISABLE(Device, Init->NSBank);
  222. /* Set NORSRAM device control parameters */
  223. if (Init->MemoryType == FSMC_MEMORY_TYPE_NOR)
  224. {
  225. flashaccess = FSMC_NORSRAM_FLASH_ACCESS_ENABLE;
  226. }
  227. else
  228. {
  229. flashaccess = FSMC_NORSRAM_FLASH_ACCESS_DISABLE;
  230. }
  231. btcr_reg = (flashaccess | \
  232. Init->DataAddressMux | \
  233. Init->MemoryType | \
  234. Init->MemoryDataWidth | \
  235. Init->BurstAccessMode | \
  236. Init->WaitSignalPolarity | \
  237. Init->WaitSignalActive | \
  238. Init->WriteOperation | \
  239. Init->WaitSignal | \
  240. Init->ExtendedMode | \
  241. Init->AsynchronousWait | \
  242. Init->WriteBurst);
  243. #if defined(FSMC_BCR1_WRAPMOD)
  244. btcr_reg |= Init->WrapMode;
  245. #endif /* FSMC_BCR1_WRAPMOD */
  246. #if defined(FSMC_BCR1_CCLKEN)
  247. btcr_reg |= Init->ContinuousClock;
  248. #endif /* FSMC_BCR1_CCLKEN */
  249. #if defined(FSMC_BCR1_WFDIS)
  250. btcr_reg |= Init->WriteFifo;
  251. #endif /* FSMC_BCR1_WFDIS */
  252. btcr_reg |= Init->PageSize;
  253. mask = (FSMC_BCR1_MBKEN |
  254. FSMC_BCR1_MUXEN |
  255. FSMC_BCR1_MTYP |
  256. FSMC_BCR1_MWID |
  257. FSMC_BCR1_FACCEN |
  258. FSMC_BCR1_BURSTEN |
  259. FSMC_BCR1_WAITPOL |
  260. FSMC_BCR1_WAITCFG |
  261. FSMC_BCR1_WREN |
  262. FSMC_BCR1_WAITEN |
  263. FSMC_BCR1_EXTMOD |
  264. FSMC_BCR1_ASYNCWAIT |
  265. FSMC_BCR1_CBURSTRW);
  266. #if defined(FSMC_BCR1_WRAPMOD)
  267. mask |= FSMC_BCR1_WRAPMOD;
  268. #endif /* FSMC_BCR1_WRAPMOD */
  269. #if defined(FSMC_BCR1_CCLKEN)
  270. mask |= FSMC_BCR1_CCLKEN;
  271. #endif /* FSMC_BCR1_CCLKEN */
  272. #if defined(FSMC_BCR1_WFDIS)
  273. mask |= FSMC_BCR1_WFDIS;
  274. #endif /* FSMC_BCR1_WFDIS */
  275. mask |= FSMC_BCR1_CPSIZE;
  276. MODIFY_REG(Device->BTCR[Init->NSBank], mask, btcr_reg);
  277. #if defined(FSMC_BCR1_CCLKEN)
  278. /* Configure synchronous mode when Continuous clock is enabled for bank2..4 */
  279. if ((Init->ContinuousClock == FSMC_CONTINUOUS_CLOCK_SYNC_ASYNC) && (Init->NSBank != FSMC_NORSRAM_BANK1))
  280. {
  281. MODIFY_REG(Device->BTCR[FSMC_NORSRAM_BANK1], FSMC_BCR1_CCLKEN, Init->ContinuousClock);
  282. }
  283. #endif /* FSMC_BCR1_CCLKEN */
  284. #if defined(FSMC_BCR1_WFDIS)
  285. if (Init->NSBank != FSMC_NORSRAM_BANK1)
  286. {
  287. /* Configure Write FIFO mode when Write Fifo is enabled for bank2..4 */
  288. SET_BIT(Device->BTCR[FSMC_NORSRAM_BANK1], (uint32_t)(Init->WriteFifo));
  289. }
  290. #endif /* FSMC_BCR1_WFDIS */
  291. return HAL_OK;
  292. }
  293. /**
  294. * @brief DeInitialize the FSMC_NORSRAM peripheral
  295. * @param Device Pointer to NORSRAM device instance
  296. * @param ExDevice Pointer to NORSRAM extended mode device instance
  297. * @param Bank NORSRAM bank number
  298. * @retval HAL status
  299. */
  300. HAL_StatusTypeDef FSMC_NORSRAM_DeInit(FSMC_NORSRAM_TypeDef *Device,
  301. FSMC_NORSRAM_EXTENDED_TypeDef *ExDevice, uint32_t Bank)
  302. {
  303. /* Check the parameters */
  304. assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
  305. assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(ExDevice));
  306. assert_param(IS_FSMC_NORSRAM_BANK(Bank));
  307. /* Disable the FSMC_NORSRAM device */
  308. __FSMC_NORSRAM_DISABLE(Device, Bank);
  309. /* De-initialize the FSMC_NORSRAM device */
  310. /* FSMC_NORSRAM_BANK1 */
  311. if (Bank == FSMC_NORSRAM_BANK1)
  312. {
  313. Device->BTCR[Bank] = 0x000030DBU;
  314. }
  315. /* FSMC_NORSRAM_BANK2, FSMC_NORSRAM_BANK3 or FSMC_NORSRAM_BANK4 */
  316. else
  317. {
  318. Device->BTCR[Bank] = 0x000030D2U;
  319. }
  320. Device->BTCR[Bank + 1U] = 0x0FFFFFFFU;
  321. ExDevice->BWTR[Bank] = 0x0FFFFFFFU;
  322. return HAL_OK;
  323. }
  324. /**
  325. * @brief Initialize the FSMC_NORSRAM Timing according to the specified
  326. * parameters in the FSMC_NORSRAM_TimingTypeDef
  327. * @param Device Pointer to NORSRAM device instance
  328. * @param Timing Pointer to NORSRAM Timing structure
  329. * @param Bank NORSRAM bank number
  330. * @retval HAL status
  331. */
  332. HAL_StatusTypeDef FSMC_NORSRAM_Timing_Init(FSMC_NORSRAM_TypeDef *Device,
  333. const FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank)
  334. {
  335. #if defined(FSMC_BCR1_CCLKEN)
  336. uint32_t tmpr;
  337. #endif /* FSMC_BCR1_CCLKEN */
  338. /* Check the parameters */
  339. assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
  340. assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime));
  341. assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime));
  342. assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime));
  343. assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration));
  344. assert_param(IS_FSMC_CLK_DIV(Timing->CLKDivision));
  345. assert_param(IS_FSMC_DATA_LATENCY(Timing->DataLatency));
  346. assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode));
  347. assert_param(IS_FSMC_NORSRAM_BANK(Bank));
  348. /* Set FSMC_NORSRAM device timing parameters */
  349. Device->BTCR[Bank + 1U] =
  350. (Timing->AddressSetupTime << FSMC_BTR1_ADDSET_Pos) |
  351. (Timing->AddressHoldTime << FSMC_BTR1_ADDHLD_Pos) |
  352. (Timing->DataSetupTime << FSMC_BTR1_DATAST_Pos) |
  353. (Timing->BusTurnAroundDuration << FSMC_BTR1_BUSTURN_Pos) |
  354. ((Timing->CLKDivision - 1U) << FSMC_BTR1_CLKDIV_Pos) |
  355. ((Timing->DataLatency - 2U) << FSMC_BTR1_DATLAT_Pos) |
  356. Timing->AccessMode;
  357. #if defined(FSMC_BCR1_CCLKEN)
  358. /* Configure Clock division value (in NORSRAM bank 1) when continuous clock is enabled */
  359. if (HAL_IS_BIT_SET(Device->BTCR[FSMC_NORSRAM_BANK1], FSMC_BCR1_CCLKEN))
  360. {
  361. tmpr = (uint32_t)(Device->BTCR[FSMC_NORSRAM_BANK1 + 1U] & ~((0x0FU) << FSMC_BTR1_CLKDIV_Pos));
  362. tmpr |= (uint32_t)(((Timing->CLKDivision) - 1U) << FSMC_BTR1_CLKDIV_Pos);
  363. MODIFY_REG(Device->BTCR[FSMC_NORSRAM_BANK1 + 1U], FSMC_BTR1_CLKDIV, tmpr);
  364. }
  365. #endif /* FSMC_BCR1_CCLKEN */
  366. return HAL_OK;
  367. }
  368. /**
  369. * @brief Initialize the FSMC_NORSRAM Extended mode Timing according to the specified
  370. * parameters in the FSMC_NORSRAM_TimingTypeDef
  371. * @param Device Pointer to NORSRAM device instance
  372. * @param Timing Pointer to NORSRAM Timing structure
  373. * @param Bank NORSRAM bank number
  374. * @param ExtendedMode FSMC Extended Mode
  375. * This parameter can be one of the following values:
  376. * @arg FSMC_EXTENDED_MODE_DISABLE
  377. * @arg FSMC_EXTENDED_MODE_ENABLE
  378. * @retval HAL status
  379. */
  380. HAL_StatusTypeDef FSMC_NORSRAM_Extended_Timing_Init(FSMC_NORSRAM_EXTENDED_TypeDef *Device,
  381. const FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank,
  382. uint32_t ExtendedMode)
  383. {
  384. /* Check the parameters */
  385. assert_param(IS_FSMC_EXTENDED_MODE(ExtendedMode));
  386. /* Set NORSRAM device timing register for write configuration, if extended mode is used */
  387. if (ExtendedMode == FSMC_EXTENDED_MODE_ENABLE)
  388. {
  389. /* Check the parameters */
  390. assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(Device));
  391. assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime));
  392. assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime));
  393. assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime));
  394. assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration));
  395. assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode));
  396. assert_param(IS_FSMC_NORSRAM_BANK(Bank));
  397. /* Set NORSRAM device timing register for write configuration, if extended mode is used */
  398. MODIFY_REG(Device->BWTR[Bank], BWTR_CLEAR_MASK, (Timing->AddressSetupTime |
  399. ((Timing->AddressHoldTime) << FSMC_BWTR1_ADDHLD_Pos) |
  400. ((Timing->DataSetupTime) << FSMC_BWTR1_DATAST_Pos) |
  401. Timing->AccessMode |
  402. ((Timing->BusTurnAroundDuration) << FSMC_BWTR1_BUSTURN_Pos)));
  403. }
  404. else
  405. {
  406. Device->BWTR[Bank] = 0x0FFFFFFFU;
  407. }
  408. return HAL_OK;
  409. }
  410. /**
  411. * @}
  412. */
  413. /** @addtogroup FSMC_LL_NORSRAM_Private_Functions_Group2
  414. * @brief management functions
  415. *
  416. @verbatim
  417. ==============================================================================
  418. ##### FSMC_NORSRAM Control functions #####
  419. ==============================================================================
  420. [..]
  421. This subsection provides a set of functions allowing to control dynamically
  422. the FSMC NORSRAM interface.
  423. @endverbatim
  424. * @{
  425. */
  426. /**
  427. * @brief Enables dynamically FSMC_NORSRAM write operation.
  428. * @param Device Pointer to NORSRAM device instance
  429. * @param Bank NORSRAM bank number
  430. * @retval HAL status
  431. */
  432. HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Enable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank)
  433. {
  434. /* Check the parameters */
  435. assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
  436. assert_param(IS_FSMC_NORSRAM_BANK(Bank));
  437. /* Enable write operation */
  438. SET_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE);
  439. return HAL_OK;
  440. }
  441. /**
  442. * @brief Disables dynamically FSMC_NORSRAM write operation.
  443. * @param Device Pointer to NORSRAM device instance
  444. * @param Bank NORSRAM bank number
  445. * @retval HAL status
  446. */
  447. HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Disable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank)
  448. {
  449. /* Check the parameters */
  450. assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
  451. assert_param(IS_FSMC_NORSRAM_BANK(Bank));
  452. /* Disable write operation */
  453. CLEAR_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE);
  454. return HAL_OK;
  455. }
  456. /**
  457. * @}
  458. */
  459. /**
  460. * @}
  461. */
  462. #endif /* FSMC_Bank1 */
  463. #if defined(FSMC_Bank2_3)
  464. /** @defgroup FSMC_LL_Exported_Functions_NAND FSMC Low Layer NAND Exported Functions
  465. * @brief NAND Controller functions
  466. *
  467. @verbatim
  468. ==============================================================================
  469. ##### How to use NAND device driver #####
  470. ==============================================================================
  471. [..]
  472. This driver contains a set of APIs to interface with the FSMC NAND banks in order
  473. to run the NAND external devices.
  474. (+) FSMC NAND bank reset using the function FSMC_NAND_DeInit()
  475. (+) FSMC NAND bank control configuration using the function FSMC_NAND_Init()
  476. (+) FSMC NAND bank common space timing configuration using the function
  477. FSMC_NAND_CommonSpace_Timing_Init()
  478. (+) FSMC NAND bank attribute space timing configuration using the function
  479. FSMC_NAND_AttributeSpace_Timing_Init()
  480. (+) FSMC NAND bank enable/disable ECC correction feature using the functions
  481. FSMC_NAND_ECC_Enable()/FSMC_NAND_ECC_Disable()
  482. (+) FSMC NAND bank get ECC correction code using the function FSMC_NAND_GetECC()
  483. @endverbatim
  484. * @{
  485. */
  486. /** @defgroup FSMC_LL_NAND_Exported_Functions_Group1 Initialization and de-initialization functions
  487. * @brief Initialization and Configuration functions
  488. *
  489. @verbatim
  490. ==============================================================================
  491. ##### Initialization and de_initialization functions #####
  492. ==============================================================================
  493. [..]
  494. This section provides functions allowing to:
  495. (+) Initialize and configure the FSMC NAND interface
  496. (+) De-initialize the FSMC NAND interface
  497. (+) Configure the FSMC clock and associated GPIOs
  498. @endverbatim
  499. * @{
  500. */
  501. /**
  502. * @brief Initializes the FSMC_NAND device according to the specified
  503. * control parameters in the FSMC_NAND_HandleTypeDef
  504. * @param Device Pointer to NAND device instance
  505. * @param Init Pointer to NAND Initialization structure
  506. * @retval HAL status
  507. */
  508. HAL_StatusTypeDef FSMC_NAND_Init(FSMC_NAND_TypeDef *Device, const FSMC_NAND_InitTypeDef *Init)
  509. {
  510. /* Check the parameters */
  511. assert_param(IS_FSMC_NAND_DEVICE(Device));
  512. assert_param(IS_FSMC_NAND_BANK(Init->NandBank));
  513. assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature));
  514. assert_param(IS_FSMC_NAND_MEMORY_WIDTH(Init->MemoryDataWidth));
  515. assert_param(IS_FSMC_ECC_STATE(Init->EccComputation));
  516. assert_param(IS_FSMC_ECCPAGE_SIZE(Init->ECCPageSize));
  517. assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime));
  518. assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime));
  519. /* Set NAND device control parameters */
  520. if (Init->NandBank == FSMC_NAND_BANK2)
  521. {
  522. /* NAND bank 2 registers configuration */
  523. MODIFY_REG(Device->PCR2, PCR_CLEAR_MASK, (Init->Waitfeature |
  524. FSMC_PCR_MEMORY_TYPE_NAND |
  525. Init->MemoryDataWidth |
  526. Init->EccComputation |
  527. Init->ECCPageSize |
  528. ((Init->TCLRSetupTime) << FSMC_PCR2_TCLR_Pos) |
  529. ((Init->TARSetupTime) << FSMC_PCR2_TAR_Pos)));
  530. }
  531. else
  532. {
  533. /* NAND bank 3 registers configuration */
  534. MODIFY_REG(Device->PCR3, PCR_CLEAR_MASK, (Init->Waitfeature |
  535. FSMC_PCR_MEMORY_TYPE_NAND |
  536. Init->MemoryDataWidth |
  537. Init->EccComputation |
  538. Init->ECCPageSize |
  539. ((Init->TCLRSetupTime) << FSMC_PCR2_TCLR_Pos) |
  540. ((Init->TARSetupTime) << FSMC_PCR2_TAR_Pos)));
  541. }
  542. return HAL_OK;
  543. }
  544. /**
  545. * @brief Initializes the FSMC_NAND Common space Timing according to the specified
  546. * parameters in the FSMC_NAND_PCC_TimingTypeDef
  547. * @param Device Pointer to NAND device instance
  548. * @param Timing Pointer to NAND timing structure
  549. * @param Bank NAND bank number
  550. * @retval HAL status
  551. */
  552. HAL_StatusTypeDef FSMC_NAND_CommonSpace_Timing_Init(FSMC_NAND_TypeDef *Device,
  553. const FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank)
  554. {
  555. /* Check the parameters */
  556. assert_param(IS_FSMC_NAND_DEVICE(Device));
  557. assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
  558. assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
  559. assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
  560. assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
  561. assert_param(IS_FSMC_NAND_BANK(Bank));
  562. /* Set FSMC_NAND device timing parameters */
  563. if (Bank == FSMC_NAND_BANK2)
  564. {
  565. /* NAND bank 2 registers configuration */
  566. WRITE_REG(Device->PMEM2, (Timing->SetupTime |
  567. ((Timing->WaitSetupTime) << FSMC_PMEM2_MEMWAIT2_Pos) |
  568. ((Timing->HoldSetupTime) << FSMC_PMEM2_MEMHOLD2_Pos) |
  569. ((Timing->HiZSetupTime) << FSMC_PMEM2_MEMHIZ2_Pos)));
  570. }
  571. else
  572. {
  573. /* NAND bank 3 registers configuration */
  574. WRITE_REG(Device->PMEM3, (Timing->SetupTime |
  575. ((Timing->WaitSetupTime) << FSMC_PMEM2_MEMWAIT2_Pos) |
  576. ((Timing->HoldSetupTime) << FSMC_PMEM2_MEMHOLD2_Pos) |
  577. ((Timing->HiZSetupTime) << FSMC_PMEM2_MEMHIZ2_Pos)));
  578. }
  579. return HAL_OK;
  580. }
  581. /**
  582. * @brief Initializes the FSMC_NAND Attribute space Timing according to the specified
  583. * parameters in the FSMC_NAND_PCC_TimingTypeDef
  584. * @param Device Pointer to NAND device instance
  585. * @param Timing Pointer to NAND timing structure
  586. * @param Bank NAND bank number
  587. * @retval HAL status
  588. */
  589. HAL_StatusTypeDef FSMC_NAND_AttributeSpace_Timing_Init(FSMC_NAND_TypeDef *Device,
  590. const FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank)
  591. {
  592. /* Check the parameters */
  593. assert_param(IS_FSMC_NAND_DEVICE(Device));
  594. assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
  595. assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
  596. assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
  597. assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
  598. assert_param(IS_FSMC_NAND_BANK(Bank));
  599. /* Set FSMC_NAND device timing parameters */
  600. if (Bank == FSMC_NAND_BANK2)
  601. {
  602. /* NAND bank 2 registers configuration */
  603. WRITE_REG(Device->PATT2, (Timing->SetupTime |
  604. ((Timing->WaitSetupTime) << FSMC_PATT2_ATTWAIT2_Pos) |
  605. ((Timing->HoldSetupTime) << FSMC_PATT2_ATTHOLD2_Pos) |
  606. ((Timing->HiZSetupTime) << FSMC_PATT2_ATTHIZ2_Pos)));
  607. }
  608. else
  609. {
  610. /* NAND bank 3 registers configuration */
  611. WRITE_REG(Device->PATT3, (Timing->SetupTime |
  612. ((Timing->WaitSetupTime) << FSMC_PATT2_ATTWAIT2_Pos) |
  613. ((Timing->HoldSetupTime) << FSMC_PATT2_ATTHOLD2_Pos) |
  614. ((Timing->HiZSetupTime) << FSMC_PATT2_ATTHIZ2_Pos)));
  615. }
  616. return HAL_OK;
  617. }
  618. /**
  619. * @brief DeInitializes the FSMC_NAND device
  620. * @param Device Pointer to NAND device instance
  621. * @param Bank NAND bank number
  622. * @retval HAL status
  623. */
  624. HAL_StatusTypeDef FSMC_NAND_DeInit(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. /* Disable the NAND Bank */
  630. __FSMC_NAND_DISABLE(Device, Bank);
  631. /* De-initialize the NAND Bank */
  632. if (Bank == FSMC_NAND_BANK2)
  633. {
  634. /* Set the FSMC_NAND_BANK2 registers to their reset values */
  635. WRITE_REG(Device->PCR2, 0x00000018U);
  636. WRITE_REG(Device->SR2, 0x00000040U);
  637. WRITE_REG(Device->PMEM2, 0xFCFCFCFCU);
  638. WRITE_REG(Device->PATT2, 0xFCFCFCFCU);
  639. }
  640. /* FSMC_Bank3_NAND */
  641. else
  642. {
  643. /* Set the FSMC_NAND_BANK3 registers to their reset values */
  644. WRITE_REG(Device->PCR3, 0x00000018U);
  645. WRITE_REG(Device->SR3, 0x00000040U);
  646. WRITE_REG(Device->PMEM3, 0xFCFCFCFCU);
  647. WRITE_REG(Device->PATT3, 0xFCFCFCFCU);
  648. }
  649. return HAL_OK;
  650. }
  651. /**
  652. * @}
  653. */
  654. /** @defgroup HAL_FSMC_NAND_Group2 Peripheral Control functions
  655. * @brief management functions
  656. *
  657. @verbatim
  658. ==============================================================================
  659. ##### FSMC_NAND Control functions #####
  660. ==============================================================================
  661. [..]
  662. This subsection provides a set of functions allowing to control dynamically
  663. the FSMC NAND interface.
  664. @endverbatim
  665. * @{
  666. */
  667. /**
  668. * @brief Enables dynamically FSMC_NAND ECC feature.
  669. * @param Device Pointer to NAND device instance
  670. * @param Bank NAND bank number
  671. * @retval HAL status
  672. */
  673. HAL_StatusTypeDef FSMC_NAND_ECC_Enable(FSMC_NAND_TypeDef *Device, uint32_t Bank)
  674. {
  675. /* Check the parameters */
  676. assert_param(IS_FSMC_NAND_DEVICE(Device));
  677. assert_param(IS_FSMC_NAND_BANK(Bank));
  678. /* Enable ECC feature */
  679. if (Bank == FSMC_NAND_BANK2)
  680. {
  681. SET_BIT(Device->PCR2, FSMC_PCR2_ECCEN);
  682. }
  683. else
  684. {
  685. SET_BIT(Device->PCR3, FSMC_PCR2_ECCEN);
  686. }
  687. return HAL_OK;
  688. }
  689. /**
  690. * @brief Disables dynamically FSMC_NAND ECC feature.
  691. * @param Device Pointer to NAND device instance
  692. * @param Bank NAND bank number
  693. * @retval HAL status
  694. */
  695. HAL_StatusTypeDef FSMC_NAND_ECC_Disable(FSMC_NAND_TypeDef *Device, uint32_t Bank)
  696. {
  697. /* Check the parameters */
  698. assert_param(IS_FSMC_NAND_DEVICE(Device));
  699. assert_param(IS_FSMC_NAND_BANK(Bank));
  700. /* Disable ECC feature */
  701. if (Bank == FSMC_NAND_BANK2)
  702. {
  703. CLEAR_BIT(Device->PCR2, FSMC_PCR2_ECCEN);
  704. }
  705. else
  706. {
  707. CLEAR_BIT(Device->PCR3, FSMC_PCR2_ECCEN);
  708. }
  709. return HAL_OK;
  710. }
  711. /**
  712. * @brief Disables dynamically FSMC_NAND ECC feature.
  713. * @param Device Pointer to NAND device instance
  714. * @param ECCval Pointer to ECC value
  715. * @param Bank NAND bank number
  716. * @param Timeout Timeout wait value
  717. * @retval HAL status
  718. */
  719. HAL_StatusTypeDef FSMC_NAND_GetECC(const FSMC_NAND_TypeDef *Device, uint32_t *ECCval, uint32_t Bank,
  720. uint32_t Timeout)
  721. {
  722. uint32_t tickstart;
  723. /* Check the parameters */
  724. assert_param(IS_FSMC_NAND_DEVICE(Device));
  725. assert_param(IS_FSMC_NAND_BANK(Bank));
  726. /* Get tick */
  727. tickstart = HAL_GetTick();
  728. /* Wait until FIFO is empty */
  729. while (__FSMC_NAND_GET_FLAG(Device, Bank, FSMC_FLAG_FEMPT) == RESET)
  730. {
  731. /* Check for the Timeout */
  732. if (Timeout != HAL_MAX_DELAY)
  733. {
  734. if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
  735. {
  736. return HAL_TIMEOUT;
  737. }
  738. }
  739. }
  740. if (Bank == FSMC_NAND_BANK2)
  741. {
  742. /* Get the ECCR2 register value */
  743. *ECCval = (uint32_t)Device->ECCR2;
  744. }
  745. else
  746. {
  747. /* Get the ECCR3 register value */
  748. *ECCval = (uint32_t)Device->ECCR3;
  749. }
  750. return HAL_OK;
  751. }
  752. /**
  753. * @}
  754. */
  755. #endif /* FSMC_Bank2_3 */
  756. #if defined(FSMC_Bank4)
  757. /** @addtogroup FSMC_LL_PCCARD
  758. * @brief PCCARD Controller functions
  759. *
  760. @verbatim
  761. ==============================================================================
  762. ##### How to use PCCARD device driver #####
  763. ==============================================================================
  764. [..]
  765. This driver contains a set of APIs to interface with the FSMC PCCARD bank in order
  766. to run the PCCARD/compact flash external devices.
  767. (+) FSMC PCCARD bank reset using the function FSMC_PCCARD_DeInit()
  768. (+) FSMC PCCARD bank control configuration using the function FSMC_PCCARD_Init()
  769. (+) FSMC PCCARD bank common space timing configuration using the function
  770. FSMC_PCCARD_CommonSpace_Timing_Init()
  771. (+) FSMC PCCARD bank attribute space timing configuration using the function
  772. FSMC_PCCARD_AttributeSpace_Timing_Init()
  773. (+) FSMC PCCARD bank IO space timing configuration using the function
  774. FSMC_PCCARD_IOSpace_Timing_Init()
  775. @endverbatim
  776. * @{
  777. */
  778. /** @addtogroup FSMC_LL_PCCARD_Private_Functions_Group1
  779. * @brief Initialization and Configuration functions
  780. *
  781. @verbatim
  782. ==============================================================================
  783. ##### Initialization and de_initialization functions #####
  784. ==============================================================================
  785. [..]
  786. This section provides functions allowing to:
  787. (+) Initialize and configure the FSMC PCCARD interface
  788. (+) De-initialize the FSMC PCCARD interface
  789. (+) Configure the FSMC clock and associated GPIOs
  790. @endverbatim
  791. * @{
  792. */
  793. /**
  794. * @brief Initializes the FSMC_PCCARD device according to the specified
  795. * control parameters in the FSMC_PCCARD_HandleTypeDef
  796. * @param Device Pointer to PCCARD device instance
  797. * @param Init Pointer to PCCARD Initialization structure
  798. * @retval HAL status
  799. */
  800. HAL_StatusTypeDef FSMC_PCCARD_Init(FSMC_PCCARD_TypeDef *Device, const FSMC_PCCARD_InitTypeDef *Init)
  801. {
  802. /* Check the parameters */
  803. assert_param(IS_FSMC_PCCARD_DEVICE(Device));
  804. #if defined(FSMC_Bank2_3)
  805. assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature));
  806. assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime));
  807. assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime));
  808. #endif /* FSMC_Bank2_3 */
  809. /* Set FSMC_PCCARD device control parameters */
  810. MODIFY_REG(Device->PCR4,
  811. (FSMC_PCR4_PTYP |
  812. FSMC_PCR4_PWAITEN |
  813. FSMC_PCR4_PWID |
  814. FSMC_PCR4_TCLR |
  815. FSMC_PCR4_TAR),
  816. (FSMC_PCR_MEMORY_TYPE_PCCARD |
  817. Init->Waitfeature |
  818. FSMC_NAND_PCC_MEM_BUS_WIDTH_16 |
  819. (Init->TCLRSetupTime << FSMC_PCR4_TCLR_Pos) |
  820. (Init->TARSetupTime << FSMC_PCR4_TAR_Pos)));
  821. return HAL_OK;
  822. }
  823. /**
  824. * @brief Initializes the FSMC_PCCARD Common space Timing according to the specified
  825. * parameters in the FSMC_NAND_PCC_TimingTypeDef
  826. * @param Device Pointer to PCCARD device instance
  827. * @param Timing Pointer to PCCARD timing structure
  828. * @retval HAL status
  829. */
  830. HAL_StatusTypeDef FSMC_PCCARD_CommonSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device,
  831. const FSMC_NAND_PCC_TimingTypeDef *Timing)
  832. {
  833. /* Check the parameters */
  834. assert_param(IS_FSMC_PCCARD_DEVICE(Device));
  835. #if defined(FSMC_Bank2_3)
  836. assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
  837. assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
  838. assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
  839. assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
  840. #endif /* FSMC_Bank2_3 */
  841. /* Set PCCARD timing parameters */
  842. WRITE_REG(Device->PMEM4, (Timing->SetupTime |
  843. ((Timing->WaitSetupTime) << FSMC_PMEM4_MEMWAIT4_Pos) |
  844. ((Timing->HoldSetupTime) << FSMC_PMEM4_MEMHOLD4_Pos) |
  845. ((Timing->HiZSetupTime) << FSMC_PMEM4_MEMHIZ4_Pos)));
  846. return HAL_OK;
  847. }
  848. /**
  849. * @brief Initializes the FSMC_PCCARD Attribute space Timing according to the specified
  850. * parameters in the FSMC_NAND_PCC_TimingTypeDef
  851. * @param Device Pointer to PCCARD device instance
  852. * @param Timing Pointer to PCCARD timing structure
  853. * @retval HAL status
  854. */
  855. HAL_StatusTypeDef FSMC_PCCARD_AttributeSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device,
  856. const FSMC_NAND_PCC_TimingTypeDef *Timing)
  857. {
  858. /* Check the parameters */
  859. assert_param(IS_FSMC_PCCARD_DEVICE(Device));
  860. #if defined(FSMC_Bank2_3)
  861. assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
  862. assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
  863. assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
  864. assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
  865. #endif /* FSMC_Bank2_3 */
  866. /* Set PCCARD timing parameters */
  867. WRITE_REG(Device->PATT4, (Timing->SetupTime |
  868. ((Timing->WaitSetupTime) << FSMC_PATT4_ATTWAIT4_Pos) |
  869. ((Timing->HoldSetupTime) << FSMC_PATT4_ATTHOLD4_Pos) |
  870. ((Timing->HiZSetupTime) << FSMC_PATT4_ATTHIZ4_Pos)));
  871. return HAL_OK;
  872. }
  873. /**
  874. * @brief Initializes the FSMC_PCCARD IO space Timing according to the specified
  875. * parameters in the FSMC_NAND_PCC_TimingTypeDef
  876. * @param Device Pointer to PCCARD device instance
  877. * @param Timing Pointer to PCCARD timing structure
  878. * @retval HAL status
  879. */
  880. HAL_StatusTypeDef FSMC_PCCARD_IOSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device,
  881. const FSMC_NAND_PCC_TimingTypeDef *Timing)
  882. {
  883. /* Check the parameters */
  884. assert_param(IS_FSMC_PCCARD_DEVICE(Device));
  885. #if defined(FSMC_Bank2_3)
  886. assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
  887. assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
  888. assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
  889. assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
  890. #endif /* FSMC_Bank2_3 */
  891. /* Set FSMC_PCCARD device timing parameters */
  892. WRITE_REG(Device->PIO4, (Timing->SetupTime |
  893. (Timing->WaitSetupTime << FSMC_PIO4_IOWAIT4_Pos) |
  894. (Timing->HoldSetupTime << FSMC_PIO4_IOHOLD4_Pos) |
  895. (Timing->HiZSetupTime << FSMC_PIO4_IOHIZ4_Pos)));
  896. return HAL_OK;
  897. }
  898. /**
  899. * @brief DeInitializes the FSMC_PCCARD device
  900. * @param Device Pointer to PCCARD device instance
  901. * @retval HAL status
  902. */
  903. HAL_StatusTypeDef FSMC_PCCARD_DeInit(FSMC_PCCARD_TypeDef *Device)
  904. {
  905. /* Check the parameters */
  906. assert_param(IS_FSMC_PCCARD_DEVICE(Device));
  907. /* Disable the FSMC_PCCARD device */
  908. __FSMC_PCCARD_DISABLE(Device);
  909. /* De-initialize the FSMC_PCCARD device */
  910. Device->PCR4 = 0x00000018U;
  911. Device->SR4 = 0x00000040U;
  912. Device->PMEM4 = 0xFCFCFCFCU;
  913. Device->PATT4 = 0xFCFCFCFCU;
  914. Device->PIO4 = 0xFCFCFCFCU;
  915. return HAL_OK;
  916. }
  917. /**
  918. * @}
  919. */
  920. #endif /* FSMC_Bank4 */
  921. /**
  922. * @}
  923. */
  924. /**
  925. * @}
  926. */
  927. #endif /* HAL_NOR_MODULE_ENABLED */
  928. /**
  929. * @}
  930. */
  931. /**
  932. * @}
  933. */