stm32f1xx_ll_fsmc.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  1. /**
  2. ******************************************************************************
  3. * @file stm32f1xx_ll_fsmc.c
  4. * @author MCD Application Team
  5. * @version V1.1.1
  6. * @date 12-May-2017
  7. * @brief FSMC Low Layer HAL module driver.
  8. *
  9. * This file provides firmware functions to manage the following
  10. * functionalities of the Flexible Static Memory Controller (FSMC) peripheral memories:
  11. * + Initialization/de-initialization functions
  12. * + Peripheral Control functions
  13. * + Peripheral State functions
  14. *
  15. @verbatim
  16. =============================================================================
  17. ##### FSMC peripheral features #####
  18. =============================================================================
  19. [..] The Flexible static memory controller (FSMC) includes following memory controllers:
  20. (+) The NOR/PSRAM memory controller
  21. (+) The PC Card memory controller
  22. (+) The NAND memory controller
  23. (PC Card and NAND controllers available only on STM32F101xE, STM32F103xE, STM32F101xG and STM32F103xG)
  24. [..] The FSMC functional block makes the interface with synchronous and asynchronous static
  25. memories and 16-bit PC memory cards. Its main purposes are:
  26. (+) to translate AHB transactions into the appropriate external device protocol.
  27. (+) to meet the access time requirements of the external memory devices.
  28. [..] All external memories share the addresses, data and control signals with the controller.
  29. Each external device is accessed by means of a unique Chip Select. The FSMC performs
  30. only one access at a time to an external device.
  31. The main features of the FSMC controller are the following:
  32. (+) Interface with static-memory mapped devices including:
  33. (++) Static random access memory (SRAM).
  34. (++) NOR Flash memory.
  35. (++) PSRAM (4 memory banks).
  36. (++) 16-bit PC Card compatible devices.
  37. (++) Two banks of NAND Flash memory with ECC hardware to check up to 8 Kbytes of
  38. data.
  39. (+) Independent Chip Select control for each memory bank.
  40. (+) Independent configuration for each memory bank.
  41. @endverbatim
  42. ******************************************************************************
  43. * @attention
  44. *
  45. * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
  46. *
  47. * Redistribution and use in source and binary forms, with or without modification,
  48. * are permitted provided that the following conditions are met:
  49. * 1. Redistributions of source code must retain the above copyright notice,
  50. * this list of conditions and the following disclaimer.
  51. * 2. Redistributions in binary form must reproduce the above copyright notice,
  52. * this list of conditions and the following disclaimer in the documentation
  53. * and/or other materials provided with the distribution.
  54. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  55. * may be used to endorse or promote products derived from this software
  56. * without specific prior written permission.
  57. *
  58. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  59. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  60. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  61. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  62. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  63. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  64. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  65. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  66. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  67. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  68. *
  69. ******************************************************************************
  70. */
  71. /* Includes ------------------------------------------------------------------*/
  72. #include "stm32f1xx_hal.h"
  73. /** @addtogroup STM32F1xx_HAL_Driver
  74. * @{
  75. */
  76. #if defined(FSMC_BANK1)
  77. #if defined(HAL_SRAM_MODULE_ENABLED) || defined(HAL_NOR_MODULE_ENABLED) || defined(HAL_PCCARD_MODULE_ENABLED) || defined(HAL_NAND_MODULE_ENABLED)
  78. /** @defgroup FSMC_LL FSMC Low Layer
  79. * @brief FSMC driver modules
  80. * @{
  81. */
  82. /* Private typedef -----------------------------------------------------------*/
  83. /* Private define ------------------------------------------------------------*/
  84. /* Private macro -------------------------------------------------------------*/
  85. /* Private variables ---------------------------------------------------------*/
  86. /* Private function prototypes -----------------------------------------------*/
  87. /* Exported functions --------------------------------------------------------*/
  88. /** @defgroup FSMC_LL_Exported_Functions FSMC Low Layer Exported Functions
  89. * @{
  90. */
  91. /** @defgroup FSMC_NORSRAM FSMC NORSRAM Controller functions
  92. * @brief NORSRAM Controller functions
  93. *
  94. @verbatim
  95. ==============================================================================
  96. ##### How to use NORSRAM device driver #####
  97. ==============================================================================
  98. [..]
  99. This driver contains a set of APIs to interface with the FSMC NORSRAM banks in order
  100. to run the NORSRAM external devices.
  101. (+) FSMC NORSRAM bank reset using the function FSMC_NORSRAM_DeInit()
  102. (+) FSMC NORSRAM bank control configuration using the function FSMC_NORSRAM_Init()
  103. (+) FSMC NORSRAM bank timing configuration using the function FSMC_NORSRAM_Timing_Init()
  104. (+) FSMC NORSRAM bank extended timing configuration using the function
  105. FSMC_NORSRAM_Extended_Timing_Init()
  106. (+) FSMC NORSRAM bank enable/disable write operation using the functions
  107. FSMC_NORSRAM_WriteOperation_Enable()/FSMC_NORSRAM_WriteOperation_Disable()
  108. @endverbatim
  109. * @{
  110. */
  111. /** @addtogroup FSMC_LL_NORSRAM_Private_Functions_Group1
  112. * @brief Initialization and Configuration functions
  113. *
  114. @verbatim
  115. ==============================================================================
  116. ##### Initialization and de_initialization functions #####
  117. ==============================================================================
  118. [..]
  119. This section provides functions allowing to:
  120. (+) Initialize and configure the FSMC NORSRAM interface
  121. (+) De-initialize the FSMC NORSRAM interface
  122. (+) Configure the FSMC clock and associated GPIOs
  123. @endverbatim
  124. * @{
  125. */
  126. /**
  127. * @brief Initialize the FSMC_NORSRAM device according to the specified
  128. * control parameters in the FSMC_NORSRAM_InitTypeDef
  129. * @param Device: Pointer to NORSRAM device instance
  130. * @param Init: Pointer to NORSRAM Initialization structure
  131. * @retval HAL status
  132. */
  133. HAL_StatusTypeDef FSMC_NORSRAM_Init(FSMC_NORSRAM_TypeDef *Device, FSMC_NORSRAM_InitTypeDef *Init)
  134. {
  135. /* Check the parameters */
  136. assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
  137. assert_param(IS_FSMC_NORSRAM_BANK(Init->NSBank));
  138. assert_param(IS_FSMC_MUX(Init->DataAddressMux));
  139. assert_param(IS_FSMC_MEMORY(Init->MemoryType));
  140. assert_param(IS_FSMC_NORSRAM_MEMORY_WIDTH(Init->MemoryDataWidth));
  141. assert_param(IS_FSMC_BURSTMODE(Init->BurstAccessMode));
  142. assert_param(IS_FSMC_WAIT_POLARITY(Init->WaitSignalPolarity));
  143. assert_param(IS_FSMC_WRAP_MODE(Init->WrapMode));
  144. assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(Init->WaitSignalActive));
  145. assert_param(IS_FSMC_WRITE_OPERATION(Init->WriteOperation));
  146. assert_param(IS_FSMC_WAITE_SIGNAL(Init->WaitSignal));
  147. assert_param(IS_FSMC_EXTENDED_MODE(Init->ExtendedMode));
  148. assert_param(IS_FSMC_ASYNWAIT(Init->AsynchronousWait));
  149. assert_param(IS_FSMC_WRITE_BURST(Init->WriteBurst));
  150. /* Disable NORSRAM Device */
  151. __FSMC_NORSRAM_DISABLE(Device, Init->NSBank);
  152. /* Set NORSRAM device control parameters */
  153. if (Init->MemoryType == FSMC_MEMORY_TYPE_NOR)
  154. {
  155. MODIFY_REG(Device->BTCR[Init->NSBank], BCR_CLEAR_MASK, (uint32_t)(FSMC_NORSRAM_FLASH_ACCESS_ENABLE
  156. | Init->DataAddressMux
  157. | Init->MemoryType
  158. | Init->MemoryDataWidth
  159. | Init->BurstAccessMode
  160. | Init->WaitSignalPolarity
  161. | Init->WrapMode
  162. | Init->WaitSignalActive
  163. | Init->WriteOperation
  164. | Init->WaitSignal
  165. | Init->ExtendedMode
  166. | Init->AsynchronousWait
  167. | Init->WriteBurst
  168. )
  169. );
  170. }
  171. else
  172. {
  173. MODIFY_REG(Device->BTCR[Init->NSBank], BCR_CLEAR_MASK, (uint32_t)(FSMC_NORSRAM_FLASH_ACCESS_DISABLE
  174. | Init->DataAddressMux
  175. | Init->MemoryType
  176. | Init->MemoryDataWidth
  177. | Init->BurstAccessMode
  178. | Init->WaitSignalPolarity
  179. | Init->WrapMode
  180. | Init->WaitSignalActive
  181. | Init->WriteOperation
  182. | Init->WaitSignal
  183. | Init->ExtendedMode
  184. | Init->AsynchronousWait
  185. | Init->WriteBurst
  186. )
  187. );
  188. }
  189. return HAL_OK;
  190. }
  191. /**
  192. * @brief DeInitialize the FSMC_NORSRAM peripheral
  193. * @param Device: Pointer to NORSRAM device instance
  194. * @param ExDevice: Pointer to NORSRAM extended mode device instance
  195. * @param Bank: NORSRAM bank number
  196. * @retval HAL status
  197. */
  198. HAL_StatusTypeDef FSMC_NORSRAM_DeInit(FSMC_NORSRAM_TypeDef *Device, FSMC_NORSRAM_EXTENDED_TypeDef *ExDevice, uint32_t Bank)
  199. {
  200. /* Check the parameters */
  201. assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
  202. assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(ExDevice));
  203. assert_param(IS_FSMC_NORSRAM_BANK(Bank));
  204. /* Disable the FSMC_NORSRAM device */
  205. __FSMC_NORSRAM_DISABLE(Device, Bank);
  206. /* De-initialize the FSMC_NORSRAM device */
  207. /* FSMC_NORSRAM_BANK1 */
  208. if(Bank == FSMC_NORSRAM_BANK1)
  209. {
  210. Device->BTCR[Bank] = 0x000030DBU;
  211. }
  212. /* FSMC_NORSRAM_BANK2, FSMC_NORSRAM_BANK3 or FSMC_NORSRAM_BANK4 */
  213. else
  214. {
  215. Device->BTCR[Bank] = 0x000030D2U;
  216. }
  217. Device->BTCR[Bank + 1U] = 0x0FFFFFFFU;
  218. ExDevice->BWTR[Bank] = 0x0FFFFFFFU;
  219. return HAL_OK;
  220. }
  221. /**
  222. * @brief Initialize the FSMC_NORSRAM Timing according to the specified
  223. * parameters in the FSMC_NORSRAM_TimingTypeDef
  224. * @param Device: Pointer to NORSRAM device instance
  225. * @param Timing: Pointer to NORSRAM Timing structure
  226. * @param Bank: NORSRAM bank number
  227. * @retval HAL status
  228. */
  229. HAL_StatusTypeDef FSMC_NORSRAM_Timing_Init(FSMC_NORSRAM_TypeDef *Device, FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank)
  230. {
  231. /* Check the parameters */
  232. assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
  233. assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime));
  234. assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime));
  235. assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime));
  236. assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration));
  237. assert_param(IS_FSMC_CLK_DIV(Timing->CLKDivision));
  238. assert_param(IS_FSMC_DATA_LATENCY(Timing->DataLatency));
  239. assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode));
  240. assert_param(IS_FSMC_NORSRAM_BANK(Bank));
  241. /* Set FSMC_NORSRAM device timing parameters */
  242. MODIFY_REG(Device->BTCR[Bank + 1U], \
  243. BTR_CLEAR_MASK, \
  244. (uint32_t)(Timing->AddressSetupTime | \
  245. ((Timing->AddressHoldTime) << FSMC_BTRx_ADDHLD_Pos) | \
  246. ((Timing->DataSetupTime) << FSMC_BTRx_DATAST_Pos) | \
  247. ((Timing->BusTurnAroundDuration) << FSMC_BTRx_BUSTURN_Pos) | \
  248. (((Timing->CLKDivision) - 1U) << FSMC_BTRx_CLKDIV_Pos) | \
  249. (((Timing->DataLatency) - 2U) << FSMC_BTRx_DATLAT_Pos) | \
  250. (Timing->AccessMode)));
  251. return HAL_OK;
  252. }
  253. /**
  254. * @brief Initialize the FSMC_NORSRAM Extended mode Timing according to the specified
  255. * parameters in the FSMC_NORSRAM_TimingTypeDef
  256. * @param Device: Pointer to NORSRAM device instance
  257. * @param Timing: Pointer to NORSRAM Timing structure
  258. * @param Bank: NORSRAM bank number
  259. * @param ExtendedMode FSMC Extended Mode
  260. * This parameter can be one of the following values:
  261. * @arg FSMC_EXTENDED_MODE_DISABLE
  262. * @arg FSMC_EXTENDED_MODE_ENABLE
  263. * @retval HAL status
  264. */
  265. HAL_StatusTypeDef FSMC_NORSRAM_Extended_Timing_Init(FSMC_NORSRAM_EXTENDED_TypeDef *Device, FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank, uint32_t ExtendedMode)
  266. {
  267. /* Check the parameters */
  268. assert_param(IS_FSMC_EXTENDED_MODE(ExtendedMode));
  269. /* Set NORSRAM device timing register for write configuration, if extended mode is used */
  270. if(ExtendedMode == FSMC_EXTENDED_MODE_ENABLE)
  271. {
  272. /* Check the parameters */
  273. assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(Device));
  274. assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime));
  275. assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime));
  276. assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime));
  277. #if defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG) || defined(STM32F103xG)
  278. assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration));
  279. #else
  280. assert_param(IS_FSMC_CLK_DIV(Timing->CLKDivision));
  281. assert_param(IS_FSMC_DATA_LATENCY(Timing->DataLatency));
  282. #endif /* STM32F101xE || STM32F103xE || STM32F101xG || STM32F103xG */
  283. assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode));
  284. assert_param(IS_FSMC_NORSRAM_BANK(Bank));
  285. /* Set NORSRAM device timing register for write configuration, if extended mode is used */
  286. #if defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG) || defined(STM32F103xG)
  287. MODIFY_REG(Device->BWTR[Bank], \
  288. BWTR_CLEAR_MASK, \
  289. (uint32_t)(Timing->AddressSetupTime | \
  290. ((Timing->AddressHoldTime) << FSMC_BWTRx_ADDHLD_Pos) | \
  291. ((Timing->DataSetupTime) << FSMC_BWTRx_DATAST_Pos) | \
  292. Timing->AccessMode | \
  293. ((Timing->BusTurnAroundDuration) << FSMC_BWTRx_BUSTURN_Pos)));
  294. #else
  295. MODIFY_REG(Device->BWTR[Bank], \
  296. BWTR_CLEAR_MASK, \
  297. (uint32_t)(Timing->AddressSetupTime | \
  298. ((Timing->AddressHoldTime) << FSMC_BWTRx_ADDHLD_Pos) | \
  299. ((Timing->DataSetupTime) << FSMC_BWTRx_DATAST_Pos) | \
  300. Timing->AccessMode | \
  301. (((Timing->CLKDivision) - 1U) << FSMC_BTRx_CLKDIV_Pos) | \
  302. (((Timing->DataLatency) - 2U) << FSMC_BWTRx_DATLAT_Pos)));
  303. #endif /* STM32F101xE || STM32F103xE || STM32F101xG || STM32F103xG */
  304. }
  305. else
  306. {
  307. Device->BWTR[Bank] = 0x0FFFFFFFU;
  308. }
  309. return HAL_OK;
  310. }
  311. /**
  312. * @}
  313. */
  314. /** @defgroup FSMC_NORSRAM_Group2 Control functions
  315. * @brief management functions
  316. *
  317. @verbatim
  318. ==============================================================================
  319. ##### FSMC_NORSRAM Control functions #####
  320. ==============================================================================
  321. [..]
  322. This subsection provides a set of functions allowing to control dynamically
  323. the FSMC NORSRAM interface.
  324. @endverbatim
  325. * @{
  326. */
  327. /**
  328. * @brief Enables dynamically FSMC_NORSRAM write operation.
  329. * @param Device: Pointer to NORSRAM device instance
  330. * @param Bank: NORSRAM bank number
  331. * @retval HAL status
  332. */
  333. HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Enable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank)
  334. {
  335. /* Check the parameters */
  336. assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
  337. assert_param(IS_FSMC_NORSRAM_BANK(Bank));
  338. /* Enable write operation */
  339. SET_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE);
  340. return HAL_OK;
  341. }
  342. /**
  343. * @brief Disables dynamically FSMC_NORSRAM write operation.
  344. * @param Device: Pointer to NORSRAM device instance
  345. * @param Bank: NORSRAM bank number
  346. * @retval HAL status
  347. */
  348. HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Disable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank)
  349. {
  350. /* Check the parameters */
  351. assert_param(IS_FSMC_NORSRAM_DEVICE(Device));
  352. assert_param(IS_FSMC_NORSRAM_BANK(Bank));
  353. /* Disable write operation */
  354. CLEAR_BIT(Device->BTCR[Bank], FSMC_WRITE_OPERATION_ENABLE);
  355. return HAL_OK;
  356. }
  357. /**
  358. * @}
  359. */
  360. /**
  361. * @}
  362. */
  363. #if (defined (STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG) || defined(STM32F103xG))
  364. /** @defgroup FSMC_NAND FSMC NAND Controller functions
  365. * @brief NAND Controller functions
  366. *
  367. @verbatim
  368. ==============================================================================
  369. ##### How to use NAND device driver #####
  370. ==============================================================================
  371. [..]
  372. This driver contains a set of APIs to interface with the FSMC NAND banks in order
  373. to run the NAND external devices.
  374. (+) FSMC NAND bank reset using the function FSMC_NAND_DeInit()
  375. (+) FSMC NAND bank control configuration using the function FSMC_NAND_Init()
  376. (+) FSMC NAND bank common space timing configuration using the function
  377. FSMC_NAND_CommonSpace_Timing_Init()
  378. (+) FSMC NAND bank attribute space timing configuration using the function
  379. FSMC_NAND_AttributeSpace_Timing_Init()
  380. (+) FSMC NAND bank enable/disable ECC correction feature using the functions
  381. FSMC_NAND_ECC_Enable()/FSMC_NAND_ECC_Disable()
  382. (+) FSMC NAND bank get ECC correction code using the function FSMC_NAND_GetECC()
  383. @endverbatim
  384. * @{
  385. */
  386. /** @defgroup FSMC_NAND_Exported_Functions_Group1 Initialization and de-initialization functions
  387. * @brief Initialization and Configuration functions
  388. *
  389. @verbatim
  390. ==============================================================================
  391. ##### Initialization and de_initialization functions #####
  392. ==============================================================================
  393. [..]
  394. This section provides functions allowing to:
  395. (+) Initialize and configure the FSMC NAND interface
  396. (+) De-initialize the FSMC NAND interface
  397. (+) Configure the FSMC clock and associated GPIOs
  398. @endverbatim
  399. * @{
  400. */
  401. /**
  402. * @brief Initializes the FSMC_NAND device according to the specified
  403. * control parameters in the FSMC_NAND_HandleTypeDef
  404. * @param Device: Pointer to NAND device instance
  405. * @param Init: Pointer to NAND Initialization structure
  406. * @retval HAL status
  407. */
  408. HAL_StatusTypeDef FSMC_NAND_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_InitTypeDef *Init)
  409. {
  410. /* Check the parameters */
  411. assert_param(IS_FSMC_NAND_DEVICE(Device));
  412. assert_param(IS_FSMC_NAND_BANK(Init->NandBank));
  413. assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature));
  414. assert_param(IS_FSMC_NAND_MEMORY_WIDTH(Init->MemoryDataWidth));
  415. assert_param(IS_FSMC_ECC_STATE(Init->EccComputation));
  416. assert_param(IS_FSMC_ECCPAGE_SIZE(Init->ECCPageSize));
  417. assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime));
  418. assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime));
  419. /* Set NAND device control parameters */
  420. if (Init->NandBank == FSMC_NAND_BANK2)
  421. {
  422. /* NAND bank 2 registers configuration */
  423. MODIFY_REG(Device->PCR2, PCR_CLEAR_MASK, (Init->Waitfeature |
  424. FSMC_PCR_MEMORY_TYPE_NAND |
  425. Init->MemoryDataWidth |
  426. Init->EccComputation |
  427. Init->ECCPageSize |
  428. ((Init->TCLRSetupTime) << FSMC_PCRx_TCLR_Pos) |
  429. ((Init->TARSetupTime) << FSMC_PCRx_TAR_Pos)));
  430. }
  431. else
  432. {
  433. /* NAND bank 3 registers configuration */
  434. MODIFY_REG(Device->PCR3, PCR_CLEAR_MASK, (Init->Waitfeature |
  435. FSMC_PCR_MEMORY_TYPE_NAND |
  436. Init->MemoryDataWidth |
  437. Init->EccComputation |
  438. Init->ECCPageSize |
  439. ((Init->TCLRSetupTime) << FSMC_PCRx_TCLR_Pos) |
  440. ((Init->TARSetupTime) << FSMC_PCRx_TAR_Pos)));
  441. }
  442. return HAL_OK;
  443. }
  444. /**
  445. * @brief Initializes the FSMC_NAND Common space Timing according to the specified
  446. * parameters in the FSMC_NAND_PCC_TimingTypeDef
  447. * @param Device: Pointer to NAND device instance
  448. * @param Timing: Pointer to NAND timing structure
  449. * @param Bank: NAND bank number
  450. * @retval HAL status
  451. */
  452. HAL_StatusTypeDef FSMC_NAND_CommonSpace_Timing_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank)
  453. {
  454. /* Check the parameters */
  455. assert_param(IS_FSMC_NAND_DEVICE(Device));
  456. assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
  457. assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
  458. assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
  459. assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
  460. assert_param(IS_FSMC_NAND_BANK(Bank));
  461. /* Set FMC_NAND device timing parameters */
  462. if(Bank == FSMC_NAND_BANK2)
  463. {
  464. /* NAND bank 2 registers configuration */
  465. MODIFY_REG(Device->PMEM2, PMEM_CLEAR_MASK, (Timing->SetupTime | \
  466. ((Timing->WaitSetupTime) << FSMC_PMEMx_MEMWAITx_Pos) | \
  467. ((Timing->HoldSetupTime) << FSMC_PMEMx_MEMHOLDx_Pos) | \
  468. ((Timing->HiZSetupTime) << FSMC_PMEMx_MEMHIZx_Pos)));
  469. }
  470. else
  471. {
  472. /* NAND bank 3 registers configuration */
  473. MODIFY_REG(Device->PMEM3, PMEM_CLEAR_MASK, (Timing->SetupTime | \
  474. ((Timing->WaitSetupTime) << FSMC_PMEMx_MEMWAITx_Pos) | \
  475. ((Timing->HoldSetupTime) << FSMC_PMEMx_MEMHOLDx_Pos) | \
  476. ((Timing->HiZSetupTime) << FSMC_PMEMx_MEMHIZx_Pos)));
  477. }
  478. return HAL_OK;
  479. }
  480. /**
  481. * @brief Initializes the FSMC_NAND Attribute space Timing according to the specified
  482. * parameters in the FSMC_NAND_PCC_TimingTypeDef
  483. * @param Device: Pointer to NAND device instance
  484. * @param Timing: Pointer to NAND timing structure
  485. * @param Bank: NAND bank number
  486. * @retval HAL status
  487. */
  488. HAL_StatusTypeDef FSMC_NAND_AttributeSpace_Timing_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank)
  489. {
  490. /* Check the parameters */
  491. assert_param(IS_FSMC_NAND_DEVICE(Device));
  492. assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
  493. assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
  494. assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
  495. assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
  496. assert_param(IS_FSMC_NAND_BANK(Bank));
  497. /* Set FMC_NAND device timing parameters */
  498. if(Bank == FSMC_NAND_BANK2)
  499. {
  500. /* NAND bank 2 registers configuration */
  501. MODIFY_REG(Device->PATT2, PATT_CLEAR_MASK, (Timing->SetupTime | \
  502. ((Timing->WaitSetupTime) << FSMC_PATTx_ATTWAITx_Pos) | \
  503. ((Timing->HoldSetupTime) << FSMC_PATTx_ATTHOLDx_Pos) | \
  504. ((Timing->HiZSetupTime) << FSMC_PATTx_ATTHIZx_Pos)));
  505. }
  506. else
  507. {
  508. /* NAND bank 3 registers configuration */
  509. MODIFY_REG(Device->PATT3, PATT_CLEAR_MASK, (Timing->SetupTime | \
  510. ((Timing->WaitSetupTime) << FSMC_PATTx_ATTWAITx_Pos) | \
  511. ((Timing->HoldSetupTime) << FSMC_PATTx_ATTHOLDx_Pos) | \
  512. ((Timing->HiZSetupTime) << FSMC_PATTx_ATTHIZx_Pos)));
  513. }
  514. return HAL_OK;
  515. }
  516. /**
  517. * @brief DeInitializes the FSMC_NAND device
  518. * @param Device: Pointer to NAND device instance
  519. * @param Bank: NAND bank number
  520. * @retval HAL status
  521. */
  522. HAL_StatusTypeDef FSMC_NAND_DeInit(FSMC_NAND_TypeDef *Device, uint32_t Bank)
  523. {
  524. /* Check the parameters */
  525. assert_param(IS_FSMC_NAND_DEVICE(Device));
  526. assert_param(IS_FSMC_NAND_BANK(Bank));
  527. /* Disable the NAND Bank */
  528. __FSMC_NAND_DISABLE(Device, Bank);
  529. /* De-initialize the NAND Bank */
  530. if(Bank == FSMC_NAND_BANK2)
  531. {
  532. /* Set the FSMC_NAND_BANK2 registers to their reset values */
  533. WRITE_REG(Device->PCR2, 0x00000018U);
  534. WRITE_REG(Device->SR2, 0x00000040U);
  535. WRITE_REG(Device->PMEM2, 0xFCFCFCFCU);
  536. WRITE_REG(Device->PATT2, 0xFCFCFCFCU);
  537. }
  538. /* FSMC_Bank3_NAND */
  539. else
  540. {
  541. /* Set the FSMC_NAND_BANK3 registers to their reset values */
  542. WRITE_REG(Device->PCR3, 0x00000018U);
  543. WRITE_REG(Device->SR3, 0x00000040U);
  544. WRITE_REG(Device->PMEM3, 0xFCFCFCFCU);
  545. WRITE_REG(Device->PATT3, 0xFCFCFCFCU);
  546. }
  547. return HAL_OK;
  548. }
  549. /**
  550. * @}
  551. */
  552. /** @defgroup FSMC_NAND_Exported_Functions_Group2 Peripheral Control functions
  553. * @brief management functions
  554. *
  555. @verbatim
  556. ==============================================================================
  557. ##### FSMC_NAND Control functions #####
  558. ==============================================================================
  559. [..]
  560. This subsection provides a set of functions allowing to control dynamically
  561. the FSMC NAND interface.
  562. @endverbatim
  563. * @{
  564. */
  565. /**
  566. * @brief Enables dynamically FSMC_NAND ECC feature.
  567. * @param Device: Pointer to NAND device instance
  568. * @param Bank: NAND bank number
  569. * @retval HAL status
  570. */
  571. HAL_StatusTypeDef FSMC_NAND_ECC_Enable(FSMC_NAND_TypeDef *Device, uint32_t Bank)
  572. {
  573. /* Check the parameters */
  574. assert_param(IS_FSMC_NAND_DEVICE(Device));
  575. assert_param(IS_FSMC_NAND_BANK(Bank));
  576. /* Enable ECC feature */
  577. if(Bank == FSMC_NAND_BANK2)
  578. {
  579. SET_BIT(Device->PCR2, FSMC_PCRx_ECCEN);
  580. }
  581. else
  582. {
  583. SET_BIT(Device->PCR3, FSMC_PCRx_ECCEN);
  584. }
  585. return HAL_OK;
  586. }
  587. /**
  588. * @brief Disables dynamically FSMC_NAND ECC feature.
  589. * @param Device: Pointer to NAND device instance
  590. * @param Bank: NAND bank number
  591. * @retval HAL status
  592. */
  593. HAL_StatusTypeDef FSMC_NAND_ECC_Disable(FSMC_NAND_TypeDef *Device, uint32_t Bank)
  594. {
  595. /* Check the parameters */
  596. assert_param(IS_FSMC_NAND_DEVICE(Device));
  597. assert_param(IS_FSMC_NAND_BANK(Bank));
  598. /* Disable ECC feature */
  599. if(Bank == FSMC_NAND_BANK2)
  600. {
  601. CLEAR_BIT(Device->PCR2, FSMC_PCRx_ECCEN);
  602. }
  603. else
  604. {
  605. CLEAR_BIT(Device->PCR3, FSMC_PCRx_ECCEN);
  606. }
  607. return HAL_OK;
  608. }
  609. /**
  610. * @brief Disables dynamically FSMC_NAND ECC feature.
  611. * @param Device: Pointer to NAND device instance
  612. * @param ECCval: Pointer to ECC value
  613. * @param Bank: NAND bank number
  614. * @param Timeout: Timeout wait value
  615. * @retval HAL status
  616. */
  617. HAL_StatusTypeDef FSMC_NAND_GetECC(FSMC_NAND_TypeDef *Device, uint32_t *ECCval, uint32_t Bank, uint32_t Timeout)
  618. {
  619. uint32_t tickstart = 0U;
  620. /* Check the parameters */
  621. assert_param(IS_FSMC_NAND_DEVICE(Device));
  622. assert_param(IS_FSMC_NAND_BANK(Bank));
  623. /* Get tick */
  624. tickstart = HAL_GetTick();
  625. /* Wait until FIFO is empty */
  626. while(__FSMC_NAND_GET_FLAG(Device, Bank, FSMC_FLAG_FEMPT) == RESET)
  627. {
  628. /* Check for the Timeout */
  629. if(Timeout != HAL_MAX_DELAY)
  630. {
  631. if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout))
  632. {
  633. return HAL_TIMEOUT;
  634. }
  635. }
  636. }
  637. if(Bank == FSMC_NAND_BANK2)
  638. {
  639. /* Get the ECCR2 register value */
  640. *ECCval = (uint32_t)Device->ECCR2;
  641. }
  642. else
  643. {
  644. /* Get the ECCR3 register value */
  645. *ECCval = (uint32_t)Device->ECCR3;
  646. }
  647. return HAL_OK;
  648. }
  649. /**
  650. * @}
  651. */
  652. /**
  653. * @}
  654. */
  655. /** @defgroup FSMC_PCCARD FSMC PCCARD Controller functions
  656. * @brief PCCARD Controller functions
  657. *
  658. @verbatim
  659. ==============================================================================
  660. ##### How to use PCCARD device driver #####
  661. ==============================================================================
  662. [..]
  663. This driver contains a set of APIs to interface with the FSMC PCCARD bank in order
  664. to run the PCCARD/compact flash external devices.
  665. (+) FSMC PCCARD bank reset using the function FSMC_PCCARD_DeInit()
  666. (+) FSMC PCCARD bank control configuration using the function FSMC_PCCARD_Init()
  667. (+) FSMC PCCARD bank common space timing configuration using the function
  668. FSMC_PCCARD_CommonSpace_Timing_Init()
  669. (+) FSMC PCCARD bank attribute space timing configuration using the function
  670. FSMC_PCCARD_AttributeSpace_Timing_Init()
  671. (+) FSMC PCCARD bank IO space timing configuration using the function
  672. FSMC_PCCARD_IOSpace_Timing_Init()
  673. @endverbatim
  674. * @{
  675. */
  676. /** @defgroup FSMC_PCCARD_Exported_Functions_Group1 Initialization and de-initialization functions
  677. * @brief Initialization and Configuration functions
  678. *
  679. @verbatim
  680. ==============================================================================
  681. ##### Initialization and de_initialization functions #####
  682. ==============================================================================
  683. [..]
  684. This section provides functions allowing to:
  685. (+) Initialize and configure the FSMC PCCARD interface
  686. (+) De-initialize the FSMC PCCARD interface
  687. (+) Configure the FSMC clock and associated GPIOs
  688. @endverbatim
  689. * @{
  690. */
  691. /**
  692. * @brief Initializes the FSMC_PCCARD device according to the specified
  693. * control parameters in the FSMC_PCCARD_HandleTypeDef
  694. * @param Device: Pointer to PCCARD device instance
  695. * @param Init: Pointer to PCCARD Initialization structure
  696. * @retval HAL status
  697. */
  698. HAL_StatusTypeDef FSMC_PCCARD_Init(FSMC_PCCARD_TypeDef *Device, FSMC_PCCARD_InitTypeDef *Init)
  699. {
  700. /* Check the parameters */
  701. assert_param(IS_FSMC_PCCARD_DEVICE(Device));
  702. assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature));
  703. assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime));
  704. assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime));
  705. /* Set FSMC_PCCARD device control parameters */
  706. MODIFY_REG(Device->PCR4,
  707. (FSMC_PCRx_PTYP | FSMC_PCRx_PWAITEN | FSMC_PCRx_PWID |
  708. FSMC_PCRx_TCLR | FSMC_PCRx_TAR),
  709. (FSMC_PCR_MEMORY_TYPE_PCCARD |
  710. Init->Waitfeature |
  711. FSMC_NAND_PCC_MEM_BUS_WIDTH_16 |
  712. (Init->TCLRSetupTime << FSMC_PCRx_TCLR_Pos) |
  713. (Init->TARSetupTime << FSMC_PCRx_TAR_Pos)));
  714. return HAL_OK;
  715. }
  716. /**
  717. * @brief Initializes the FSMC_PCCARD Common space Timing according to the specified
  718. * parameters in the FSMC_NAND_PCC_TimingTypeDef
  719. * @param Device: Pointer to PCCARD device instance
  720. * @param Timing: Pointer to PCCARD timing structure
  721. * @retval HAL status
  722. */
  723. HAL_StatusTypeDef FSMC_PCCARD_CommonSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing)
  724. {
  725. /* Check the parameters */
  726. assert_param(IS_FSMC_PCCARD_DEVICE(Device));
  727. assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
  728. assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
  729. assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
  730. assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
  731. /* Set PCCARD timing parameters */
  732. MODIFY_REG(Device->PMEM4, PMEM_CLEAR_MASK,
  733. (Timing->SetupTime |
  734. ((Timing->WaitSetupTime) << FSMC_PMEMx_MEMWAITx_Pos) |
  735. ((Timing->HoldSetupTime) << FSMC_PMEMx_MEMHOLDx_Pos) |
  736. ((Timing->HiZSetupTime) << FSMC_PMEMx_MEMHIZx_Pos)));
  737. return HAL_OK;
  738. }
  739. /**
  740. * @brief Initializes the FSMC_PCCARD Attribute space Timing according to the specified
  741. * parameters in the FSMC_NAND_PCC_TimingTypeDef
  742. * @param Device: Pointer to PCCARD device instance
  743. * @param Timing: Pointer to PCCARD timing structure
  744. * @retval HAL status
  745. */
  746. HAL_StatusTypeDef FSMC_PCCARD_AttributeSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing)
  747. {
  748. /* Check the parameters */
  749. assert_param(IS_FSMC_PCCARD_DEVICE(Device));
  750. assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
  751. assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
  752. assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
  753. assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
  754. /* Set PCCARD timing parameters */
  755. MODIFY_REG(Device->PATT4, PATT_CLEAR_MASK, \
  756. (Timing->SetupTime | \
  757. ((Timing->WaitSetupTime) << FSMC_PATTx_ATTWAITx_Pos) | \
  758. ((Timing->HoldSetupTime) << FSMC_PATTx_ATTHOLDx_Pos) | \
  759. ((Timing->HiZSetupTime) << FSMC_PATTx_ATTHIZx_Pos)));
  760. return HAL_OK;
  761. }
  762. /**
  763. * @brief Initializes the FSMC_PCCARD IO space Timing according to the specified
  764. * parameters in the FSMC_NAND_PCC_TimingTypeDef
  765. * @param Device: Pointer to PCCARD device instance
  766. * @param Timing: Pointer to PCCARD timing structure
  767. * @retval HAL status
  768. */
  769. HAL_StatusTypeDef FSMC_PCCARD_IOSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing)
  770. {
  771. /* Check the parameters */
  772. assert_param(IS_FSMC_PCCARD_DEVICE(Device));
  773. assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime));
  774. assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime));
  775. assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime));
  776. assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime));
  777. /* Set FSMC_PCCARD device timing parameters */
  778. MODIFY_REG(Device->PIO4, PIO4_CLEAR_MASK, \
  779. (Timing->SetupTime | \
  780. (Timing->WaitSetupTime << FSMC_PIO4_IOWAIT4_Pos) | \
  781. (Timing->HoldSetupTime << FSMC_PIO4_IOHOLD4_Pos) | \
  782. (Timing->HiZSetupTime << FSMC_PIO4_IOHIZ4_Pos)));
  783. return HAL_OK;
  784. }
  785. /**
  786. * @brief DeInitializes the FSMC_PCCARD device
  787. * @param Device: Pointer to PCCARD device instance
  788. * @retval HAL status
  789. */
  790. HAL_StatusTypeDef FSMC_PCCARD_DeInit(FSMC_PCCARD_TypeDef *Device)
  791. {
  792. /* Check the parameters */
  793. assert_param(IS_FSMC_PCCARD_DEVICE(Device));
  794. /* Disable the FSMC_PCCARD device */
  795. __FSMC_PCCARD_DISABLE(Device);
  796. /* De-initialize the FSMC_PCCARD device */
  797. WRITE_REG(Device->PCR4, 0x00000018U);
  798. WRITE_REG(Device->SR4, 0x00000040U);
  799. WRITE_REG(Device->PMEM4, 0xFCFCFCFCU);
  800. WRITE_REG(Device->PATT4, 0xFCFCFCFCU);
  801. WRITE_REG(Device->PIO4, 0xFCFCFCFCU);
  802. return HAL_OK;
  803. }
  804. /**
  805. * @}
  806. */
  807. /**
  808. * @}
  809. */
  810. #endif /* STM32F101xE || STM32F103xE || STM32F101xG || STM32F103xG */
  811. /**
  812. * @}
  813. */
  814. /**
  815. * @}
  816. */
  817. #endif /* HAL_SRAM_MODULE_ENABLED || HAL_NOR_MODULE_ENABLED || HAL_NAND_MODULE_ENABLED || HAL_PCCARD_MODULE_ENABLED */
  818. #endif /* FSMC_BANK1 */
  819. /**
  820. * @}
  821. */
  822. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/