| /** |
| ****************************************************************************** |
| * @file stm32h7xx_hal_ramecc.c |
| * @author MCD Application Team |
| * @brief RAMECC HAL module driver. |
| * This file provides firmware functions to manage the following |
| * functionalities of the RAM ECC monitoring (RAMECC) peripheral: |
| * + Initialization and de-initialization functions |
| * + Monitoring operation functions |
| * + Error informations functions |
| @verbatim |
| ============================================================================== |
| ##### How to use this driver ##### |
| ============================================================================== |
| [..] |
| (#) Enable and latch error informations through HAL_RAMECC_Init(). |
| |
| (#) For a given Monitor, enable and disable interrupt through |
| HAL_RAMECC_EnableNotifiaction(). |
| To enable a notification for a given RAMECC instance, use global interrupts. |
| To enable a notification for only RAMECC monitor, use monitor interrupts. |
| All possible notifications are defined in the driver header file under |
| RAMECC_Interrupt group. |
| |
| *** Silent mode *** |
| =================== |
| [..] |
| (+) Use HAL_RAMECC_StartMonitor() to start RAMECC latch failing information |
| without enabling any notification. |
| |
| *** Interrupt mode *** |
| ====================== |
| [..] |
| (+) Use HAL_RAMECC_EnableNotifiaction() to enable interrupts for a given error. |
| (+) Configure the RAMECC interrupt priority using HAL_NVIC_SetPriority(). |
| (+) Enable the RAMECC IRQ handler using HAL_NVIC_EnableIRQ(). |
| |
| *** Failing informations *** |
| ====================== |
| [..] |
| (#) Use HAL_RAMECC_GetFailingAddress() function to return the RAMECC failing address. |
| (#) Use HAL_RAMECC_GetFailingDataLow() function to return the RAMECC failing data low. |
| (#) Use HAL_RAMECC_GetFailingDataHigh() function to return the RAMECC failing data high. |
| (#) Use HAL_RAMECC_GetHammingErrorCode() function to return the RAMECC Hamming bits injected. |
| |
| *** RAMECC HAL driver macros list *** |
| ============================================= |
| [..] |
| Below the list of used macros in RAMECC HAL driver. |
| |
| (+) __HAL_RAMECC_ENABLE_IT : Enable the specified ECCRAM Monitor interrupts. |
| (+) __HAL_RAMECC_DISABLE_IT : Disable the specified ECCRAM Monitor interrupts. |
| (+) __HAL_RAMECC_GET_FLAG : Return the current RAMECC Monitor selected flag. |
| (+) __HAL_RAMECC_CLEAR_FLAG : Clear the current RAMECC Monitor selected flag. |
| |
| @endverbatim |
| ****************************************************************************** |
| * @attention |
| * |
| * <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics. |
| * All rights reserved.</center></h2> |
| * |
| * This software component is licensed by ST under BSD 3-Clause license, |
| * the "License"; You may not use this file except in compliance with the |
| * License. You may obtain a copy of the License at: |
| * opensource.org/licenses/BSD-3-Clause |
| * |
| ****************************************************************************** |
| */ |
| |
| /* Includes ------------------------------------------------------------------*/ |
| #include "stm32h7xx_hal.h" |
| |
| /** @addtogroup STM32H7xx_HAL_Driver |
| * @{ |
| */ |
| |
| /** @defgroup RAMECC RAMECC |
| * @brief RAMECC HAL module driver |
| * @{ |
| */ |
| |
| #ifdef HAL_RAMECC_MODULE_ENABLED |
| |
| /* Private types -------------------------------------------------------------*/ |
| /* Private variables ---------------------------------------------------------*/ |
| /* Private constants ---------------------------------------------------------*/ |
| /* Private macros ------------------------------------------------------------*/ |
| /* Private functions ---------------------------------------------------------*/ |
| /* Exported functions ---------------------------------------------------------*/ |
| /** @addtogroup RAMECC_Exported_Functions |
| * @{ |
| */ |
| |
| /** @addtogroup RAMECC_Exported_Functions_Group1 |
| * |
| @verbatim |
| =============================================================================== |
| ##### Initialization and de-initialization functions ##### |
| =============================================================================== |
| [..] |
| This section provides functions allowing to initialize the RAMECC Monitor. |
| [..] |
| The HAL_RAMECC_Init() function follows the RAMECC configuration procedures |
| as described in reference manual. |
| The HAL_RAMECC_DeInit() function allows to deinitialize the RAMECC monitor. |
| |
| @endverbatim |
| * @{ |
| */ |
| |
| /** |
| * @brief Initialize the RAMECC by clearing flags and disabling interrupts. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @retval HAL status. |
| */ |
| HAL_StatusTypeDef HAL_RAMECC_Init(RAMECC_HandleTypeDef *hramecc) |
| { |
| /* Check the RAMECC peripheral handle */ |
| if(hramecc == NULL) |
| { |
| return HAL_ERROR; |
| } |
| |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| |
| /* Change RAMECC peripheral state */ |
| hramecc->State = HAL_RAMECC_STATE_BUSY; |
| |
| /* Disable RAMECC monitor */ |
| hramecc->Instance->CR &= ~RAMECC_CR_ECCELEN; |
| |
| /* Disable all global interrupts */ |
| ((RAMECC_TypeDef *)((uint32_t)hramecc->Instance & 0xFFFFFF00U))->IER &= \ |
| ~(RAMECC_IER_GIE | RAMECC_IER_GECCSEIE | RAMECC_IER_GECCDEIE | RAMECC_IER_GECCDEBWIE); |
| |
| /* Disable all interrupts monitor */ |
| hramecc->Instance->CR &= ~(RAMECC_CR_ECCSEIE | RAMECC_CR_ECCDEIE | RAMECC_CR_ECCDEBWIE); |
| |
| /* Clear RAMECC monitor flags */ |
| __HAL_RAMECC_CLEAR_FLAG(hramecc, RAMECC_FLAGS_ALL); |
| |
| /* Update the RAMECC state */ |
| hramecc->State = HAL_RAMECC_STATE_READY; |
| |
| /* Clean callback */ |
| hramecc->DetectErrorCallback = NULL; |
| |
| return HAL_OK; |
| } |
| |
| |
| /** |
| * @brief DeInitializes the RAMECC peripheral. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @retval HAL status. |
| */ |
| HAL_StatusTypeDef HAL_RAMECC_DeInit(RAMECC_HandleTypeDef *hramecc) |
| { |
| /* Check the RAMECC peripheral handle */ |
| if(hramecc == NULL) |
| { |
| return HAL_ERROR; |
| } |
| |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| |
| /* Disable RAMECC monitor */ |
| hramecc->Instance->CR &= ~RAMECC_CR_ECCELEN; |
| |
| /* Disable all global interrupts */ |
| ((RAMECC_TypeDef *)((uint32_t)hramecc->Instance & 0xFFFFFF00U))->IER &= \ |
| ~(RAMECC_IER_GIE | RAMECC_IER_GECCSEIE | RAMECC_IER_GECCDEIE | RAMECC_IER_GECCDEBWIE); |
| |
| /* Disable all interrupts monitor */ |
| hramecc->Instance->CR &= ~(RAMECC_CR_ECCSEIE | RAMECC_CR_ECCDEIE | RAMECC_CR_ECCDEBWIE); |
| |
| /* Clear RAMECC monitor flags */ |
| __HAL_RAMECC_CLEAR_FLAG(hramecc, RAMECC_FLAGS_ALL); |
| |
| /* Change RAMECC peripheral state */ |
| hramecc->State = HAL_RAMECC_STATE_RESET; |
| |
| /* Clean callback */ |
| hramecc->DetectErrorCallback = NULL; |
| |
| return HAL_OK; |
| } |
| |
| /** |
| * @} |
| */ |
| |
| /** @addtogroup RAMECC_Exported_Functions_Group2 |
| * |
| @verbatim |
| =============================================================================== |
| ##### Monitoring operation functions ##### |
| =============================================================================== |
| [..] This section provides functions allowing to: |
| (+) Configure latching error informations. |
| (+) Configure RAMECC Global/Monitor interrupts. |
| (+) Register and Unregister RAMECC callbacks |
| (+) Handle RAMECC interrupt request |
| |
| @endverbatim |
| * @{ |
| */ |
| |
| /** |
| * @brief Starts the RAMECC latching error informations. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @retval HAL status. |
| */ |
| HAL_StatusTypeDef HAL_RAMECC_StartMonitor(RAMECC_HandleTypeDef *hramecc) |
| { |
| /* Check the RAMECC peripheral handle */ |
| if(hramecc == NULL) |
| { |
| return HAL_ERROR; |
| } |
| |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| |
| if(hramecc->State == HAL_RAMECC_STATE_READY) |
| { |
| /* Change RAMECC peripheral state */ |
| hramecc->State = HAL_RAMECC_STATE_BUSY; |
| |
| /* Enable RAMECC monitor */ |
| hramecc->Instance->CR |= RAMECC_CR_ECCELEN; |
| } |
| else |
| { |
| /* Change the RAMECC state */ |
| hramecc->State = HAL_RAMECC_STATE_ERROR; |
| |
| return HAL_ERROR; |
| } |
| |
| return HAL_OK; |
| } |
| |
| |
| /** |
| * @brief Stop the RAMECC latching error informations. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @retval HAL status. |
| */ |
| HAL_StatusTypeDef HAL_RAMECC_StopMonitor(RAMECC_HandleTypeDef *hramecc) |
| { |
| /* Check the RAMECC peripheral handle */ |
| if(hramecc == NULL) |
| { |
| return HAL_ERROR; |
| } |
| |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| |
| if(hramecc->State == HAL_RAMECC_STATE_BUSY) |
| { |
| /* Disable RAMECC monitor */ |
| hramecc->Instance->CR &= ~RAMECC_CR_ECCELEN; |
| } |
| else |
| { |
| /* Change the RAMECC state */ |
| hramecc->State = HAL_RAMECC_STATE_ERROR; |
| |
| return HAL_ERROR; |
| } |
| |
| /* Change RAMECC peripheral state */ |
| hramecc->State = HAL_RAMECC_STATE_READY; |
| |
| return HAL_OK; |
| } |
| |
| |
| /** |
| * @brief Enable the RAMECC error interrupts. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @param Notifications Select the notification. |
| * @retval HAL status. |
| */ |
| HAL_StatusTypeDef HAL_RAMECC_EnableNotification(RAMECC_HandleTypeDef *hramecc, uint32_t Notifications) |
| { |
| /* Check the RAMECC peripheral handle */ |
| if(hramecc == NULL) |
| { |
| return HAL_ERROR; |
| } |
| |
| /* Get RAMECC monitor state */ |
| HAL_RAMECC_StateTypeDef state = hramecc->State; |
| |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| assert_param(IS_RAMECC_INTERRUPT(Notifications)); |
| |
| if((state == HAL_RAMECC_STATE_READY) || (state == HAL_RAMECC_STATE_BUSY)) |
| { |
| /* Enable RAMECC interrupts */ |
| __HAL_RAMECC_ENABLE_IT(hramecc, Notifications); |
| } |
| else |
| { |
| /* Change the RAMECC state */ |
| hramecc->State = HAL_RAMECC_STATE_ERROR; |
| |
| return HAL_ERROR; |
| } |
| |
| return HAL_OK; |
| } |
| |
| |
| /** |
| * @brief Disable the RAMECC error interrupts. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @param Notifications Select the notification. |
| * @retval HAL status. |
| */ |
| HAL_StatusTypeDef HAL_RAMECC_DisableNotification(RAMECC_HandleTypeDef *hramecc, uint32_t Notifications) |
| { |
| /* Check the RAMECC peripheral handle */ |
| if(hramecc == NULL) |
| { |
| return HAL_ERROR; |
| } |
| |
| /* Get RAMECC monitor state */ |
| HAL_RAMECC_StateTypeDef state = hramecc->State; |
| |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| assert_param(IS_RAMECC_INTERRUPT(Notifications)); |
| |
| if((state == HAL_RAMECC_STATE_READY) || (state == HAL_RAMECC_STATE_BUSY)) |
| { |
| /* Disable RAMECC interrupts */ |
| __HAL_RAMECC_DISABLE_IT(hramecc, Notifications); |
| } |
| else |
| { |
| /* Change the RAMECC state */ |
| hramecc->State = HAL_RAMECC_STATE_ERROR; |
| |
| return HAL_ERROR; |
| } |
| |
| return HAL_OK; |
| } |
| |
| |
| /** |
| * @brief Register callbacks. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @param pCallback pointer to private callbacsk function which has pointer to |
| * a RAMECC_HandleTypeDef structure as parameter. |
| * @retval HAL status. |
| */ |
| HAL_StatusTypeDef HAL_RAMECC_RegisterCallback(RAMECC_HandleTypeDef *hramecc, void (* pCallback)(RAMECC_HandleTypeDef *_hramecc)) |
| { |
| /* Check the RAMECC peripheral handle */ |
| if(hramecc == NULL) |
| { |
| return HAL_ERROR; |
| } |
| |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| |
| if(hramecc->State == HAL_RAMECC_STATE_READY) |
| { |
| hramecc->DetectErrorCallback = pCallback; |
| } |
| else |
| { |
| /* Change the RAMECC state */ |
| hramecc->State = HAL_RAMECC_STATE_ERROR; |
| |
| return HAL_ERROR; |
| } |
| |
| return HAL_OK; |
| } |
| |
| |
| /** |
| * @brief UnRegister callbacks. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @retval HAL status. |
| */ |
| HAL_StatusTypeDef HAL_RAMECC_UnRegisterCallback(RAMECC_HandleTypeDef *hramecc) |
| { |
| /* Check the RAMECC peripheral handle */ |
| if(hramecc == NULL) |
| { |
| return HAL_ERROR; |
| } |
| |
| /* Get RAMECC monitor state */ |
| HAL_RAMECC_StateTypeDef state = hramecc->State; |
| |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| |
| if((state == HAL_RAMECC_STATE_READY) || (state == HAL_RAMECC_STATE_BUSY)) |
| { |
| hramecc->DetectErrorCallback = NULL; |
| } |
| else |
| { |
| /* Change the RAMECC state */ |
| hramecc->State = HAL_RAMECC_STATE_ERROR; |
| |
| return HAL_ERROR; |
| } |
| |
| return HAL_OK; |
| } |
| |
| |
| /** |
| * @brief Handles RAMECC interrupt request. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @retval None. |
| */ |
| void HAL_RAMECC_IRQHandler(RAMECC_HandleTypeDef *hramecc) |
| { |
| uint32_t ier_reg = ((RAMECC_TypeDef *)((uint32_t)hramecc->Instance & 0xFFFFFF00U))->IER; |
| uint32_t cr_reg = hramecc->Instance->CR >> 1U; |
| uint32_t sr_reg = hramecc->Instance->SR << 1U; |
| |
| /* Update gloabl interrupt variables */ |
| if((ier_reg & RAMECC_IER_GIE) == RAMECC_IER_GIE) |
| { |
| ier_reg = RAMECC_IT_GLOBAL_ALL; |
| } |
| |
| /* Clear active flags */ |
| __HAL_RAMECC_CLEAR_FLAG(hramecc, (((ier_reg | cr_reg) & sr_reg) >> 1U)); |
| |
| if(hramecc->DetectErrorCallback != NULL) |
| { |
| /* Error detection callback */ |
| hramecc->DetectErrorCallback(hramecc); |
| } |
| } |
| |
| |
| /** @addtogroup RAMECC_Exported_Functions_Group3 |
| * |
| @verbatim |
| =============================================================================== |
| ##### Error informations functions ##### |
| =============================================================================== |
| [..] This section provides functions allowing to: |
| (+) Get failing address. |
| (+) Get failing data low. |
| (+) Get failing data high. |
| (+) Get Hamming bits injected. |
| |
| @endverbatim |
| * @{ |
| */ |
| |
| /** |
| * @brief Return the RAMECC failing address. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @retval Failing address offset. |
| */ |
| uint32_t HAL_RAMECC_GetFailingAddress(RAMECC_HandleTypeDef *hramecc) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| |
| return hramecc->Instance->FAR; |
| } |
| |
| |
| /** |
| * @brief Return the RAMECC data low. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @retval Failing data low. |
| */ |
| uint32_t HAL_RAMECC_GetFailingDataLow(RAMECC_HandleTypeDef *hramecc) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| |
| return hramecc->Instance->FDRL; |
| } |
| |
| |
| /** |
| * @brief Return the RAMECC data high. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @retval Failing data high. |
| */ |
| uint32_t HAL_RAMECC_GetFailingDataHigh(RAMECC_HandleTypeDef *hramecc) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| |
| return hramecc->Instance->FDRH; |
| } |
| |
| |
| /** |
| * @brief Return the RAMECC Hamming bits injected. |
| * @param hramecc Pointer to a RAMECC_HandleTypeDef structure that contains |
| * the configuration information for the specified RAMECC |
| * Monitor. |
| * @retval Hamming bits injected. |
| */ |
| uint32_t HAL_RAMECC_GetHammingErrorCode(RAMECC_HandleTypeDef *hramecc) |
| { |
| /* Check the parameters */ |
| assert_param(IS_RAMECC_MONITOR_ALL_INSTANCE(hramecc->Instance)); |
| |
| return hramecc->Instance->FECR; |
| } |
| |
| /** |
| * @} |
| */ |
| |
| #endif /* HAL_RAMECC_MODULE_ENABLED */ |
| |
| /** |
| * @} |
| */ |
| |
| /** |
| * @} |
| */ |
| |
| /** |
| * @} |
| */ |
| |
| /** |
| * @} |
| */ |
| |
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |