1 /**
2 ******************************************************************************
3 * @file stm32g4xx_hal_sram.c
4 * @author MCD Application Team
5 * @brief SRAM HAL module driver.
6 * This file provides a generic firmware to drive SRAM memories
7 * mounted as external device.
8 *
9 ******************************************************************************
10 * @attention
11 *
12 * Copyright (c) 2019 STMicroelectronics.
13 * All rights reserved.
14 *
15 * This software is licensed under terms that can be found in the LICENSE file
16 * in the root directory of this software component.
17 * If no LICENSE file comes with this software, it is provided AS-IS.
18 *
19 ******************************************************************************
20 @verbatim
21 ==============================================================================
22 ##### How to use this driver #####
23 ==============================================================================
24 [..]
25 This driver is a generic layered driver which contains a set of APIs used to
26 control SRAM memories. It uses the FMC layer functions to interface
27 with SRAM devices.
28 The following sequence should be followed to configure the FMC to interface
29 with SRAM/PSRAM memories:
30
31 (#) Declare a SRAM_HandleTypeDef handle structure, for example:
32 SRAM_HandleTypeDef hsram; and:
33
34 (++) Fill the SRAM_HandleTypeDef handle "Init" field with the allowed
35 values of the structure member.
36
37 (++) Fill the SRAM_HandleTypeDef handle "Instance" field with a predefined
38 base register instance for NOR or SRAM device
39
40 (++) Fill the SRAM_HandleTypeDef handle "Extended" field with a predefined
41 base register instance for NOR or SRAM extended mode
42
43 (#) Declare two FMC_NORSRAM_TimingTypeDef structures, for both normal and extended
44 mode timings; for example:
45 FMC_NORSRAM_TimingTypeDef Timing and FMC_NORSRAM_TimingTypeDef ExTiming;
46 and fill its fields with the allowed values of the structure member.
47
48 (#) Initialize the SRAM Controller by calling the function HAL_SRAM_Init(). This function
49 performs the following sequence:
50
51 (##) MSP hardware layer configuration using the function HAL_SRAM_MspInit()
52 (##) Control register configuration using the FMC NORSRAM interface function
53 FMC_NORSRAM_Init()
54 (##) Timing register configuration using the FMC NORSRAM interface function
55 FMC_NORSRAM_Timing_Init()
56 (##) Extended mode Timing register configuration using the FMC NORSRAM interface function
57 FMC_NORSRAM_Extended_Timing_Init()
58 (##) Enable the SRAM device using the macro __FMC_NORSRAM_ENABLE()
59
60 (#) At this stage you can perform read/write accesses from/to the memory connected
61 to the NOR/SRAM Bank. You can perform either polling or DMA transfer using the
62 following APIs:
63 (++) HAL_SRAM_Read()/HAL_SRAM_Write() for polling read/write access
64 (++) HAL_SRAM_Read_DMA()/HAL_SRAM_Write_DMA() for DMA read/write transfer
65
66 (#) You can also control the SRAM device by calling the control APIs HAL_SRAM_WriteOperation_Enable()/
67 HAL_SRAM_WriteOperation_Disable() to respectively enable/disable the SRAM write operation
68
69 (#) You can continuously monitor the SRAM device HAL state by calling the function
70 HAL_SRAM_GetState()
71
72 *** Callback registration ***
73 =============================================
74 [..]
75 The compilation define USE_HAL_SRAM_REGISTER_CALLBACKS when set to 1
76 allows the user to configure dynamically the driver callbacks.
77
78 Use Functions HAL_SRAM_RegisterCallback() to register a user callback,
79 it allows to register following callbacks:
80 (+) MspInitCallback : SRAM MspInit.
81 (+) MspDeInitCallback : SRAM MspDeInit.
82 This function takes as parameters the HAL peripheral handle, the Callback ID
83 and a pointer to the user callback function.
84
85 Use function HAL_SRAM_UnRegisterCallback() to reset a callback to the default
86 weak (overridden) function. It allows to reset following callbacks:
87 (+) MspInitCallback : SRAM MspInit.
88 (+) MspDeInitCallback : SRAM MspDeInit.
89 This function) takes as parameters the HAL peripheral handle and the Callback ID.
90
91 By default, after the HAL_SRAM_Init and if the state is HAL_SRAM_STATE_RESET
92 all callbacks are reset to the corresponding legacy weak (overridden) functions.
93 Exception done for MspInit and MspDeInit callbacks that are respectively
94 reset to the legacy weak (overridden) functions in the HAL_SRAM_Init
95 and HAL_SRAM_DeInit only when these callbacks are null (not registered beforehand).
96 If not, MspInit or MspDeInit are not null, the HAL_SRAM_Init and HAL_SRAM_DeInit
97 keep and use the user MspInit/MspDeInit callbacks (registered beforehand)
98
99 Callbacks can be registered/unregistered in READY state only.
100 Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered
101 in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used
102 during the Init/DeInit.
103 In that case first register the MspInit/MspDeInit user callbacks
104 using HAL_SRAM_RegisterCallback before calling HAL_SRAM_DeInit
105 or HAL_SRAM_Init function.
106
107 When The compilation define USE_HAL_SRAM_REGISTER_CALLBACKS is set to 0 or
108 not defined, the callback registering feature is not available
109 and weak (overridden) callbacks are used.
110
111 @endverbatim
112 ******************************************************************************
113 */
114
115 /* Includes ------------------------------------------------------------------*/
116 #include "stm32g4xx_hal.h"
117
118 #if defined(FMC_BANK1)
119
120 /** @addtogroup STM32G4xx_HAL_Driver
121 * @{
122 */
123
124 #ifdef HAL_SRAM_MODULE_ENABLED
125
126 /** @defgroup SRAM SRAM
127 * @brief SRAM driver modules
128 * @{
129 */
130
131 /* Private typedef -----------------------------------------------------------*/
132 /* Private define ------------------------------------------------------------*/
133 /* Private macro -------------------------------------------------------------*/
134 /* Private variables ---------------------------------------------------------*/
135 /* Private function prototypes -----------------------------------------------*/
136 /** @addtogroup SRAM_Private_Functions SRAM Private Functions
137 * @{
138 */
139 static void SRAM_DMACplt(DMA_HandleTypeDef *hdma);
140 static void SRAM_DMACpltProt(DMA_HandleTypeDef *hdma);
141 static void SRAM_DMAError(DMA_HandleTypeDef *hdma);
142 /**
143 * @}
144 */
145
146 /* Exported functions --------------------------------------------------------*/
147
148 /** @defgroup SRAM_Exported_Functions SRAM Exported Functions
149 * @{
150 */
151
152 /** @defgroup SRAM_Exported_Functions_Group1 Initialization and de-initialization functions
153 * @brief Initialization and Configuration functions.
154 *
155 @verbatim
156 ==============================================================================
157 ##### SRAM Initialization and de_initialization functions #####
158 ==============================================================================
159 [..] This section provides functions allowing to initialize/de-initialize
160 the SRAM memory
161
162 @endverbatim
163 * @{
164 */
165
166 /**
167 * @brief Performs the SRAM device initialization sequence
168 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
169 * the configuration information for SRAM module.
170 * @param Timing Pointer to SRAM control timing structure
171 * @param ExtTiming Pointer to SRAM extended mode timing structure
172 * @retval HAL status
173 */
HAL_SRAM_Init(SRAM_HandleTypeDef * hsram,FMC_NORSRAM_TimingTypeDef * Timing,FMC_NORSRAM_TimingTypeDef * ExtTiming)174 HAL_StatusTypeDef HAL_SRAM_Init(SRAM_HandleTypeDef *hsram, FMC_NORSRAM_TimingTypeDef *Timing,
175 FMC_NORSRAM_TimingTypeDef *ExtTiming)
176 {
177 /* Check the SRAM handle parameter */
178 if (hsram == NULL)
179 {
180 return HAL_ERROR;
181 }
182
183 if (hsram->State == HAL_SRAM_STATE_RESET)
184 {
185 /* Allocate lock resource and initialize it */
186 hsram->Lock = HAL_UNLOCKED;
187
188 #if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
189 if (hsram->MspInitCallback == NULL)
190 {
191 hsram->MspInitCallback = HAL_SRAM_MspInit;
192 }
193 hsram->DmaXferCpltCallback = HAL_SRAM_DMA_XferCpltCallback;
194 hsram->DmaXferErrorCallback = HAL_SRAM_DMA_XferErrorCallback;
195
196 /* Init the low level hardware */
197 hsram->MspInitCallback(hsram);
198 #else
199 /* Initialize the low level hardware (MSP) */
200 HAL_SRAM_MspInit(hsram);
201 #endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
202 }
203
204 /* Initialize SRAM control Interface */
205 (void)FMC_NORSRAM_Init(hsram->Instance, &(hsram->Init));
206
207 /* Initialize SRAM timing Interface */
208 (void)FMC_NORSRAM_Timing_Init(hsram->Instance, Timing, hsram->Init.NSBank);
209
210 /* Initialize SRAM extended mode timing Interface */
211 (void)FMC_NORSRAM_Extended_Timing_Init(hsram->Extended, ExtTiming, hsram->Init.NSBank,
212 hsram->Init.ExtendedMode);
213
214 /* Enable the NORSRAM device */
215 __FMC_NORSRAM_ENABLE(hsram->Instance, hsram->Init.NSBank);
216
217 /* Initialize the SRAM controller state */
218 hsram->State = HAL_SRAM_STATE_READY;
219
220 return HAL_OK;
221 }
222
223 /**
224 * @brief Performs the SRAM device De-initialization sequence.
225 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
226 * the configuration information for SRAM module.
227 * @retval HAL status
228 */
HAL_SRAM_DeInit(SRAM_HandleTypeDef * hsram)229 HAL_StatusTypeDef HAL_SRAM_DeInit(SRAM_HandleTypeDef *hsram)
230 {
231 #if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
232 if (hsram->MspDeInitCallback == NULL)
233 {
234 hsram->MspDeInitCallback = HAL_SRAM_MspDeInit;
235 }
236
237 /* DeInit the low level hardware */
238 hsram->MspDeInitCallback(hsram);
239 #else
240 /* De-Initialize the low level hardware (MSP) */
241 HAL_SRAM_MspDeInit(hsram);
242 #endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
243
244 /* Configure the SRAM registers with their reset values */
245 (void)FMC_NORSRAM_DeInit(hsram->Instance, hsram->Extended, hsram->Init.NSBank);
246
247 /* Reset the SRAM controller state */
248 hsram->State = HAL_SRAM_STATE_RESET;
249
250 /* Release Lock */
251 __HAL_UNLOCK(hsram);
252
253 return HAL_OK;
254 }
255
256 /**
257 * @brief SRAM MSP Init.
258 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
259 * the configuration information for SRAM module.
260 * @retval None
261 */
HAL_SRAM_MspInit(SRAM_HandleTypeDef * hsram)262 __weak void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram)
263 {
264 /* Prevent unused argument(s) compilation warning */
265 UNUSED(hsram);
266
267 /* NOTE : This function Should not be modified, when the callback is needed,
268 the HAL_SRAM_MspInit could be implemented in the user file
269 */
270 }
271
272 /**
273 * @brief SRAM MSP DeInit.
274 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
275 * the configuration information for SRAM module.
276 * @retval None
277 */
HAL_SRAM_MspDeInit(SRAM_HandleTypeDef * hsram)278 __weak void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef *hsram)
279 {
280 /* Prevent unused argument(s) compilation warning */
281 UNUSED(hsram);
282
283 /* NOTE : This function Should not be modified, when the callback is needed,
284 the HAL_SRAM_MspDeInit could be implemented in the user file
285 */
286 }
287
288 /**
289 * @brief DMA transfer complete callback.
290 * @param hdma pointer to a SRAM_HandleTypeDef structure that contains
291 * the configuration information for SRAM module.
292 * @retval None
293 */
HAL_SRAM_DMA_XferCpltCallback(DMA_HandleTypeDef * hdma)294 __weak void HAL_SRAM_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma)
295 {
296 /* Prevent unused argument(s) compilation warning */
297 UNUSED(hdma);
298
299 /* NOTE : This function Should not be modified, when the callback is needed,
300 the HAL_SRAM_DMA_XferCpltCallback could be implemented in the user file
301 */
302 }
303
304 /**
305 * @brief DMA transfer complete error callback.
306 * @param hdma pointer to a SRAM_HandleTypeDef structure that contains
307 * the configuration information for SRAM module.
308 * @retval None
309 */
HAL_SRAM_DMA_XferErrorCallback(DMA_HandleTypeDef * hdma)310 __weak void HAL_SRAM_DMA_XferErrorCallback(DMA_HandleTypeDef *hdma)
311 {
312 /* Prevent unused argument(s) compilation warning */
313 UNUSED(hdma);
314
315 /* NOTE : This function Should not be modified, when the callback is needed,
316 the HAL_SRAM_DMA_XferErrorCallback could be implemented in the user file
317 */
318 }
319
320 /**
321 * @}
322 */
323
324 /** @defgroup SRAM_Exported_Functions_Group2 Input Output and memory control functions
325 * @brief Input Output and memory control functions
326 *
327 @verbatim
328 ==============================================================================
329 ##### SRAM Input and Output functions #####
330 ==============================================================================
331 [..]
332 This section provides functions allowing to use and control the SRAM memory
333
334 @endverbatim
335 * @{
336 */
337
338 /**
339 * @brief Reads 8-bit buffer from SRAM memory.
340 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
341 * the configuration information for SRAM module.
342 * @param pAddress Pointer to read start address
343 * @param pDstBuffer Pointer to destination buffer
344 * @param BufferSize Size of the buffer to read from memory
345 * @retval HAL status
346 */
HAL_SRAM_Read_8b(SRAM_HandleTypeDef * hsram,uint32_t * pAddress,uint8_t * pDstBuffer,uint32_t BufferSize)347 HAL_StatusTypeDef HAL_SRAM_Read_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pDstBuffer,
348 uint32_t BufferSize)
349 {
350 uint32_t size;
351 __IO uint8_t *psramaddress = (uint8_t *)pAddress;
352 uint8_t *pdestbuff = pDstBuffer;
353 HAL_SRAM_StateTypeDef state = hsram->State;
354
355 /* Check the SRAM controller state */
356 if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
357 {
358 /* Process Locked */
359 __HAL_LOCK(hsram);
360
361 /* Update the SRAM controller state */
362 hsram->State = HAL_SRAM_STATE_BUSY;
363
364 /* Read data from memory */
365 for (size = BufferSize; size != 0U; size--)
366 {
367 *pdestbuff = *psramaddress;
368 pdestbuff++;
369 psramaddress++;
370 }
371
372 /* Update the SRAM controller state */
373 hsram->State = state;
374
375 /* Process unlocked */
376 __HAL_UNLOCK(hsram);
377 }
378 else
379 {
380 return HAL_ERROR;
381 }
382
383 return HAL_OK;
384 }
385
386 /**
387 * @brief Writes 8-bit buffer to SRAM memory.
388 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
389 * the configuration information for SRAM module.
390 * @param pAddress Pointer to write start address
391 * @param pSrcBuffer Pointer to source buffer to write
392 * @param BufferSize Size of the buffer to write to memory
393 * @retval HAL status
394 */
HAL_SRAM_Write_8b(SRAM_HandleTypeDef * hsram,uint32_t * pAddress,uint8_t * pSrcBuffer,uint32_t BufferSize)395 HAL_StatusTypeDef HAL_SRAM_Write_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pSrcBuffer,
396 uint32_t BufferSize)
397 {
398 uint32_t size;
399 __IO uint8_t *psramaddress = (uint8_t *)pAddress;
400 uint8_t *psrcbuff = pSrcBuffer;
401
402 /* Check the SRAM controller state */
403 if (hsram->State == HAL_SRAM_STATE_READY)
404 {
405 /* Process Locked */
406 __HAL_LOCK(hsram);
407
408 /* Update the SRAM controller state */
409 hsram->State = HAL_SRAM_STATE_BUSY;
410
411 /* Write data to memory */
412 for (size = BufferSize; size != 0U; size--)
413 {
414 *psramaddress = *psrcbuff;
415 psrcbuff++;
416 psramaddress++;
417 }
418
419 /* Update the SRAM controller state */
420 hsram->State = HAL_SRAM_STATE_READY;
421
422 /* Process unlocked */
423 __HAL_UNLOCK(hsram);
424 }
425 else
426 {
427 return HAL_ERROR;
428 }
429
430 return HAL_OK;
431 }
432
433 /**
434 * @brief Reads 16-bit buffer from SRAM memory.
435 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
436 * the configuration information for SRAM module.
437 * @param pAddress Pointer to read start address
438 * @param pDstBuffer Pointer to destination buffer
439 * @param BufferSize Size of the buffer to read from memory
440 * @retval HAL status
441 */
HAL_SRAM_Read_16b(SRAM_HandleTypeDef * hsram,uint32_t * pAddress,uint16_t * pDstBuffer,uint32_t BufferSize)442 HAL_StatusTypeDef HAL_SRAM_Read_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pDstBuffer,
443 uint32_t BufferSize)
444 {
445 uint32_t size;
446 __IO uint32_t *psramaddress = pAddress;
447 uint16_t *pdestbuff = pDstBuffer;
448 uint8_t limit;
449 HAL_SRAM_StateTypeDef state = hsram->State;
450
451 /* Check the SRAM controller state */
452 if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
453 {
454 /* Process Locked */
455 __HAL_LOCK(hsram);
456
457 /* Update the SRAM controller state */
458 hsram->State = HAL_SRAM_STATE_BUSY;
459
460 /* Check if the size is a 32-bits multiple */
461 limit = (((BufferSize % 2U) != 0U) ? 1U : 0U);
462
463 /* Read data from memory */
464 for (size = BufferSize; size != limit; size -= 2U)
465 {
466 *pdestbuff = (uint16_t)((*psramaddress) & 0x0000FFFFU);
467 pdestbuff++;
468 *pdestbuff = (uint16_t)(((*psramaddress) & 0xFFFF0000U) >> 16U);
469 pdestbuff++;
470 psramaddress++;
471 }
472
473 /* Read last 16-bits if size is not 32-bits multiple */
474 if (limit != 0U)
475 {
476 *pdestbuff = (uint16_t)((*psramaddress) & 0x0000FFFFU);
477 }
478
479 /* Update the SRAM controller state */
480 hsram->State = state;
481
482 /* Process unlocked */
483 __HAL_UNLOCK(hsram);
484 }
485 else
486 {
487 return HAL_ERROR;
488 }
489
490 return HAL_OK;
491 }
492
493 /**
494 * @brief Writes 16-bit buffer to SRAM memory.
495 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
496 * the configuration information for SRAM module.
497 * @param pAddress Pointer to write start address
498 * @param pSrcBuffer Pointer to source buffer to write
499 * @param BufferSize Size of the buffer to write to memory
500 * @retval HAL status
501 */
HAL_SRAM_Write_16b(SRAM_HandleTypeDef * hsram,uint32_t * pAddress,uint16_t * pSrcBuffer,uint32_t BufferSize)502 HAL_StatusTypeDef HAL_SRAM_Write_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pSrcBuffer,
503 uint32_t BufferSize)
504 {
505 uint32_t size;
506 __IO uint32_t *psramaddress = pAddress;
507 uint16_t *psrcbuff = pSrcBuffer;
508 uint8_t limit;
509
510 /* Check the SRAM controller state */
511 if (hsram->State == HAL_SRAM_STATE_READY)
512 {
513 /* Process Locked */
514 __HAL_LOCK(hsram);
515
516 /* Update the SRAM controller state */
517 hsram->State = HAL_SRAM_STATE_BUSY;
518
519 /* Check if the size is a 32-bits multiple */
520 limit = (((BufferSize % 2U) != 0U) ? 1U : 0U);
521
522 /* Write data to memory */
523 for (size = BufferSize; size != limit; size -= 2U)
524 {
525 *psramaddress = (uint32_t)(*psrcbuff);
526 psrcbuff++;
527 *psramaddress |= ((uint32_t)(*psrcbuff) << 16U);
528 psrcbuff++;
529 psramaddress++;
530 }
531
532 /* Write last 16-bits if size is not 32-bits multiple */
533 if (limit != 0U)
534 {
535 *psramaddress = ((uint32_t)(*psrcbuff) & 0x0000FFFFU) | ((*psramaddress) & 0xFFFF0000U);
536 }
537
538 /* Update the SRAM controller state */
539 hsram->State = HAL_SRAM_STATE_READY;
540
541 /* Process unlocked */
542 __HAL_UNLOCK(hsram);
543 }
544 else
545 {
546 return HAL_ERROR;
547 }
548
549 return HAL_OK;
550 }
551
552 /**
553 * @brief Reads 32-bit buffer from SRAM memory.
554 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
555 * the configuration information for SRAM module.
556 * @param pAddress Pointer to read start address
557 * @param pDstBuffer Pointer to destination buffer
558 * @param BufferSize Size of the buffer to read from memory
559 * @retval HAL status
560 */
HAL_SRAM_Read_32b(SRAM_HandleTypeDef * hsram,uint32_t * pAddress,uint32_t * pDstBuffer,uint32_t BufferSize)561 HAL_StatusTypeDef HAL_SRAM_Read_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer,
562 uint32_t BufferSize)
563 {
564 uint32_t size;
565 __IO uint32_t *psramaddress = pAddress;
566 uint32_t *pdestbuff = pDstBuffer;
567 HAL_SRAM_StateTypeDef state = hsram->State;
568
569 /* Check the SRAM controller state */
570 if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
571 {
572 /* Process Locked */
573 __HAL_LOCK(hsram);
574
575 /* Update the SRAM controller state */
576 hsram->State = HAL_SRAM_STATE_BUSY;
577
578 /* Read data from memory */
579 for (size = BufferSize; size != 0U; size--)
580 {
581 *pdestbuff = *psramaddress;
582 pdestbuff++;
583 psramaddress++;
584 }
585
586 /* Update the SRAM controller state */
587 hsram->State = state;
588
589 /* Process unlocked */
590 __HAL_UNLOCK(hsram);
591 }
592 else
593 {
594 return HAL_ERROR;
595 }
596
597 return HAL_OK;
598 }
599
600 /**
601 * @brief Writes 32-bit buffer to SRAM memory.
602 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
603 * the configuration information for SRAM module.
604 * @param pAddress Pointer to write start address
605 * @param pSrcBuffer Pointer to source buffer to write
606 * @param BufferSize Size of the buffer to write to memory
607 * @retval HAL status
608 */
HAL_SRAM_Write_32b(SRAM_HandleTypeDef * hsram,uint32_t * pAddress,uint32_t * pSrcBuffer,uint32_t BufferSize)609 HAL_StatusTypeDef HAL_SRAM_Write_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer,
610 uint32_t BufferSize)
611 {
612 uint32_t size;
613 __IO uint32_t *psramaddress = pAddress;
614 uint32_t *psrcbuff = pSrcBuffer;
615
616 /* Check the SRAM controller state */
617 if (hsram->State == HAL_SRAM_STATE_READY)
618 {
619 /* Process Locked */
620 __HAL_LOCK(hsram);
621
622 /* Update the SRAM controller state */
623 hsram->State = HAL_SRAM_STATE_BUSY;
624
625 /* Write data to memory */
626 for (size = BufferSize; size != 0U; size--)
627 {
628 *psramaddress = *psrcbuff;
629 psrcbuff++;
630 psramaddress++;
631 }
632
633 /* Update the SRAM controller state */
634 hsram->State = HAL_SRAM_STATE_READY;
635
636 /* Process unlocked */
637 __HAL_UNLOCK(hsram);
638 }
639 else
640 {
641 return HAL_ERROR;
642 }
643
644 return HAL_OK;
645 }
646
647 /**
648 * @brief Reads a Words data from the SRAM memory using DMA transfer.
649 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
650 * the configuration information for SRAM module.
651 * @param pAddress Pointer to read start address
652 * @param pDstBuffer Pointer to destination buffer
653 * @param BufferSize Size of the buffer to read from memory
654 * @retval HAL status
655 */
HAL_SRAM_Read_DMA(SRAM_HandleTypeDef * hsram,uint32_t * pAddress,uint32_t * pDstBuffer,uint32_t BufferSize)656 HAL_StatusTypeDef HAL_SRAM_Read_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer,
657 uint32_t BufferSize)
658 {
659 HAL_StatusTypeDef status;
660 HAL_SRAM_StateTypeDef state = hsram->State;
661
662 /* Check the SRAM controller state */
663 if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
664 {
665 /* Process Locked */
666 __HAL_LOCK(hsram);
667
668 /* Update the SRAM controller state */
669 hsram->State = HAL_SRAM_STATE_BUSY;
670
671 /* Configure DMA user callbacks */
672 if (state == HAL_SRAM_STATE_READY)
673 {
674 hsram->hdma->XferCpltCallback = SRAM_DMACplt;
675 }
676 else
677 {
678 hsram->hdma->XferCpltCallback = SRAM_DMACpltProt;
679 }
680 hsram->hdma->XferErrorCallback = SRAM_DMAError;
681
682 /* Enable the DMA Stream */
683 status = HAL_DMA_Start_IT(hsram->hdma, (uint32_t)pAddress, (uint32_t)pDstBuffer, (uint32_t)BufferSize);
684
685 /* Process unlocked */
686 __HAL_UNLOCK(hsram);
687 }
688 else
689 {
690 status = HAL_ERROR;
691 }
692
693 return status;
694 }
695
696 /**
697 * @brief Writes a Words data buffer to SRAM memory using DMA transfer.
698 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
699 * the configuration information for SRAM module.
700 * @param pAddress Pointer to write start address
701 * @param pSrcBuffer Pointer to source buffer to write
702 * @param BufferSize Size of the buffer to write to memory
703 * @retval HAL status
704 */
HAL_SRAM_Write_DMA(SRAM_HandleTypeDef * hsram,uint32_t * pAddress,uint32_t * pSrcBuffer,uint32_t BufferSize)705 HAL_StatusTypeDef HAL_SRAM_Write_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer,
706 uint32_t BufferSize)
707 {
708 HAL_StatusTypeDef status;
709
710 /* Check the SRAM controller state */
711 if (hsram->State == HAL_SRAM_STATE_READY)
712 {
713 /* Process Locked */
714 __HAL_LOCK(hsram);
715
716 /* Update the SRAM controller state */
717 hsram->State = HAL_SRAM_STATE_BUSY;
718
719 /* Configure DMA user callbacks */
720 hsram->hdma->XferCpltCallback = SRAM_DMACplt;
721 hsram->hdma->XferErrorCallback = SRAM_DMAError;
722
723 /* Enable the DMA Stream */
724 status = HAL_DMA_Start_IT(hsram->hdma, (uint32_t)pSrcBuffer, (uint32_t)pAddress, (uint32_t)BufferSize);
725
726 /* Process unlocked */
727 __HAL_UNLOCK(hsram);
728 }
729 else
730 {
731 status = HAL_ERROR;
732 }
733
734 return status;
735 }
736
737 #if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
738 /**
739 * @brief Register a User SRAM Callback
740 * To be used to override the weak predefined callback
741 * @param hsram : SRAM handle
742 * @param CallbackId : ID of the callback to be registered
743 * This parameter can be one of the following values:
744 * @arg @ref HAL_SRAM_MSP_INIT_CB_ID SRAM MspInit callback ID
745 * @arg @ref HAL_SRAM_MSP_DEINIT_CB_ID SRAM MspDeInit callback ID
746 * @param pCallback : pointer to the Callback function
747 * @retval status
748 */
HAL_SRAM_RegisterCallback(SRAM_HandleTypeDef * hsram,HAL_SRAM_CallbackIDTypeDef CallbackId,pSRAM_CallbackTypeDef pCallback)749 HAL_StatusTypeDef HAL_SRAM_RegisterCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId,
750 pSRAM_CallbackTypeDef pCallback)
751 {
752 HAL_StatusTypeDef status = HAL_OK;
753 HAL_SRAM_StateTypeDef state;
754
755 if (pCallback == NULL)
756 {
757 return HAL_ERROR;
758 }
759
760 state = hsram->State;
761 if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_RESET) || (state == HAL_SRAM_STATE_PROTECTED))
762 {
763 switch (CallbackId)
764 {
765 case HAL_SRAM_MSP_INIT_CB_ID :
766 hsram->MspInitCallback = pCallback;
767 break;
768 case HAL_SRAM_MSP_DEINIT_CB_ID :
769 hsram->MspDeInitCallback = pCallback;
770 break;
771 default :
772 /* update return status */
773 status = HAL_ERROR;
774 break;
775 }
776 }
777 else
778 {
779 /* update return status */
780 status = HAL_ERROR;
781 }
782
783 return status;
784 }
785
786 /**
787 * @brief Unregister a User SRAM Callback
788 * SRAM Callback is redirected to the weak predefined callback
789 * @param hsram : SRAM handle
790 * @param CallbackId : ID of the callback to be unregistered
791 * This parameter can be one of the following values:
792 * @arg @ref HAL_SRAM_MSP_INIT_CB_ID SRAM MspInit callback ID
793 * @arg @ref HAL_SRAM_MSP_DEINIT_CB_ID SRAM MspDeInit callback ID
794 * @arg @ref HAL_SRAM_DMA_XFER_CPLT_CB_ID SRAM DMA Xfer Complete callback ID
795 * @arg @ref HAL_SRAM_DMA_XFER_ERR_CB_ID SRAM DMA Xfer Error callback ID
796 * @retval status
797 */
HAL_SRAM_UnRegisterCallback(SRAM_HandleTypeDef * hsram,HAL_SRAM_CallbackIDTypeDef CallbackId)798 HAL_StatusTypeDef HAL_SRAM_UnRegisterCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId)
799 {
800 HAL_StatusTypeDef status = HAL_OK;
801 HAL_SRAM_StateTypeDef state;
802
803 state = hsram->State;
804 if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
805 {
806 switch (CallbackId)
807 {
808 case HAL_SRAM_MSP_INIT_CB_ID :
809 hsram->MspInitCallback = HAL_SRAM_MspInit;
810 break;
811 case HAL_SRAM_MSP_DEINIT_CB_ID :
812 hsram->MspDeInitCallback = HAL_SRAM_MspDeInit;
813 break;
814 case HAL_SRAM_DMA_XFER_CPLT_CB_ID :
815 hsram->DmaXferCpltCallback = HAL_SRAM_DMA_XferCpltCallback;
816 break;
817 case HAL_SRAM_DMA_XFER_ERR_CB_ID :
818 hsram->DmaXferErrorCallback = HAL_SRAM_DMA_XferErrorCallback;
819 break;
820 default :
821 /* update return status */
822 status = HAL_ERROR;
823 break;
824 }
825 }
826 else if (state == HAL_SRAM_STATE_RESET)
827 {
828 switch (CallbackId)
829 {
830 case HAL_SRAM_MSP_INIT_CB_ID :
831 hsram->MspInitCallback = HAL_SRAM_MspInit;
832 break;
833 case HAL_SRAM_MSP_DEINIT_CB_ID :
834 hsram->MspDeInitCallback = HAL_SRAM_MspDeInit;
835 break;
836 default :
837 /* update return status */
838 status = HAL_ERROR;
839 break;
840 }
841 }
842 else
843 {
844 /* update return status */
845 status = HAL_ERROR;
846 }
847
848 return status;
849 }
850
851 /**
852 * @brief Register a User SRAM Callback for DMA transfers
853 * To be used to override the weak predefined callback
854 * @param hsram : SRAM handle
855 * @param CallbackId : ID of the callback to be registered
856 * This parameter can be one of the following values:
857 * @arg @ref HAL_SRAM_DMA_XFER_CPLT_CB_ID SRAM DMA Xfer Complete callback ID
858 * @arg @ref HAL_SRAM_DMA_XFER_ERR_CB_ID SRAM DMA Xfer Error callback ID
859 * @param pCallback : pointer to the Callback function
860 * @retval status
861 */
HAL_SRAM_RegisterDmaCallback(SRAM_HandleTypeDef * hsram,HAL_SRAM_CallbackIDTypeDef CallbackId,pSRAM_DmaCallbackTypeDef pCallback)862 HAL_StatusTypeDef HAL_SRAM_RegisterDmaCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId,
863 pSRAM_DmaCallbackTypeDef pCallback)
864 {
865 HAL_StatusTypeDef status = HAL_OK;
866 HAL_SRAM_StateTypeDef state;
867
868 if (pCallback == NULL)
869 {
870 return HAL_ERROR;
871 }
872
873 /* Process locked */
874 __HAL_LOCK(hsram);
875
876 state = hsram->State;
877 if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
878 {
879 switch (CallbackId)
880 {
881 case HAL_SRAM_DMA_XFER_CPLT_CB_ID :
882 hsram->DmaXferCpltCallback = pCallback;
883 break;
884 case HAL_SRAM_DMA_XFER_ERR_CB_ID :
885 hsram->DmaXferErrorCallback = pCallback;
886 break;
887 default :
888 /* update return status */
889 status = HAL_ERROR;
890 break;
891 }
892 }
893 else
894 {
895 /* update return status */
896 status = HAL_ERROR;
897 }
898
899 /* Release Lock */
900 __HAL_UNLOCK(hsram);
901 return status;
902 }
903 #endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
904
905 /**
906 * @}
907 */
908
909 /** @defgroup SRAM_Exported_Functions_Group3 Control functions
910 * @brief Control functions
911 *
912 @verbatim
913 ==============================================================================
914 ##### SRAM Control functions #####
915 ==============================================================================
916 [..]
917 This subsection provides a set of functions allowing to control dynamically
918 the SRAM interface.
919
920 @endverbatim
921 * @{
922 */
923
924 /**
925 * @brief Enables dynamically SRAM write operation.
926 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
927 * the configuration information for SRAM module.
928 * @retval HAL status
929 */
HAL_SRAM_WriteOperation_Enable(SRAM_HandleTypeDef * hsram)930 HAL_StatusTypeDef HAL_SRAM_WriteOperation_Enable(SRAM_HandleTypeDef *hsram)
931 {
932 /* Check the SRAM controller state */
933 if (hsram->State == HAL_SRAM_STATE_PROTECTED)
934 {
935 /* Process Locked */
936 __HAL_LOCK(hsram);
937
938 /* Update the SRAM controller state */
939 hsram->State = HAL_SRAM_STATE_BUSY;
940
941 /* Enable write operation */
942 (void)FMC_NORSRAM_WriteOperation_Enable(hsram->Instance, hsram->Init.NSBank);
943
944 /* Update the SRAM controller state */
945 hsram->State = HAL_SRAM_STATE_READY;
946
947 /* Process unlocked */
948 __HAL_UNLOCK(hsram);
949 }
950 else
951 {
952 return HAL_ERROR;
953 }
954
955 return HAL_OK;
956 }
957
958 /**
959 * @brief Disables dynamically SRAM write operation.
960 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
961 * the configuration information for SRAM module.
962 * @retval HAL status
963 */
HAL_SRAM_WriteOperation_Disable(SRAM_HandleTypeDef * hsram)964 HAL_StatusTypeDef HAL_SRAM_WriteOperation_Disable(SRAM_HandleTypeDef *hsram)
965 {
966 /* Check the SRAM controller state */
967 if (hsram->State == HAL_SRAM_STATE_READY)
968 {
969 /* Process Locked */
970 __HAL_LOCK(hsram);
971
972 /* Update the SRAM controller state */
973 hsram->State = HAL_SRAM_STATE_BUSY;
974
975 /* Disable write operation */
976 (void)FMC_NORSRAM_WriteOperation_Disable(hsram->Instance, hsram->Init.NSBank);
977
978 /* Update the SRAM controller state */
979 hsram->State = HAL_SRAM_STATE_PROTECTED;
980
981 /* Process unlocked */
982 __HAL_UNLOCK(hsram);
983 }
984 else
985 {
986 return HAL_ERROR;
987 }
988
989 return HAL_OK;
990 }
991
992 /**
993 * @}
994 */
995
996 /** @defgroup SRAM_Exported_Functions_Group4 Peripheral State functions
997 * @brief Peripheral State functions
998 *
999 @verbatim
1000 ==============================================================================
1001 ##### SRAM State functions #####
1002 ==============================================================================
1003 [..]
1004 This subsection permits to get in run-time the status of the SRAM controller
1005 and the data flow.
1006
1007 @endverbatim
1008 * @{
1009 */
1010
1011 /**
1012 * @brief Returns the SRAM controller state
1013 * @param hsram pointer to a SRAM_HandleTypeDef structure that contains
1014 * the configuration information for SRAM module.
1015 * @retval HAL state
1016 */
HAL_SRAM_GetState(const SRAM_HandleTypeDef * hsram)1017 HAL_SRAM_StateTypeDef HAL_SRAM_GetState(const SRAM_HandleTypeDef *hsram)
1018 {
1019 return hsram->State;
1020 }
1021
1022 /**
1023 * @}
1024 */
1025
1026 /**
1027 * @}
1028 */
1029
1030 /** @addtogroup SRAM_Private_Functions SRAM Private Functions
1031 * @{
1032 */
1033
1034 /**
1035 * @brief DMA SRAM process complete callback.
1036 * @param hdma : DMA handle
1037 * @retval None
1038 */
SRAM_DMACplt(DMA_HandleTypeDef * hdma)1039 static void SRAM_DMACplt(DMA_HandleTypeDef *hdma)
1040 {
1041 SRAM_HandleTypeDef *hsram = (SRAM_HandleTypeDef *)(hdma->Parent);
1042
1043 /* Disable the DMA channel */
1044 __HAL_DMA_DISABLE(hdma);
1045
1046 /* Update the SRAM controller state */
1047 hsram->State = HAL_SRAM_STATE_READY;
1048
1049 #if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
1050 hsram->DmaXferCpltCallback(hdma);
1051 #else
1052 HAL_SRAM_DMA_XferCpltCallback(hdma);
1053 #endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
1054 }
1055
1056 /**
1057 * @brief DMA SRAM process complete callback.
1058 * @param hdma : DMA handle
1059 * @retval None
1060 */
SRAM_DMACpltProt(DMA_HandleTypeDef * hdma)1061 static void SRAM_DMACpltProt(DMA_HandleTypeDef *hdma)
1062 {
1063 SRAM_HandleTypeDef *hsram = (SRAM_HandleTypeDef *)(hdma->Parent);
1064
1065 /* Disable the DMA channel */
1066 __HAL_DMA_DISABLE(hdma);
1067
1068 /* Update the SRAM controller state */
1069 hsram->State = HAL_SRAM_STATE_PROTECTED;
1070
1071 #if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
1072 hsram->DmaXferCpltCallback(hdma);
1073 #else
1074 HAL_SRAM_DMA_XferCpltCallback(hdma);
1075 #endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
1076 }
1077
1078 /**
1079 * @brief DMA SRAM error callback.
1080 * @param hdma : DMA handle
1081 * @retval None
1082 */
SRAM_DMAError(DMA_HandleTypeDef * hdma)1083 static void SRAM_DMAError(DMA_HandleTypeDef *hdma)
1084 {
1085 SRAM_HandleTypeDef *hsram = (SRAM_HandleTypeDef *)(hdma->Parent);
1086
1087 /* Disable the DMA channel */
1088 __HAL_DMA_DISABLE(hdma);
1089
1090 /* Update the SRAM controller state */
1091 hsram->State = HAL_SRAM_STATE_ERROR;
1092
1093 #if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
1094 hsram->DmaXferErrorCallback(hdma);
1095 #else
1096 HAL_SRAM_DMA_XferErrorCallback(hdma);
1097 #endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
1098 }
1099
1100 /**
1101 * @}
1102 */
1103
1104 /**
1105 * @}
1106 */
1107
1108 #endif /* HAL_SRAM_MODULE_ENABLED */
1109
1110 /**
1111 * @}
1112 */
1113
1114 #endif /* FMC_BANK1 */
1115