parent
56cae1abdb
commit
0a0ccf7bc3
File diff suppressed because one or more lines are too long
@ -0,0 +1,50 @@ |
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file crc.h |
||||
* @brief This file contains all the function prototypes for |
||||
* the crc.c file |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2023 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __CRC_H__ |
||||
#define __CRC_H__ |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "main.h" |
||||
|
||||
/* USER CODE BEGIN Includes */ |
||||
|
||||
/* USER CODE END Includes */ |
||||
|
||||
/* USER CODE BEGIN Private defines */ |
||||
|
||||
/* USER CODE END Private defines */ |
||||
|
||||
void MX_CRC_Init(void); |
||||
|
||||
/* USER CODE BEGIN Prototypes */ |
||||
|
||||
/* USER CODE END Prototypes */ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* __CRC_H__ */ |
||||
|
@ -0,0 +1,49 @@ |
||||
/* USER CODE BEGIN Header */ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file crc.c |
||||
* @brief This file provides code for the configuration |
||||
* of the CRC instances. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* Copyright (c) 2023 STMicroelectronics. |
||||
* All rights reserved. |
||||
* |
||||
* This software is licensed under terms that can be found in the LICENSE file |
||||
* in the root directory of this software component. |
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
/* USER CODE END Header */ |
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "crc.h" |
||||
|
||||
/* USER CODE BEGIN 0 */ |
||||
|
||||
/* USER CODE END 0 */ |
||||
|
||||
/* CRC init function */ |
||||
void MX_CRC_Init(void) |
||||
{ |
||||
|
||||
/* USER CODE BEGIN CRC_Init 0 */ |
||||
|
||||
/* USER CODE END CRC_Init 0 */ |
||||
|
||||
/* Peripheral clock enable */ |
||||
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_CRC); |
||||
|
||||
/* USER CODE BEGIN CRC_Init 1 */ |
||||
|
||||
/* USER CODE END CRC_Init 1 */ |
||||
/* USER CODE BEGIN CRC_Init 2 */ |
||||
|
||||
/* USER CODE END CRC_Init 2 */ |
||||
|
||||
} |
||||
|
||||
/* USER CODE BEGIN 1 */ |
||||
|
||||
/* USER CODE END 1 */ |
@ -0,0 +1,204 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm32f1xx_ll_crc.h |
||||
* @author MCD Application Team |
||||
* @brief Header file of CRC LL module. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2016 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 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef STM32F1xx_LL_CRC_H |
||||
#define STM32F1xx_LL_CRC_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32f1xx.h" |
||||
|
||||
/** @addtogroup STM32F1xx_LL_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
#if defined(CRC) |
||||
|
||||
/** @defgroup CRC_LL CRC
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private types -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/* Private macros ------------------------------------------------------------*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported constants --------------------------------------------------------*/ |
||||
/** @defgroup CRC_LL_Exported_Constants CRC Exported Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
/** @defgroup CRC_LL_Exported_Macros CRC Exported Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup CRC_LL_EM_WRITE_READ Common Write and read registers Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Write a value in CRC register |
||||
* @param __INSTANCE__ CRC Instance |
||||
* @param __REG__ Register to be written |
||||
* @param __VALUE__ Value to be written in the register |
||||
* @retval None |
||||
*/ |
||||
#define LL_CRC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, __VALUE__) |
||||
|
||||
/**
|
||||
* @brief Read a value in CRC register |
||||
* @param __INSTANCE__ CRC Instance |
||||
* @param __REG__ Register to be read |
||||
* @retval Register value |
||||
*/ |
||||
#define LL_CRC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/** @defgroup CRC_LL_Exported_Functions CRC Exported Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup CRC_LL_EF_Configuration CRC Configuration functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Reset the CRC calculation unit. |
||||
* @note If Programmable Initial CRC value feature |
||||
* is available, also set the Data Register to the value stored in the |
||||
* CRC_INIT register, otherwise, reset Data Register to its default value. |
||||
* @rmtoll CR RESET LL_CRC_ResetCRCCalculationUnit |
||||
* @param CRCx CRC Instance |
||||
* @retval None |
||||
*/ |
||||
__STATIC_INLINE void LL_CRC_ResetCRCCalculationUnit(CRC_TypeDef *CRCx) |
||||
{ |
||||
SET_BIT(CRCx->CR, CRC_CR_RESET); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/** @defgroup CRC_LL_EF_Data_Management Data_Management
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Write given 32-bit data to the CRC calculator |
||||
* @rmtoll DR DR LL_CRC_FeedData32 |
||||
* @param CRCx CRC Instance |
||||
* @param InData value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFFFFFFFF |
||||
* @retval None |
||||
*/ |
||||
__STATIC_INLINE void LL_CRC_FeedData32(CRC_TypeDef *CRCx, uint32_t InData) |
||||
{ |
||||
WRITE_REG(CRCx->DR, InData); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Return current CRC calculation result. 32 bits value is returned. |
||||
* @rmtoll DR DR LL_CRC_ReadData32 |
||||
* @param CRCx CRC Instance |
||||
* @retval Current CRC calculation result as stored in CRC_DR register (32 bits). |
||||
*/ |
||||
__STATIC_INLINE uint32_t LL_CRC_ReadData32(CRC_TypeDef *CRCx) |
||||
{ |
||||
return (uint32_t)(READ_REG(CRCx->DR)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Return data stored in the Independent Data(IDR) register. |
||||
* @note This register can be used as a temporary storage location for one byte. |
||||
* @rmtoll IDR IDR LL_CRC_Read_IDR |
||||
* @param CRCx CRC Instance |
||||
* @retval Value stored in CRC_IDR register (General-purpose 8-bit data register). |
||||
*/ |
||||
__STATIC_INLINE uint32_t LL_CRC_Read_IDR(CRC_TypeDef *CRCx) |
||||
{ |
||||
return (uint32_t)(READ_REG(CRCx->IDR)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Store data in the Independent Data(IDR) register. |
||||
* @note This register can be used as a temporary storage location for one byte. |
||||
* @rmtoll IDR IDR LL_CRC_Write_IDR |
||||
* @param CRCx CRC Instance |
||||
* @param InData value to be stored in CRC_IDR register (8-bit) between Min_Data=0 and Max_Data=0xFF |
||||
* @retval None |
||||
*/ |
||||
__STATIC_INLINE void LL_CRC_Write_IDR(CRC_TypeDef *CRCx, uint32_t InData) |
||||
{ |
||||
*((uint8_t __IO *)(&CRCx->IDR)) = (uint8_t) InData; |
||||
} |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#if defined(USE_FULL_LL_DRIVER) |
||||
/** @defgroup CRC_LL_EF_Init Initialization and de-initialization functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
ErrorStatus LL_CRC_DeInit(CRC_TypeDef *CRCx); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
#endif /* USE_FULL_LL_DRIVER */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* defined(CRC) */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* STM32F1xx_LL_CRC_H */ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,108 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file stm32f1xx_ll_crc.c |
||||
* @author MCD Application Team |
||||
* @brief CRC LL module driver. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2016 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 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
#if defined(USE_FULL_LL_DRIVER) |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32f1xx_ll_crc.h" |
||||
#include "stm32f1xx_ll_bus.h" |
||||
|
||||
#ifdef USE_FULL_ASSERT |
||||
#include "stm32_assert.h" |
||||
#else |
||||
#define assert_param(expr) ((void)0U) |
||||
#endif/* USE_FULL_ASSERT */ |
||||
|
||||
/** @addtogroup STM32F1xx_LL_Driver
|
||||
* @{ |
||||
*/ |
||||
|
||||
#if defined (CRC) |
||||
|
||||
/** @addtogroup CRC_LL
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private types -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/* Private macros ------------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/** @addtogroup CRC_LL_Exported_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup CRC_LL_EF_Init
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief De-initialize CRC registers (Registers restored to their default values). |
||||
* @param CRCx CRC Instance |
||||
* @retval An ErrorStatus enumeration value: |
||||
* - SUCCESS: CRC registers are de-initialized |
||||
* - ERROR: CRC registers are not de-initialized |
||||
*/ |
||||
ErrorStatus LL_CRC_DeInit(CRC_TypeDef *CRCx) |
||||
{ |
||||
ErrorStatus status = SUCCESS; |
||||
|
||||
/* Check the parameters */ |
||||
assert_param(IS_CRC_ALL_INSTANCE(CRCx)); |
||||
|
||||
if (CRCx == CRC) |
||||
{ |
||||
|
||||
/* Reset the CRC calculation unit */ |
||||
LL_CRC_ResetCRCCalculationUnit(CRCx); |
||||
|
||||
/* Reset IDR register */ |
||||
LL_CRC_Write_IDR(CRCx, 0x00U); |
||||
} |
||||
else |
||||
{ |
||||
status = ERROR; |
||||
} |
||||
|
||||
return (status); |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* defined (CRC) */ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* USE_FULL_LL_DRIVER */ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,258 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32C0/flash_interface.c |
||||
* @author MCD Application Team |
||||
* @brief This file provides all the EEPROM emulation flash interface functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 "eeprom_emul.h" |
||||
#include "flash_interface.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
#ifdef FLASH_BANK_2 |
||||
static uint32_t GetBankNumber(uint32_t Address); |
||||
#endif |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Write a double word at the given address in Flash |
||||
* @param Address Where to write |
||||
* @param Data What to write |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE_WRITE_ERROR: if an error occurs |
||||
*/ |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data) |
||||
{ |
||||
return HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, Data);
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page in polling mode |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
uint32_t page_error = 0U; |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase(&s_eraseinit, &page_error) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page with interrupt enabled |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
|
||||
#ifdef FLASH_BANK_2 |
||||
uint32_t bank = GetBankNumber(PAGE_ADDRESS(Page)); |
||||
s_eraseinit.Banks = bank; |
||||
#endif |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase_IT(&s_eraseinit) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Flush the caches if needed to keep coherency when the flash content is modified |
||||
*/ |
||||
void FI_CacheFlush() |
||||
{ |
||||
/* No flush needed. There is no D-Cache for the STM32G0x0 and STM32G0x1 products. */ |
||||
return; |
||||
} |
||||
|
||||
#ifdef FLASH_BANK_2 |
||||
/**
|
||||
* @brief Gets the bank of a given address |
||||
* @param Address Address of the FLASH Memory |
||||
* @retval Bank_Number The bank of a given address |
||||
*/ |
||||
static uint32_t GetBankNumber(uint32_t Address) |
||||
{ |
||||
uint32_t bank = 0U; |
||||
|
||||
if (OB_USER_DUALBANK_SWAP_DISABLE) |
||||
{ |
||||
/* No Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
} |
||||
|
||||
return bank; |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @brief Delete corrupted Flash address, can be called from NMI. No Timeout. |
||||
* @param Address Address of the FLASH Memory to delete |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
|
||||
/* Set FLASH Programmation bit */ |
||||
SET_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
/* Program double word of value 0 */ |
||||
*(__IO uint32_t*)(Address) = (uint32_t)0U; |
||||
*(__IO uint32_t*)(Address+4U) = (uint32_t)0U; |
||||
|
||||
/* Wait programmation completion */ |
||||
#if defined(FLASH_DBANK_SUPPORT) |
||||
uint32_t bank = GetBankNumber(Address); |
||||
if(bank == FLASH_BANK_1) |
||||
{ |
||||
while(FLASH->SR & FLASH_SR_BSY1) |
||||
{ |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
while(FLASH->SR & FLASH_SR_BSY2) |
||||
{ |
||||
} |
||||
} |
||||
#else |
||||
while(FLASH->SR & FLASH_SR_BSY1) |
||||
{ |
||||
} |
||||
#endif |
||||
|
||||
/* Check if error occured */ |
||||
if((FLASH->SR & FLASH_SR_OPERR) || (FLASH->SR & FLASH_SR_PROGERR) || |
||||
(FLASH->SR & FLASH_SR_WRPERR) || (FLASH->SR & FLASH_SR_PGAERR) || |
||||
(FLASH->SR & FLASH_SR_SIZERR) || (FLASH->SR & FLASH_SR_PGSERR)) |
||||
{ |
||||
status = EE_DELETE_ERROR; |
||||
} |
||||
|
||||
/* Check FLASH End of Operation flag */ |
||||
if (FLASH->SR & FLASH_SR_EOP) |
||||
{ |
||||
/* Clear FLASH End of Operation pending bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); |
||||
} |
||||
|
||||
/* Clear FLASH Programmation bit */ |
||||
CLEAR_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Check if the configuration is 128-bits bank or 2*64-bits bank |
||||
* @param None |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_CheckBankConfig(void) |
||||
{ |
||||
#if defined (FLASH_DBANK_SUPPORT) |
||||
EE_Status status; |
||||
|
||||
/* Check the value of the DBANK user option byte */ |
||||
if (OB_USER_DUALBANK_ENABLE) |
||||
{ |
||||
status = EE_OK; |
||||
} |
||||
else |
||||
{ |
||||
status = EE_INVALID_BANK_CFG; |
||||
} |
||||
|
||||
return status; |
||||
#else |
||||
/* No feature 128-bits single bank, so always 64-bits dual bank */ |
||||
return EE_OK; |
||||
#endif |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,125 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32C0/flash_interface.h |
||||
* @author MCD Application Team |
||||
* @brief This file contains all the functions prototypes for the EEPROM |
||||
* emulation flash interface. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __FLASH_INTERFACE_H |
||||
#define __FLASH_INTERFACE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32c0xx_hal.h" |
||||
#include "stm32c0xx_ll_crc.h" |
||||
#include "stm32c0xx_ll_bus.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/* Private types -------------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup Private_Other_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
#define BANK_SIZE FLASH_BANK_SIZE /*!< Alias to FLASH_BANK_SIZE definition from HAL STM32L4 */ |
||||
#define EE_ACCESS_32BITS /*!< Enable EEPROM 32bits R/W functions, only valid for flash allowing 64bits access*/ |
||||
|
||||
/* Page state header */ |
||||
#define EE_PAGESTAT_ERASED (uint64_t)0xFFFFFFFFFFFFFFFFU /*!< State saved in 1st,2nd,3rd,4th data type of page header */ |
||||
#define EE_PAGESTAT_RECEIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 1st data type of page header */ |
||||
#define EE_PAGESTAT_ACTIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 2nd data type of page header */ |
||||
#define EE_PAGESTAT_VALID (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 3rd data type of page header */ |
||||
#define EE_PAGESTAT_ERASING (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 4th data type of page header */ |
||||
|
||||
/* Description of the 8 Bytes (64 bits) element in flash */ |
||||
/* Bit: 63 32 31 16 15 0 */ |
||||
/* <--- Data Value -----> <-unused-> <-VirtAddr-> */ |
||||
#define EE_ELEMENT_SIZE 8U /*!< Size of element in Bytes */ |
||||
#define EE_ELEMENT_TYPE uint64_t /*!< Type of element */ |
||||
#define EE_VIRTUALADDRESS_TYPE uint16_t /*!< Type of Virtual Address */ |
||||
#define EE_VIRTUALADDRESS_SHIFT 0U /*!< Bits Shifting to get Virtual Address in element */ |
||||
#define EE_CRC_TYPE uint16_t /*!< Type of Crc */ |
||||
#define EE_CRC_SHIFT 16U /*!< Bits Shifting to get Crc in element */ |
||||
#define EE_DATA_TYPE uint32_t /*!< Type of Data */ |
||||
#define EE_DATA_SHIFT 32U /*!< Bits Shifting to get Data value in element */ |
||||
#define EE_MASK_VIRTUALADDRESS (uint64_t)0x000000000000FFFFU |
||||
#define EE_MASK_CRC (uint64_t)0x00000000FFFF0000U |
||||
#define EE_MASK_DATA (uint64_t)0xFFFFFFFF00000000U |
||||
#define EE_MASK_FULL (uint64_t)0xFFFFFFFFFFFFFFFFU |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data); |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address); |
||||
EE_Status FI_CheckBankConfig(void); |
||||
void FI_CacheFlush(void); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __FLASH_INTERFACE_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -0,0 +1,173 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32L4/flash_interface.c |
||||
* @author MCD Application Team |
||||
* @brief This file provides all the EEPROM emulation flash interface functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 "eeprom_emul.h" |
||||
#include "flash_interface.h" |
||||
#include "snprintf.h" |
||||
#include <inttypes.h> |
||||
|
||||
|
||||
static inline void FI_Raw_ProgramHalfword(uint32_t Address, uint16_t value) |
||||
{ |
||||
*(__IO uint16_t *) (Address) = value; |
||||
|
||||
/* Wait programmation completion */ |
||||
while (FLASH->SR & FLASH_SR_BSY) { |
||||
} |
||||
} |
||||
|
||||
static inline void FI_Raw_ProgramWord(uint32_t Address, uint32_t value) |
||||
{ |
||||
FI_Raw_ProgramHalfword(Address, value & 0xFFFF); |
||||
FI_Raw_ProgramHalfword(Address + 2, value >> 16); |
||||
} |
||||
|
||||
static void FI_Raw_ProgramDoubleWord(uint32_t Address, uint64_t value) |
||||
{ |
||||
FI_Raw_ProgramWord(Address, value & 0xFFFFFFFFUL); |
||||
FI_Raw_ProgramWord(Address + 4, value >> 32); |
||||
} |
||||
|
||||
|
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
static void UnlockFlash() |
||||
{ |
||||
FLASH->KEYR = 0x45670123; |
||||
FLASH->KEYR = 0xCDEF89AB; |
||||
} |
||||
|
||||
static void LockFlash() |
||||
{ |
||||
FLASH->CR |= FLASH_CR_LOCK; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Write a double word at the given address in Flash |
||||
* @param Address Where to write |
||||
* @param Data What to write |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE_WRITE_ERROR: if an error occurs |
||||
*/ |
||||
EE_Status FI_WriteDoubleWord(uint32_t Address, uint64_t Data) |
||||
{ |
||||
PRINTF("FI wr %p, val %016"PRIx64"\r\n", (void *) Address, Data); |
||||
|
||||
EE_Status status = EE_OK; |
||||
|
||||
if (FLASH->CR & FLASH_CR_LOCK) { |
||||
UnlockFlash(); |
||||
} |
||||
|
||||
/* Set FLASH Programmation bit */ |
||||
FLASH->CR |= FLASH_CR_PG; |
||||
|
||||
/* Program double word of value 0 */ |
||||
FI_Raw_ProgramDoubleWord(Address, Data); |
||||
|
||||
/* Check if error occured */ |
||||
if (FLASH->SR & (FLASH_SR_WRPRTERR | FLASH_SR_PGERR)) { |
||||
PUTS("Flash write error\r\n"); |
||||
status = EE_WRITE_ERROR; |
||||
} |
||||
|
||||
/* Check FLASH End of Operation flag */ |
||||
if (FLASH->SR & FLASH_SR_EOP) { |
||||
/* Clear FLASH End of Operation pending bit */ |
||||
FLASH->SR = FLASH_SR_EOP; |
||||
} |
||||
|
||||
/* Clear FLASH Programmation bit */ |
||||
FLASH->CR &= ~FLASH_CR_PG; |
||||
|
||||
LockFlash(); |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page in polling mode |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
PRINTF("FI erase page %d, nbr %d\r\n", Page, NbPages); |
||||
|
||||
EE_Status status = EE_OK; |
||||
|
||||
if (FLASH->CR & FLASH_CR_LOCK) { |
||||
UnlockFlash(); |
||||
} |
||||
|
||||
/* Set FLASH Programmation bit */ |
||||
FLASH->CR |= FLASH_CR_PER; |
||||
|
||||
while (NbPages-- > 0) { |
||||
FLASH->AR = Page * FLASH_PAGE_SIZE; |
||||
|
||||
FLASH->CR |= FLASH_CR_STRT; |
||||
|
||||
/* Wait programmation completion */ |
||||
while (FLASH->SR & FLASH_SR_BSY) { |
||||
} |
||||
|
||||
Page++; |
||||
} |
||||
|
||||
FLASH->CR &= ~FLASH_CR_PER; |
||||
LockFlash(); |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Flush the caches if needed to keep coherency when the flash content is modified |
||||
*/ |
||||
void FI_CacheFlush() |
||||
{ |
||||
// f1 doesn't have cache
|
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @brief Delete corrupted Flash address, can be called from NMI. No Timeout. |
||||
* @param Address Address of the FLASH Memory to delete |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address) |
||||
{ |
||||
EE_Status rv = FI_WriteDoubleWord(Address, 0); |
||||
if (rv == EE_WRITE_ERROR) { |
||||
rv = EE_DELETE_ERROR; |
||||
} |
||||
|
||||
return rv; |
||||
} |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,265 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32G0/flash_interface.c |
||||
* @author MCD Application Team |
||||
* @brief This file provides all the EEPROM emulation flash interface functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 "eeprom_emul.h" |
||||
#include "flash_interface.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
#ifdef FLASH_BANK_2 |
||||
static uint32_t GetBankNumber(uint32_t Address); |
||||
#endif |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Write a double word at the given address in Flash |
||||
* @param Address Where to write |
||||
* @param Data What to write |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE_WRITE_ERROR: if an error occurs |
||||
*/ |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data) |
||||
{ |
||||
return HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, Data);
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page in polling mode |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
uint32_t page_error = 0U; |
||||
|
||||
#ifdef FLASH_BANK_2 |
||||
uint32_t bank = GetBankNumber(PAGE_ADDRESS(Page)); |
||||
s_eraseinit.Banks = bank; |
||||
#endif |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase(&s_eraseinit, &page_error) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page with interrupt enabled |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
|
||||
#ifdef FLASH_BANK_2 |
||||
uint32_t bank = GetBankNumber(PAGE_ADDRESS(Page)); |
||||
s_eraseinit.Banks = bank; |
||||
#endif |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase_IT(&s_eraseinit) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Flush the caches if needed to keep coherency when the flash content is modified |
||||
*/ |
||||
void FI_CacheFlush() |
||||
{ |
||||
/* No flush needed. There is no D-Cache for the STM32G0x0 and STM32G0x1 products. */ |
||||
return; |
||||
} |
||||
|
||||
#ifdef FLASH_BANK_2 |
||||
/**
|
||||
* @brief Gets the bank of a given address |
||||
* @param Address Address of the FLASH Memory |
||||
* @retval Bank_Number The bank of a given address |
||||
*/ |
||||
static uint32_t GetBankNumber(uint32_t Address) |
||||
{ |
||||
uint32_t bank = 0U; |
||||
|
||||
if (OB_USER_DUALBANK_SWAP_DISABLE) |
||||
{ |
||||
/* No Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
} |
||||
|
||||
return bank; |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @brief Delete corrupted Flash address, can be called from NMI. No Timeout. |
||||
* @param Address Address of the FLASH Memory to delete |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
|
||||
/* Set FLASH Programmation bit */ |
||||
SET_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
/* Program double word of value 0 */ |
||||
*(__IO uint32_t*)(Address) = (uint32_t)0U; |
||||
*(__IO uint32_t*)(Address+4U) = (uint32_t)0U; |
||||
|
||||
/* Wait programmation completion */ |
||||
#if defined(FLASH_DBANK_SUPPORT) |
||||
uint32_t bank = GetBankNumber(Address); |
||||
if(bank == FLASH_BANK_1) |
||||
{ |
||||
while(FLASH->SR & FLASH_SR_BSY1) |
||||
{ |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
while(FLASH->SR & FLASH_SR_BSY2) |
||||
{ |
||||
} |
||||
} |
||||
#else |
||||
while(FLASH->SR & FLASH_SR_BSY1) |
||||
{ |
||||
} |
||||
#endif |
||||
|
||||
/* Check if error occured */ |
||||
if((FLASH->SR & FLASH_SR_OPERR) || (FLASH->SR & FLASH_SR_PROGERR) || |
||||
(FLASH->SR & FLASH_SR_WRPERR) || (FLASH->SR & FLASH_SR_PGAERR) || |
||||
(FLASH->SR & FLASH_SR_SIZERR) || (FLASH->SR & FLASH_SR_PGSERR)) |
||||
{ |
||||
status = EE_DELETE_ERROR; |
||||
} |
||||
|
||||
/* Check FLASH End of Operation flag */ |
||||
if (FLASH->SR & FLASH_SR_EOP) |
||||
{ |
||||
/* Clear FLASH End of Operation pending bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); |
||||
} |
||||
|
||||
/* Clear FLASH Programmation bit */ |
||||
CLEAR_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
/* Clear FLASH ECCD bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ECCD); |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Check if the configuration is 128-bits bank or 2*64-bits bank |
||||
* @param None |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_CheckBankConfig(void) |
||||
{ |
||||
#if defined (FLASH_DBANK_SUPPORT) |
||||
EE_Status status; |
||||
|
||||
/* Check the value of the DBANK user option byte */ |
||||
if (OB_USER_DUALBANK_ENABLE) |
||||
{ |
||||
status = EE_OK; |
||||
} |
||||
else |
||||
{ |
||||
status = EE_INVALID_BANK_CFG; |
||||
} |
||||
|
||||
return status; |
||||
#else |
||||
/* No feature 128-bits single bank, so always 64-bits dual bank */ |
||||
return EE_OK; |
||||
#endif |
||||
} |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,125 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32G0/flash_interface.h |
||||
* @author MCD Application Team |
||||
* @brief This file contains all the functions prototypes for the EEPROM |
||||
* emulation flash interface. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __FLASH_INTERFACE_H |
||||
#define __FLASH_INTERFACE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32g0xx_hal.h" |
||||
#include "stm32g0xx_ll_crc.h" |
||||
#include "stm32g0xx_ll_bus.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/* Private types -------------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup Private_Other_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
#define BANK_SIZE FLASH_BANK_SIZE /*!< Alias to FLASH_BANK_SIZE definition from HAL STM32L4 */ |
||||
#define EE_ACCESS_32BITS /*!< Enable EEPROM 32bits R/W functions, only valid for flash allowing 64bits access*/ |
||||
|
||||
/* Page state header */ |
||||
#define EE_PAGESTAT_ERASED (uint64_t)0xFFFFFFFFFFFFFFFFU /*!< State saved in 1st,2nd,3rd,4th data type of page header */ |
||||
#define EE_PAGESTAT_RECEIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 1st data type of page header */ |
||||
#define EE_PAGESTAT_ACTIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 2nd data type of page header */ |
||||
#define EE_PAGESTAT_VALID (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 3rd data type of page header */ |
||||
#define EE_PAGESTAT_ERASING (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 4th data type of page header */ |
||||
|
||||
/* Description of the 8 Bytes (64 bits) element in flash */ |
||||
/* Bit: 63 32 31 16 15 0 */ |
||||
/* <--- Data Value -----> <-unused-> <-VirtAddr-> */ |
||||
#define EE_ELEMENT_SIZE 8U /*!< Size of element in Bytes */ |
||||
#define EE_ELEMENT_TYPE uint64_t /*!< Type of element */ |
||||
#define EE_VIRTUALADDRESS_TYPE uint16_t /*!< Type of Virtual Address */ |
||||
#define EE_VIRTUALADDRESS_SHIFT 0U /*!< Bits Shifting to get Virtual Address in element */ |
||||
#define EE_CRC_TYPE uint16_t /*!< Type of Crc */ |
||||
#define EE_CRC_SHIFT 16U /*!< Bits Shifting to get Crc in element */ |
||||
#define EE_DATA_TYPE uint32_t /*!< Type of Data */ |
||||
#define EE_DATA_SHIFT 32U /*!< Bits Shifting to get Data value in element */ |
||||
#define EE_MASK_VIRTUALADDRESS (uint64_t)0x000000000000FFFFU |
||||
#define EE_MASK_CRC (uint64_t)0x00000000FFFF0000U |
||||
#define EE_MASK_DATA (uint64_t)0xFFFFFFFF00000000U |
||||
#define EE_MASK_FULL (uint64_t)0xFFFFFFFFFFFFFFFFU |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data); |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address); |
||||
EE_Status FI_CheckBankConfig(void); |
||||
void FI_CacheFlush(void); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __FLASH_INTERFACE_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,280 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32G4/flash_interface.c |
||||
* @author MCD Application Team |
||||
* @brief This file provides all the EEPROM emulation flash interface functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 "eeprom_emul.h" |
||||
#include "flash_interface.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
#if defined(FLASH_BANK_2) |
||||
static uint32_t GetBankNumber(uint32_t Address); |
||||
#endif |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Write a double word at the given address in Flash |
||||
* @param Address Where to write |
||||
* @param Data What to write |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE_WRITE_ERROR: if an error occurs |
||||
*/ |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data) |
||||
{ |
||||
return HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, Data);
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page in polling mode |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
uint32_t bank = FLASH_BANK_1, page_error = 0U; |
||||
|
||||
#if defined(FLASH_BANK_2) |
||||
bank = GetBankNumber(PAGE_ADDRESS(Page)); |
||||
#endif |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
s_eraseinit.Banks = bank; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase(&s_eraseinit, &page_error) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page with interrupt enabled |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
|
||||
uint32_t bank = FLASH_BANK_1; |
||||
|
||||
#if defined(FLASH_BANK_2) |
||||
bank = GetBankNumber(PAGE_ADDRESS(Page)); |
||||
#endif |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
s_eraseinit.Banks = bank; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase_IT(&s_eraseinit) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Flush the caches if needed to keep coherency when the flash content is modified |
||||
*/ |
||||
void FI_CacheFlush() |
||||
{ |
||||
/* To keep its coherency, flush the D-Cache: its content is not updated after a flash erase. */ |
||||
__HAL_FLASH_DATA_CACHE_DISABLE(); |
||||
__HAL_FLASH_DATA_CACHE_RESET(); |
||||
__HAL_FLASH_DATA_CACHE_ENABLE(); |
||||
} |
||||
|
||||
#if defined(FLASH_BANK_2) |
||||
/**
|
||||
* @brief Gets the bank of a given address |
||||
* @param Address Address of the FLASH Memory |
||||
* @retval Bank_Number The bank of a given address |
||||
*/ |
||||
static uint32_t GetBankNumber(uint32_t Address) |
||||
{ |
||||
uint32_t bank = 0U; |
||||
|
||||
if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0U) |
||||
{ |
||||
/* No Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
} |
||||
|
||||
return bank; |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @brief Delete corrupted Flash address, can be called from NMI. No Timeout. |
||||
* @param Address Address of the FLASH Memory to delete |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address) |
||||
{ |
||||
uint32_t dcachetoreactivate = 0U; |
||||
EE_Status status = EE_OK; |
||||
|
||||
/* Deactivate the data cache if they are activated to avoid data misbehavior */ |
||||
if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != RESET) |
||||
{ |
||||
/* Disable data cache */ |
||||
__HAL_FLASH_DATA_CACHE_DISABLE(); |
||||
dcachetoreactivate = 1U; |
||||
} |
||||
|
||||
/* Set FLASH Programmation bit */ |
||||
SET_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
/* Program double word of value 0 */ |
||||
*(__IO uint32_t*)(Address) = (uint32_t)0U; |
||||
*(__IO uint32_t*)(Address+4U) = (uint32_t)0U; |
||||
|
||||
/* Wait programmation completion */ |
||||
while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) |
||||
{ |
||||
} |
||||
|
||||
/* Check if error occured */ |
||||
if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PROGERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR))) |
||||
{ |
||||
status = EE_DELETE_ERROR; |
||||
} |
||||
|
||||
/* Check FLASH End of Operation flag */ |
||||
if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) |
||||
{ |
||||
/* Clear FLASH End of Operation pending bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); |
||||
} |
||||
|
||||
/* Clear FLASH Programmation bit */ |
||||
CLEAR_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
/* Flush the caches to be sure of the data consistency */ |
||||
if(dcachetoreactivate == 1U) |
||||
{ |
||||
/* Reset data cache */ |
||||
__HAL_FLASH_DATA_CACHE_RESET(); |
||||
/* Enable data cache */ |
||||
__HAL_FLASH_DATA_CACHE_ENABLE(); |
||||
} |
||||
|
||||
/* Clear FLASH ECCD bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ECCD); |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Check if the configuration is 128-bits bank or 2*64-bits bank |
||||
* @param None |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_CheckBankConfig(void) |
||||
{ |
||||
#if defined (FLASH_OPTR_DBANK) |
||||
FLASH_OBProgramInitTypeDef sOBCfg; |
||||
EE_Status status; |
||||
|
||||
/* Request the Option Byte configuration :
|
||||
- User and RDP level are always returned |
||||
- WRP and PCROP are not requested */ |
||||
sOBCfg.WRPArea = 0xFF; |
||||
sOBCfg.PCROPConfig = 0xFF; |
||||
HAL_FLASHEx_OBGetConfig(&sOBCfg); |
||||
|
||||
/* Check the value of the DBANK user option byte */ |
||||
if ((sOBCfg.USERConfig & OB_DBANK_64_BITS) != 0) |
||||
{ |
||||
status = EE_OK; |
||||
} |
||||
else |
||||
{ |
||||
status = EE_INVALID_BANK_CFG; |
||||
} |
||||
|
||||
return status; |
||||
#else |
||||
/* No feature 128-bits single bank, so always 64-bits dual bank */ |
||||
return EE_OK; |
||||
#endif |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,125 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32G4/flash_interface.h |
||||
* @author MCD Application Team |
||||
* @brief This file contains all the functions prototypes for the EEPROM |
||||
* emulation flash interface. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __FLASH_INTERFACE_H |
||||
#define __FLASH_INTERFACE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32g4xx_hal.h" |
||||
#include "stm32g4xx_ll_crc.h" |
||||
#include "stm32g4xx_ll_bus.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/* Private types -------------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup Private_Other_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
#define BANK_SIZE FLASH_BANK_SIZE /*!< Alias to FLASH_BANK_SIZE definition from HAL STM32L4 */ |
||||
#define EE_ACCESS_32BITS /*!< Enable EEPROM 32bits R/W functions, only valid for flash allowing 64bits access*/ |
||||
|
||||
/* Page state header */ |
||||
#define EE_PAGESTAT_ERASED (uint64_t)0xFFFFFFFFFFFFFFFFU /*!< State saved in 1st,2nd,3rd,4th data type of page header */ |
||||
#define EE_PAGESTAT_RECEIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 1st data type of page header */ |
||||
#define EE_PAGESTAT_ACTIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 2nd data type of page header */ |
||||
#define EE_PAGESTAT_VALID (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 3rd data type of page header */ |
||||
#define EE_PAGESTAT_ERASING (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 4th data type of page header */ |
||||
|
||||
/* Description of the 8 Bytes (64 bits) element in flash */ |
||||
/* Bit: 63 32 31 16 15 0 */ |
||||
/* <--- Data Value -----> <-unused-> <-VirtAddr-> */ |
||||
#define EE_ELEMENT_SIZE 8U /*!< Size of element in Bytes */ |
||||
#define EE_ELEMENT_TYPE uint64_t /*!< Type of element */ |
||||
#define EE_VIRTUALADDRESS_TYPE uint16_t /*!< Type of Virtual Address */ |
||||
#define EE_VIRTUALADDRESS_SHIFT 0U /*!< Bits Shifting to get Virtual Address in element */ |
||||
#define EE_CRC_TYPE uint16_t /*!< Type of Crc */ |
||||
#define EE_CRC_SHIFT 16U /*!< Bits Shifting to get Crc in element */ |
||||
#define EE_DATA_TYPE uint32_t /*!< Type of Data */ |
||||
#define EE_DATA_SHIFT 32U /*!< Bits Shifting to get Data value in element */ |
||||
#define EE_MASK_VIRTUALADDRESS (uint64_t)0x000000000000FFFFU |
||||
#define EE_MASK_CRC (uint64_t)0x00000000FFFF0000U |
||||
#define EE_MASK_DATA (uint64_t)0xFFFFFFFF00000000U |
||||
#define EE_MASK_FULL (uint64_t)0xFFFFFFFFFFFFFFFFU |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data); |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address); |
||||
EE_Status FI_CheckBankConfig(void); |
||||
void FI_CacheFlush(void); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __FLASH_INTERFACE_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,279 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32L4/flash_interface.c |
||||
* @author MCD Application Team |
||||
* @brief This file provides all the EEPROM emulation flash interface functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 "eeprom_emul.h" |
||||
#include "flash_interface.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
#if defined(FLASH_BANK_2) |
||||
static uint32_t GetBankNumber(uint32_t Address); |
||||
#endif |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Write a double word at the given address in Flash |
||||
* @param Address Where to write |
||||
* @param Data What to write |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE_WRITE_ERROR: if an error occurs |
||||
*/ |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data) |
||||
{ |
||||
return HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, Data);
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page in polling mode |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
uint32_t bank = FLASH_BANK_1, page_error = 0U; |
||||
|
||||
#if defined(FLASH_BANK_2) |
||||
bank = GetBankNumber(PAGE_ADDRESS(Page)); |
||||
#endif |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
s_eraseinit.Banks = bank; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase(&s_eraseinit, &page_error) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page with interrupt enabled |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
uint32_t bank = FLASH_BANK_1; |
||||
|
||||
#if defined(FLASH_BANK_2) |
||||
bank = GetBankNumber(PAGE_ADDRESS(Page)); |
||||
#endif |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
s_eraseinit.Banks = bank; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase_IT(&s_eraseinit) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Flush the caches if needed to keep coherency when the flash content is modified |
||||
*/ |
||||
void FI_CacheFlush() |
||||
{ |
||||
/* To keep its coherency, flush the D-Cache: its content is not updated after a flash erase. */ |
||||
__HAL_FLASH_DATA_CACHE_DISABLE(); |
||||
__HAL_FLASH_DATA_CACHE_RESET(); |
||||
__HAL_FLASH_DATA_CACHE_ENABLE(); |
||||
} |
||||
|
||||
#if defined(FLASH_BANK_2) |
||||
/**
|
||||
* @brief Gets the bank of a given address |
||||
* @param Address Address of the FLASH Memory |
||||
* @retval Bank_Number The bank of a given address |
||||
*/ |
||||
static uint32_t GetBankNumber(uint32_t Address) |
||||
{ |
||||
uint32_t bank = 0U; |
||||
|
||||
if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0U) |
||||
{ |
||||
/* No Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
} |
||||
|
||||
return bank; |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @brief Delete corrupted Flash address, can be called from NMI. No Timeout. |
||||
* @param Address Address of the FLASH Memory to delete |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address) |
||||
{ |
||||
uint32_t dcachetoreactivate = 0U; |
||||
EE_Status status = EE_OK; |
||||
|
||||
/* Deactivate the data cache if they are activated to avoid data misbehavior */ |
||||
if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != RESET) |
||||
{ |
||||
/* Disable data cache */ |
||||
__HAL_FLASH_DATA_CACHE_DISABLE(); |
||||
dcachetoreactivate = 1U; |
||||
} |
||||
|
||||
/* Set FLASH Programmation bit */ |
||||
SET_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
/* Program double word of value 0 */ |
||||
*(__IO uint32_t*)(Address) = (uint32_t)0U; |
||||
*(__IO uint32_t*)(Address+4U) = (uint32_t)0U; |
||||
|
||||
/* Wait programmation completion */ |
||||
while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) |
||||
{ |
||||
} |
||||
|
||||
/* Check if error occured */ |
||||
if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PROGERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR))) |
||||
{ |
||||
status = EE_DELETE_ERROR; |
||||
} |
||||
|
||||
/* Check FLASH End of Operation flag */ |
||||
if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) |
||||
{ |
||||
/* Clear FLASH End of Operation pending bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); |
||||
} |
||||
|
||||
/* Clear FLASH Programmation bit */ |
||||
CLEAR_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
/* Flush the caches to be sure of the data consistency */ |
||||
if(dcachetoreactivate == 1U) |
||||
{ |
||||
/* Reset data cache */ |
||||
__HAL_FLASH_DATA_CACHE_RESET(); |
||||
/* Enable data cache */ |
||||
__HAL_FLASH_DATA_CACHE_ENABLE(); |
||||
} |
||||
|
||||
/* Clear FLASH ECCD bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ECCD); |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Check if the configuration is 128-bits bank or 2*64-bits bank |
||||
* @param None |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_CheckBankConfig(void) |
||||
{ |
||||
#if defined (FLASH_OPTR_DBANK) |
||||
FLASH_OBProgramInitTypeDef sOBCfg; |
||||
EE_Status status; |
||||
|
||||
/* Request the Option Byte configuration :
|
||||
- User and RDP level are always returned |
||||
- WRP and PCROP are not requested */ |
||||
sOBCfg.WRPArea = 0xFF; |
||||
sOBCfg.PCROPConfig = 0xFF; |
||||
HAL_FLASHEx_OBGetConfig(&sOBCfg); |
||||
|
||||
/* Check the value of the DBANK user option byte */ |
||||
if ((sOBCfg.USERConfig & OB_DBANK_64_BITS) != 0) |
||||
{ |
||||
status = EE_OK; |
||||
} |
||||
else |
||||
{ |
||||
status = EE_INVALID_BANK_CFG; |
||||
} |
||||
|
||||
return status; |
||||
#else |
||||
/* No feature 128-bits single bank, so always 64-bits dual bank */ |
||||
return EE_OK; |
||||
#endif |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,267 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32L5/flash_interface.c |
||||
* @author MCD Application Team |
||||
* @brief This file provides all the EEPROM emulation flash interface functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 "eeprom_emul.h" |
||||
#include "flash_interface.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
#ifdef FLASH_BANK_2 |
||||
static uint32_t GetBankNumber(uint32_t Address); |
||||
#endif |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Write a double word at the given address in Flash |
||||
* @param Address Where to write |
||||
* @param Data What to write |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE_WRITE_ERROR: if an error occurs |
||||
*/ |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data) |
||||
{ |
||||
return HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, Data); |
||||
/* If TrustZone secure activated -> return HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD_NS, Address, Data); */ |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page in polling mode |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
uint32_t bank = FLASH_BANK_1, page_error = 0U; |
||||
|
||||
#ifdef FLASH_BANK_2 |
||||
bank = GetBankNumber(PAGE_ADDRESS(Page)); |
||||
#endif |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; /* if TrustZone secure activated -> FLASH_TYPEERASE_PAGES_NS; */ |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
s_eraseinit.Banks = bank; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase(&s_eraseinit, &page_error) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page with interrupt enabled |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
uint32_t bank = FLASH_BANK_1; |
||||
|
||||
#ifdef FLASH_BANK_2 |
||||
bank = GetBankNumber(PAGE_ADDRESS(Page)); |
||||
#endif |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; /* if TrustZone secure activated -> FLASH_TYPEERASE_PAGES_NS; */ |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
s_eraseinit.Banks = bank; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase_IT(&s_eraseinit) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Flush the caches if needed to keep coherency when the flash content is modified |
||||
*/ |
||||
void FI_CacheFlush() |
||||
{ |
||||
/* No flush needed. EEPROM flash area is defined as non-cacheable thanks to the MPU in main.c. */ |
||||
return; |
||||
} |
||||
|
||||
#ifdef FLASH_BANK_2 |
||||
/**
|
||||
* @brief Gets the bank of a given address |
||||
* @param Address Address of the FLASH Memory |
||||
* @retval Bank_Number The bank of a given address |
||||
*/ |
||||
static uint32_t GetBankNumber(uint32_t Address) |
||||
{ |
||||
uint32_t bank = 0U; |
||||
|
||||
if (READ_BIT(FLASH->OPTR, FLASH_OPTR_SWAP_BANK) == 0U) |
||||
{ |
||||
/* No Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
} |
||||
|
||||
return bank; |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @brief Delete corrupted Flash address, can be called from NMI. No Timeout. |
||||
* @param Address Address of the FLASH Memory to delete |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
|
||||
/* Wait for previous programmation completion */ |
||||
while(__HAL_FLASH_GET_FLAG(FLASH_NSSR_NSBSY)) |
||||
{ |
||||
} |
||||
|
||||
/* Clear previous non-secure error programming flag */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); |
||||
|
||||
/* Set FLASH Programmation bit */ |
||||
SET_BIT(FLASH->NSCR, FLASH_NSCR_NSPG); |
||||
|
||||
/* Program double word of value 0 */ |
||||
*(__IO uint32_t*)(Address) = (uint32_t)0U; |
||||
*(__IO uint32_t*)(Address+4U) = (uint32_t)0U; |
||||
|
||||
/* Wait programmation completion */ |
||||
while(__HAL_FLASH_GET_FLAG(FLASH_NSSR_NSBSY)) |
||||
{ |
||||
} |
||||
|
||||
/* Check if error occured */ |
||||
if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PROGERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR))) |
||||
{ |
||||
status = EE_DELETE_ERROR; |
||||
} |
||||
|
||||
/* Check FLASH End of Operation flag */ |
||||
if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) |
||||
{ |
||||
/* Clear FLASH End of Operation pending bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); |
||||
} |
||||
|
||||
/* Clear FLASH Programmation bit */ |
||||
CLEAR_BIT(FLASH->NSCR, FLASH_NSCR_NSPG); |
||||
|
||||
/* Clear FLASH ECCD bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ECCD); |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Check if the configuration is 128-bits bank or 2*64-bits bank |
||||
* @param None |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_CheckBankConfig(void) |
||||
{ |
||||
#if defined (FLASH_OPTR_DBANK) |
||||
FLASH_OBProgramInitTypeDef sOBCfg; |
||||
EE_Status status; |
||||
|
||||
/* Request the Option Byte configuration :
|
||||
- User and RDP level are always returned |
||||
- WRP and PCROP are not requested */ |
||||
sOBCfg.WRPArea = 0xFF; |
||||
HAL_FLASHEx_OBGetConfig(&sOBCfg); |
||||
|
||||
/* Check the value of the DBANK user option byte */ |
||||
if ((sOBCfg.USERConfig & OB_DBANK_64_BITS) != 0) |
||||
{ |
||||
status = EE_OK; |
||||
} |
||||
else |
||||
{ |
||||
status = EE_INVALID_BANK_CFG; |
||||
} |
||||
|
||||
return status; |
||||
#else |
||||
/* No feature 128-bits single bank, so always 64-bits dual bank */ |
||||
return EE_OK; |
||||
#endif |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,126 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32L5/flash_interface.h |
||||
* @author MCD Application Team |
||||
* @brief This file contains all the functions prototypes for the EEPROM |
||||
* emulation flash interface. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __FLASH_INTERFACE_H |
||||
#define __FLASH_INTERFACE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32l5xx_hal.h" |
||||
#include "stm32l5xx_ll_crc.h" |
||||
#include "stm32l5xx_ll_bus.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/* Private types -------------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup Private_Other_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
#define BANK_SIZE FLASH_BANK_SIZE /*!< Alias to FLASH_BANK_SIZE definition from HAL STM32L4 */ |
||||
#define EE_ACCESS_32BITS /*!< Enable EEPROM 32bits R/W functions, only valid for flash allowing 64bits access*/ |
||||
|
||||
/* Page state header */ |
||||
#define EE_PAGESTAT_ERASED (uint64_t)0xFFFFFFFFFFFFFFFFU /*!< State saved in 1st,2nd,3rd,4th data type of page header */ |
||||
#define EE_PAGESTAT_RECEIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 1st data type of page header */ |
||||
#define EE_PAGESTAT_ACTIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 2nd data type of page header */ |
||||
#define EE_PAGESTAT_VALID (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 3rd data type of page header */ |
||||
#define EE_PAGESTAT_ERASING (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 4th data type of page header */ |
||||
|
||||
/* Description of the 8 Bytes (64 bits) element in flash */ |
||||
/* Bit: 63 32 31 16 15 0 */ |
||||
/* <--- Data Value -----> <-unused-> <-VirtAddr-> */ |
||||
#define EE_ELEMENT_SIZE 8U /*!< Size of element in Bytes */ |
||||
#define EE_ELEMENT_TYPE uint64_t /*!< Type of element */ |
||||
#define EE_VIRTUALADDRESS_TYPE uint16_t /*!< Type of Virtual Address */ |
||||
#define EE_VIRTUALADDRESS_SHIFT 0U /*!< Bits Shifting to get Virtual Address in element */ |
||||
#define EE_CRC_TYPE uint16_t /*!< Type of Crc */ |
||||
#define EE_CRC_SHIFT 16U /*!< Bits Shifting to get Crc in element */ |
||||
#define EE_DATA_TYPE uint32_t /*!< Type of Data */ |
||||
#define EE_DATA_SHIFT 32U /*!< Bits Shifting to get Data value in element */ |
||||
#define EE_MASK_VIRTUALADDRESS (uint64_t)0x000000000000FFFFU |
||||
#define EE_MASK_CRC (uint64_t)0x00000000FFFF0000U |
||||
#define EE_MASK_DATA (uint64_t)0xFFFFFFFF00000000U |
||||
#define EE_MASK_FULL (uint64_t)0xFFFFFFFFFFFFFFFFU |
||||
|
||||
#define SECURE_FEATURE /*!< Informs the driver about the security features of the flash interface */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data); |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address); |
||||
EE_Status FI_CheckBankConfig(void); |
||||
void FI_CacheFlush(void); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __FLASH_INTERFACE_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,299 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32L5/flash_interface.c |
||||
* @author MCD Application Team |
||||
* @brief This file provides all the EEPROM emulation flash interface functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 "eeprom_emul.h" |
||||
#include "flash_interface.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
uint64_t FlashWord[2] = |
||||
{ |
||||
0x0, 0x0 |
||||
}; |
||||
uint8_t FlashWord_status = 0; /* 0 is FlashWord is empty, 1 it is full */ |
||||
const uint32_t QuadWord[4] =
|
||||
{
|
||||
0x00000000, |
||||
0x00000000, |
||||
0x00000000, |
||||
0x00000000 |
||||
}; |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
#ifdef FLASH_BANK_2 |
||||
static uint32_t GetBankNumber(uint32_t Address); |
||||
#endif |
||||
|
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Write a quad word at the given address in Flash (function is called FI_WriteDoubleWord to respect legacy for X-CUBE-EEPROM) |
||||
* @param Address Where to write |
||||
* @param Data What to write |
||||
* @param Write_type Type of writing on going (see EE_Write_type) |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE_WRITE_ERROR: if an error occurs |
||||
* - EE_FLASH_USED: flash currently used by CPU2 |
||||
*/ |
||||
EE_Status FI_WriteDoubleWord(uint32_t Address, uint64_t* Data, EE_Write_type Write_type) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
|
||||
if(Write_type == EE_SET_PAGE) |
||||
{
|
||||
FlashWord[0] = Data[0]; |
||||
FlashWord[1] = Data[0]; |
||||
} |
||||
else |
||||
{ |
||||
FlashWord[0] = Data[0]; |
||||
FlashWord[1] = Data[1];
|
||||
} |
||||
|
||||
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_QUADWORD, Address, ((uint32_t)FlashWord)) != HAL_OK) |
||||
{ |
||||
status = EE_WRITE_ERROR; |
||||
} |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page in polling mode |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
uint32_t bank = FLASH_BANK_1, page_error = 0U; |
||||
|
||||
#ifdef FLASH_BANK_2 |
||||
bank = GetBankNumber(PAGE_ADDRESS(Page)); |
||||
#endif |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; /* if TrustZone secure activated -> FLASH_TYPEERASE_PAGES_NS; */ |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
s_eraseinit.Banks = bank; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase(&s_eraseinit, &page_error) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page with interrupt enabled |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
uint32_t bank = FLASH_BANK_1; |
||||
|
||||
#ifdef FLASH_BANK_2 |
||||
bank = GetBankNumber(PAGE_ADDRESS(Page)); |
||||
#endif |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; /* if TrustZone secure activated -> FLASH_TYPEERASE_PAGES_NS; */ |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
s_eraseinit.Banks = bank; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase_IT(&s_eraseinit) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Flush the caches if needed to keep coherency when the flash content is modified |
||||
*/ |
||||
void FI_CacheFlush() |
||||
{ |
||||
/* No flush needed. EEPROM flash area is defined as non-cacheable thanks to the MPU in main.c. */ |
||||
return; |
||||
} |
||||
|
||||
#ifdef FLASH_BANK_2 |
||||
/**
|
||||
* @brief Gets the bank of a given address |
||||
* @param Address Address of the FLASH Memory |
||||
* @retval Bank_Number The bank of a given address |
||||
*/ |
||||
static uint32_t GetBankNumber(uint32_t Address) |
||||
{ |
||||
uint32_t bank = 0U; |
||||
|
||||
if (READ_BIT(FLASH->OPTR, FLASH_OPTR_SWAP_BANK) == 0U) |
||||
{ |
||||
/* No Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
/* Bank swap */ |
||||
if (Address < (FLASH_BASE + FLASH_BANK_SIZE)) |
||||
{ |
||||
bank = FLASH_BANK_2; |
||||
} |
||||
else |
||||
{ |
||||
bank = FLASH_BANK_1; |
||||
} |
||||
} |
||||
|
||||
return bank; |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @brief Delete corrupted Flash address, can be called from NMI. No Timeout. |
||||
* @param Address Address of the FLASH Memory to delete |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
|
||||
/* Wait for previous programmation completion */ |
||||
while(__HAL_FLASH_GET_FLAG(FLASH_NSSR_BSY)) |
||||
{ |
||||
} |
||||
|
||||
/* Clear previous non-secure error programming flag */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); |
||||
|
||||
/* Set FLASH Programmation bit */ |
||||
SET_BIT(FLASH->NSCR, FLASH_NSCR_PG); |
||||
|
||||
/* Program quad word of value 0 */ |
||||
// HAL_FLASH_Program(FLASH_TYPEPROGRAM_QUADWORD, Address, ((uint32_t)QuadWord));
|
||||
*(__IO uint64_t*)(Address) = (uint64_t)0U; |
||||
*(__IO uint64_t*)(Address+8U) = (uint64_t)0U; |
||||
|
||||
/* Wait programmation completion */ |
||||
while(__HAL_FLASH_GET_FLAG(FLASH_NSSR_BSY)) |
||||
{ |
||||
} |
||||
|
||||
/* Check if error occured */ |
||||
if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PROGERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR))) |
||||
{ |
||||
status = EE_DELETE_ERROR; |
||||
} |
||||
|
||||
/* Check FLASH End of Operation flag */ |
||||
if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) |
||||
{ |
||||
/* Clear FLASH End of Operation pending bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); |
||||
} |
||||
|
||||
/* Clear FLASH Programmation bit */ |
||||
CLEAR_BIT(FLASH->NSCR, FLASH_NSCR_PG); |
||||
|
||||
/* Clear FLASH ECCD bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ECCD); |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Check if the configuration is 128-bits bank or 2*64-bits bank |
||||
* @param None |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_CheckBankConfig(void) |
||||
{ |
||||
#if defined (FLASH_OPTR_DBANK) |
||||
FLASH_OBProgramInitTypeDef sOBCfg; |
||||
EE_Status status; |
||||
|
||||
/* Request the Option Byte configuration :
|
||||
- User and RDP level are always returned |
||||
- WRP and PCROP are not requested */ |
||||
sOBCfg.WRPArea = 0xFF; |
||||
HAL_FLASHEx_OBGetConfig(&sOBCfg); |
||||
|
||||
/* Check the value of the DBANK user option byte */ |
||||
if ((sOBCfg.USERConfig & OB_DBANK_64_BITS) != 0) |
||||
{ |
||||
status = EE_OK; |
||||
} |
||||
else |
||||
{ |
||||
status = EE_INVALID_BANK_CFG; |
||||
} |
||||
|
||||
return status; |
||||
#else |
||||
/* No feature 128-bits single bank, so always 64-bits dual bank */ |
||||
return EE_OK; |
||||
#endif |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,126 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32L5/flash_interface.h |
||||
* @author MCD Application Team |
||||
* @brief This file contains all the functions prototypes for the EEPROM |
||||
* emulation flash interface. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __FLASH_INTERFACE_H |
||||
#define __FLASH_INTERFACE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "stm32u5xx_hal.h" |
||||
#include "stm32u5xx_ll_crc.h" |
||||
#include "stm32u5xx_ll_bus.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/* Private types -------------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup Private_Other_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
#define BANK_SIZE FLASH_BANK_SIZE /*!< Alias to FLASH_BANK_SIZE definition from HAL */ |
||||
#define EE_ACCESS_32BITS /*!< Enable EEPROM 32bits R/W functions */ |
||||
|
||||
/* Page state header */ |
||||
#define EE_PAGESTAT_ERASED (uint64_t)0xFFFFFFFFFFFFFFFFU /*!< State saved in 1st,2nd,3rd,4th data type of page header */ |
||||
#define EE_PAGESTAT_RECEIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 1st data type of page header */ |
||||
#define EE_PAGESTAT_ACTIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 2nd data type of page header */ |
||||
#define EE_PAGESTAT_VALID (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 3rd data type of page header */ |
||||
#define EE_PAGESTAT_ERASING (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 4th data type of page header */ |
||||
|
||||
/* Description of the 16 Bytes (128 bits) element in flash */ |
||||
/* Bit: 127 64 63 48 47 0 */ |
||||
/* <--- Data Value -----> <-CRC-> <-VirtAddr-> */ |
||||
#define EE_ELEMENT_SIZE 16U /*!< Size of element in Bytes */ |
||||
#define EE_ELEMENT_TYPE uint64_t /*!< Type of element */ |
||||
#define EE_VIRTUALADDRESS_TYPE uint64_t /*!< Type of Virtual Address */ |
||||
#define EE_VIRTUALADDRESS_SHIFT 0U /*!< Bits Shifting to get Virtual Address in element */ |
||||
#define EE_CRC_TYPE uint16_t /*!< Type of Crc */ |
||||
#define EE_CRC_SHIFT 16U /*!< Bits Shifting to get Crc in element */ |
||||
#define EE_DATA_TYPE uint64_t /*!< Type of Data */ |
||||
#define EE_DATA_SHIFT 32U /*!< Bits Shifting to get Data value in element */ |
||||
#define EE_MASK_VIRTUALADDRESS (uint64_t)0x000000000000FFFFU |
||||
#define EE_MASK_CRC (uint64_t)0x00000000FFFF0000U |
||||
#define EE_MASK_DATA (uint64_t)0xFFFFFFFFFFFFFFFFU |
||||
#define EE_MASK_FULL (uint64_t)0xFFFFFFFFFFFFFFFFU |
||||
|
||||
#define SECURE_FEATURE /*!< Informs the driver about the security features of the flash interface */ |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
EE_Status FI_WriteDoubleWord(uint32_t Address, uint64_t* Data, EE_Write_type Write_type); |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address); |
||||
EE_Status FI_CheckBankConfig(void); |
||||
void FI_CacheFlush(void); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __FLASH_INTERFACE_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,375 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32WB/flash_interface.c |
||||
* @author MCD Application Team |
||||
* @brief This file provides all the EEPROM emulation flash interface functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 "eeprom_emul.h" |
||||
#include "flash_interface.h" |
||||
#include "stm32wbxx_nucleo.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
#ifdef DUALCORE_FLASH_SHARING |
||||
#define HSEM_PROCESS_1 12U /* Number taken randomly to identify the process locking a semaphore in the driver context */ |
||||
#endif |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
#ifdef DUALCORE_FLASH_SHARING |
||||
/**
|
||||
* @brief Write a double word at the given address in Flash |
||||
* @param Address Where to write |
||||
* @param Data What to write |
||||
* @param Write_type Type of writing on going (see EE_Write_type) |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE_WRITE_ERROR: if an error occurs |
||||
* - EE_FLASH_USED: flash currently used by CPU2 |
||||
*/ |
||||
EE_Status FI_WriteDoubleWord(uint32_t Address, uint64_t Data, EE_Write_type Write_type) |
||||
{ |
||||
EE_Status ee_status = EE_OK; |
||||
|
||||
/* We enter a critical section */ |
||||
UTILS_ENTER_CRITICAL_SECTION(); |
||||
|
||||
/* When the ongoing writing operation is a direct one (no transfer is required,
|
||||
we are not in init process, and we do not write the state of a page) */ |
||||
if(Write_type == EE_SIMPLE_WRITE) |
||||
{ |
||||
/* Wait for the semaphore to be free */ |
||||
while( HAL_HSEM_IsSemTaken(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID) ); |
||||
|
||||
/* Take the HW 7 semaphore */
|
||||
if(HAL_HSEM_Take(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1) == HAL_OK) |
||||
{
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, Data) != HAL_OK) |
||||
{ |
||||
HAL_HSEM_Release(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1); |
||||
ee_status = EE_WRITE_ERROR; |
||||
}
|
||||
/* Release the HW Semaphore */
|
||||
HAL_HSEM_Release(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1); |
||||
ee_status = EE_OK; |
||||
} |
||||
else |
||||
{
|
||||
/* If flash is used by CPU2, the semaphore release interrupt is activated so as to raise a notification when
|
||||
the semaphore will be unlocked (user can do other operations while waiting) */ |
||||
HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID)); |
||||
ee_status = EE_FLASH_USED; |
||||
} |
||||
} |
||||
/* This is when the function call comes from a writing operation other than a direct one */ |
||||
else
|
||||
{
|
||||
/* Wait for the semaphore 7 to be free and take it when it is */ |
||||
while(HAL_HSEM_Take(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1) != HAL_OK) |
||||
{ |
||||
while( HAL_HSEM_IsSemTaken(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID) ) ; |
||||
} |
||||
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, Data) != HAL_OK) |
||||
{ |
||||
HAL_HSEM_Release(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1); |
||||
ee_status = EE_WRITE_ERROR; |
||||
}
|
||||
/* Release the HW Semaphore */
|
||||
HAL_HSEM_Release(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1); |
||||
ee_status = EE_OK; |
||||
} |
||||
|
||||
/* We exit the critical section */ |
||||
UTILS_EXIT_CRITICAL_SECTION(); |
||||
return ee_status; |
||||
} |
||||
#else |
||||
/**
|
||||
* @brief Write a double word at the given address in Flash |
||||
* @param Address Where to write |
||||
* @param Data What to write |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE_WRITE_ERROR: if an error occurs |
||||
*/ |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data) |
||||
{ |
||||
return HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, Data);
|
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @brief Erase a page in polling mode |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
|
||||
#ifdef DUALCORE_FLASH_SHARING |
||||
|
||||
/* Wait for last operation to be completed */ |
||||
while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) ; |
||||
|
||||
/* Because we want to share flash between CPU1 and 2, we erase each page individually
|
||||
* and we take then release the associated semaphore for each page erasings. |
||||
* By doing this, we allow CPU2 to do urgent works between page erasings. */ |
||||
for (uint32_t index = Page; index < (Page + NbPages); index++) |
||||
{ |
||||
/* We enter a critical section */ |
||||
UTILS_ENTER_CRITICAL_SECTION(); |
||||
|
||||
/* Wait for the semaphore 7 to be free and take it when it is */ |
||||
while(HAL_HSEM_Take(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1) != HAL_OK) |
||||
{ |
||||
while( HAL_HSEM_IsSemTaken(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID) ) ; |
||||
} |
||||
|
||||
/* Start erase page */ |
||||
FLASH_PageErase(index); |
||||
/* Release the HW Semaphore */
|
||||
HAL_HSEM_Release(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1);
|
||||
/* We exit the critical section */ |
||||
UTILS_EXIT_CRITICAL_SECTION(); |
||||
|
||||
/* Wait for last operation to be completed */ |
||||
while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) ; |
||||
} |
||||
|
||||
/* If operation is completed or interrupted, disable the Page Erase Bit */ |
||||
CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB)); |
||||
|
||||
/* Flush the caches to be sure of the data consistency */ |
||||
/* Flush instruction cache */ |
||||
if (READ_BIT(FLASH->ACR, FLASH_ACR_ICEN) == FLASH_ACR_ICEN) |
||||
{ |
||||
/* Disable instruction cache */ |
||||
__HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); |
||||
/* Reset instruction cache */ |
||||
__HAL_FLASH_INSTRUCTION_CACHE_RESET(); |
||||
/* Enable instruction cache */ |
||||
__HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); |
||||
} |
||||
|
||||
/* Flush data cache */ |
||||
if (READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) == FLASH_ACR_DCEN) |
||||
{ |
||||
/* Disable data cache */ |
||||
__HAL_FLASH_DATA_CACHE_DISABLE(); |
||||
/* Reset data cache */ |
||||
__HAL_FLASH_DATA_CACHE_RESET(); |
||||
/* Enable data cache */ |
||||
__HAL_FLASH_DATA_CACHE_ENABLE(); |
||||
} |
||||
|
||||
#else |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
uint32_t page_error = 0U; |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase(&s_eraseinit, &page_error) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
#endif |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page with interrupt enabled |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
|
||||
#ifdef DUALCORE_FLASH_SHARING |
||||
/* We enter a critical section */ |
||||
UTILS_ENTER_CRITICAL_SECTION(); |
||||
|
||||
/* Wait for the semaphore 7 to be free and take it when it is */ |
||||
while(HAL_HSEM_Take(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1) != HAL_OK) |
||||
{ |
||||
while( HAL_HSEM_IsSemTaken(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID) ) ; |
||||
} |
||||
#endif |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase_IT(&s_eraseinit) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
|
||||
#ifdef DUALCORE_FLASH_SHARING |
||||
/* Release the HW Semaphore */
|
||||
HAL_HSEM_Release(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1); |
||||
/* We exit the critical section */ |
||||
UTILS_EXIT_CRITICAL_SECTION(); |
||||
#endif |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Flush the caches if needed to keep coherency when the flash content is modified |
||||
*/ |
||||
void FI_CacheFlush() |
||||
{ |
||||
/* To keep its coherency, flush the D-Cache: its content is not updated after a flash erase. */ |
||||
__HAL_FLASH_DATA_CACHE_DISABLE(); |
||||
__HAL_FLASH_DATA_CACHE_RESET(); |
||||
__HAL_FLASH_DATA_CACHE_ENABLE(); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Delete corrupted Flash address, can be called from NMI. No Timeout. |
||||
* @param Address Address of the FLASH Memory to delete |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
|
||||
/* Set FLASH Programmation bit */ |
||||
SET_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
#ifdef DUALCORE_FLASH_SHARING |
||||
/* We enter a critical section */ |
||||
UTILS_ENTER_CRITICAL_SECTION(); |
||||
|
||||
/* Wait for the semaphore 7 to be free and take it when it is */ |
||||
while(HAL_HSEM_Take(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1) != HAL_OK) |
||||
{ |
||||
while( HAL_HSEM_IsSemTaken(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID) ) ; |
||||
} |
||||
#endif |
||||
|
||||
/* Program double word of value 0 */ |
||||
*(__IO uint32_t*)(Address) = (uint32_t)0U; |
||||
*(__IO uint32_t*)(Address+4U) = (uint32_t)0U; |
||||
|
||||
#ifdef DUALCORE_FLASH_SHARING |
||||
/* Release the HW Semaphore */
|
||||
HAL_HSEM_Release(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, HSEM_PROCESS_1);
|
||||
/* We exit the critical section */ |
||||
UTILS_EXIT_CRITICAL_SECTION(); |
||||
#endif |
||||
|
||||
/* Wait programmation completion */ |
||||
while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) ; |
||||
|
||||
/* Check if error occured */ |
||||
if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PROGERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR))) |
||||
{ |
||||
status = EE_DELETE_ERROR; |
||||
} |
||||
|
||||
/* Check FLASH End of Operation flag */ |
||||
if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) |
||||
{ |
||||
/* Clear FLASH End of Operation pending bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); |
||||
} |
||||
|
||||
/* Clear FLASH Programmation bit */ |
||||
CLEAR_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
/* Clear FLASH ECCD bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ECCD); |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Check if the configuration is 128-bits bank or 2*64-bits bank |
||||
* @param None |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_CheckBankConfig(void) |
||||
{ |
||||
#if defined (FLASH_OPTR_DBANK) |
||||
FLASH_OBProgramInitTypeDef sOBCfg; |
||||
EE_Status status; |
||||
|
||||
/* Request the Option Byte configuration :
|
||||
- User and RDP level are always returned |
||||
- WRP and PCROP are not requested */ |
||||
sOBCfg.WRPArea = 0xFF; |
||||
sOBCfg.PCROPConfig = 0xFF; |
||||
HAL_FLASHEx_OBGetConfig(&sOBCfg); |
||||
|
||||
/* Check the value of the DBANK user option byte */ |
||||
if ((sOBCfg.USERConfig & OB_DBANK_64_BITS) != 0) |
||||
{ |
||||
status = EE_OK; |
||||
} |
||||
else |
||||
{ |
||||
status = EE_INVALID_BANK_CFG; |
||||
} |
||||
|
||||
return status; |
||||
#else |
||||
/* No feature 128-bits single bank, so always 64-bits dual bank */ |
||||
return EE_OK; |
||||
#endif |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,142 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32WB/flash_interface.h |
||||
* @author MCD Application Team |
||||
* @brief This file contains all the functions prototypes for the EEPROM |
||||
* emulation flash interface. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __FLASH_INTERFACE_H |
||||
#define __FLASH_INTERFACE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "eeprom_emul.h" |
||||
#include "stm32wbxx_hal.h" |
||||
#include "stm32wbxx_ll_crc.h" |
||||
#include "stm32wbxx_ll_bus.h" |
||||
#ifdef DUALCORE_FLASH_SHARING |
||||
#include "utilities_conf.h" |
||||
#include "hw_conf.h" |
||||
#include "shci.h" |
||||
#endif |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/* Private types -------------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup Private_Other_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
#define BANK_SIZE FLASH_BANK_SIZE /*!< Alias to FLASH_BANK_SIZE definition from HAL STM32L4 */ |
||||
#define EE_ACCESS_32BITS /*!< Enable EEPROM 32bits R/W functions, only valid for flash allowing 64bits access*/ |
||||
|
||||
/* Page state header */ |
||||
#define EE_PAGESTAT_ERASED (uint64_t)0xFFFFFFFFFFFFFFFFU /*!< State saved in 1st,2nd,3rd,4th data type of page header */ |
||||
#define EE_PAGESTAT_RECEIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 1st data type of page header */ |
||||
#define EE_PAGESTAT_ACTIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 2nd data type of page header */ |
||||
#define EE_PAGESTAT_VALID (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 3rd data type of page header */ |
||||
#define EE_PAGESTAT_ERASING (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 4th data type of page header */ |
||||
|
||||
/* Description of the 8 Bytes (64 bits) element in flash */ |
||||
/* Bit: 63 32 31 16 15 0 */ |
||||
/* <--- Data Value -----> <-unused-> <-VirtAddr-> */ |
||||
#define EE_ELEMENT_SIZE 8U /*!< Size of element in Bytes */ |
||||
#define EE_ELEMENT_TYPE uint64_t /*!< Type of element */ |
||||
#define EE_VIRTUALADDRESS_TYPE uint16_t /*!< Type of Virtual Address */ |
||||
#define EE_VIRTUALADDRESS_SHIFT 0U /*!< Bits Shifting to get Virtual Address in element */ |
||||
#define EE_CRC_TYPE uint16_t /*!< Type of Crc */ |
||||
#define EE_CRC_SHIFT 16U /*!< Bits Shifting to get Crc in element */ |
||||
#define EE_DATA_TYPE uint32_t /*!< Type of Data */ |
||||
#define EE_DATA_SHIFT 32U /*!< Bits Shifting to get Data value in element */ |
||||
#define EE_MASK_VIRTUALADDRESS (uint64_t)0x000000000000FFFFU |
||||
#define EE_MASK_CRC (uint64_t)0x00000000FFFF0000U |
||||
#define EE_MASK_DATA (uint64_t)0xFFFFFFFF00000000U |
||||
#define EE_MASK_FULL (uint64_t)0xFFFFFFFFFFFFFFFFU |
||||
|
||||
#ifdef DUALCORE_FLASH_SHARING |
||||
#define EE_SEM_WAIT_TIMEOUT 5000U /*!< Take semaphore attempts timeout, 5s */ |
||||
#endif |
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup Macros_Flash Macros to access flash
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
#ifdef DUALCORE_FLASH_SHARING |
||||
EE_Status FI_WriteDoubleWord(uint32_t Address, uint64_t Data, EE_Write_type Write_type); |
||||
#else |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data); |
||||
#endif |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address); |
||||
EE_Status FI_CheckBankConfig(void); |
||||
void FI_CacheFlush(void); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __FLASH_INTERFACE_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,207 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32WL/flash_interface.c |
||||
* @author MCD Application Team |
||||
* @brief This file provides all the EEPROM emulation flash interface functions. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 "eeprom_emul.h" |
||||
#include "flash_interface.h" |
||||
#include "stm32wlxx_nucleo.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Private typedef -----------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/* Private variables ---------------------------------------------------------*/ |
||||
/* Private function prototypes -----------------------------------------------*/ |
||||
/* Exported functions --------------------------------------------------------*/ |
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @brief Write a double word at the given address in Flash |
||||
* @param Address Where to write |
||||
* @param Data What to write |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE_WRITE_ERROR: if an error occurs |
||||
*/ |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data) |
||||
{ |
||||
return HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, Data);
|
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page in polling mode |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
uint32_t page_error = 0U; |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page; |
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase(&s_eraseinit, &page_error) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Erase a page with interrupt enabled |
||||
* @param Page Page number |
||||
* @param NbPages Number of pages to erase |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
FLASH_EraseInitTypeDef s_eraseinit; |
||||
|
||||
s_eraseinit.TypeErase = FLASH_TYPEERASE_PAGES; |
||||
s_eraseinit.NbPages = NbPages; |
||||
s_eraseinit.Page = Page;
|
||||
|
||||
/* Erase the Page: Set Page status to ERASED status */ |
||||
if (HAL_FLASHEx_Erase_IT(&s_eraseinit) != HAL_OK) |
||||
{ |
||||
status = EE_ERASE_ERROR; |
||||
} |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Flush the caches if needed to keep coherency when the flash content is modified |
||||
*/ |
||||
void FI_CacheFlush() |
||||
{ |
||||
/* To keep its coherency, flush the D-Cache: its content is not updated after a flash erase. */ |
||||
__HAL_FLASH_DATA_CACHE_DISABLE(); |
||||
__HAL_FLASH_DATA_CACHE_RESET(); |
||||
__HAL_FLASH_DATA_CACHE_ENABLE(); |
||||
} |
||||
|
||||
/**
|
||||
* @brief Delete corrupted Flash address, can be called from NMI. No Timeout. |
||||
* @param Address Address of the FLASH Memory to delete |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address) |
||||
{ |
||||
EE_Status status = EE_OK; |
||||
|
||||
/* Set FLASH Programmation bit */ |
||||
SET_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
/* Program double word of value 0 */ |
||||
*(__IO uint32_t*)(Address) = (uint32_t)0U; |
||||
*(__IO uint32_t*)(Address+4U) = (uint32_t)0U; |
||||
|
||||
/* Wait programmation completion */ |
||||
while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) ; |
||||
|
||||
/* Check if error occured */ |
||||
if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PROGERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)) || |
||||
(__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR))) |
||||
{ |
||||
status = EE_DELETE_ERROR; |
||||
} |
||||
|
||||
/* Check FLASH End of Operation flag */ |
||||
if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) |
||||
{ |
||||
/* Clear FLASH End of Operation pending bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); |
||||
} |
||||
|
||||
/* Clear FLASH Programmation bit */ |
||||
CLEAR_BIT(FLASH->CR, FLASH_CR_PG); |
||||
|
||||
/* Clear FLASH ECCD bit */ |
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ECCD); |
||||
|
||||
return status; |
||||
} |
||||
|
||||
/**
|
||||
* @brief Check if the configuration is 128-bits bank or 2*64-bits bank |
||||
* @param None |
||||
* @retval EE_Status |
||||
* - EE_OK: on success |
||||
* - EE error code: if an error occurs |
||||
*/ |
||||
EE_Status FI_CheckBankConfig(void) |
||||
{ |
||||
#if defined (FLASH_OPTR_DBANK) |
||||
FLASH_OBProgramInitTypeDef sOBCfg; |
||||
EE_Status status; |
||||
|
||||
/* Request the Option Byte configuration :
|
||||
- User and RDP level are always returned |
||||
- WRP and PCROP are not requested */ |
||||
sOBCfg.WRPArea = 0xFF; |
||||
sOBCfg.PCROPConfig = 0xFF; |
||||
HAL_FLASHEx_OBGetConfig(&sOBCfg); |
||||
|
||||
/* Check the value of the DBANK user option byte */ |
||||
if ((sOBCfg.USERConfig & OB_DBANK_64_BITS) != 0) |
||||
{ |
||||
status = EE_OK; |
||||
} |
||||
else |
||||
{ |
||||
status = EE_INVALID_BANK_CFG; |
||||
} |
||||
|
||||
return status; |
||||
#else |
||||
/* No feature 128-bits single bank, so always 64-bits dual bank */ |
||||
return EE_OK; |
||||
#endif |
||||
} |
||||
|
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
@ -1,134 +0,0 @@ |
||||
/**
|
||||
****************************************************************************** |
||||
* @file EEPROM_Emul/Porting/STM32WL/flash_interface.h |
||||
* @author MCD Application Team |
||||
* @brief This file contains all the functions prototypes for the EEPROM |
||||
* emulation flash interface. |
||||
****************************************************************************** |
||||
* @attention |
||||
* |
||||
* <h2><center>© Copyright (c) 2020 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 |
||||
* |
||||
****************************************************************************** |
||||
*/ |
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
||||
#ifndef __FLASH_INTERFACE_H |
||||
#define __FLASH_INTERFACE_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
/* Includes ------------------------------------------------------------------*/ |
||||
#include "eeprom_emul.h" |
||||
#include "stm32wlxx_hal.h" |
||||
#include "stm32wlxx_ll_crc.h" |
||||
#include "stm32wlxx_ll_bus.h" |
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{ |
||||
*/ |
||||
|
||||
/* Exported types ------------------------------------------------------------*/ |
||||
/* Exported macro ------------------------------------------------------------*/ |
||||
/* Exported functions ------------------------------------------------------- */ |
||||
|
||||
/* Private types -------------------------------------------------------------*/ |
||||
/* Private constants ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @addtogroup Private_Other_Constants
|
||||
* @{ |
||||
*/ |
||||
|
||||
#define BANK_SIZE FLASH_BANK_SIZE /*!< Alias to FLASH_BANK_SIZE definition from HAL STM32L4 */ |
||||
#define EE_ACCESS_32BITS /*!< Enable EEPROM 32bits R/W functions, only valid for flash allowing 64bits access*/ |
||||
|
||||
/* Page state header */ |
||||
#define EE_PAGESTAT_ERASED (uint64_t)0xFFFFFFFFFFFFFFFFU /*!< State saved in 1st,2nd,3rd,4th data type of page header */ |
||||
#define EE_PAGESTAT_RECEIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 1st data type of page header */ |
||||
#define EE_PAGESTAT_ACTIVE (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 2nd data type of page header */ |
||||
#define EE_PAGESTAT_VALID (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 3rd data type of page header */ |
||||
#define EE_PAGESTAT_ERASING (uint64_t)0xAAAAAAAAAAAAAAAAU /*!< State saved in 4th data type of page header */ |
||||
|
||||
/* Description of the 8 Bytes (64 bits) element in flash */ |
||||
/* Bit: 63 32 31 16 15 0 */ |
||||
/* <--- Data Value -----> <-unused-> <-VirtAddr-> */ |
||||
#define EE_ELEMENT_SIZE 8U /*!< Size of element in Bytes */ |
||||
#define EE_ELEMENT_TYPE uint64_t /*!< Type of element */ |
||||
#define EE_VIRTUALADDRESS_TYPE uint16_t /*!< Type of Virtual Address */ |
||||
#define EE_VIRTUALADDRESS_SHIFT 0U /*!< Bits Shifting to get Virtual Address in element */ |
||||
#define EE_CRC_TYPE uint16_t /*!< Type of Crc */ |
||||
#define EE_CRC_SHIFT 16U /*!< Bits Shifting to get Crc in element */ |
||||
#define EE_DATA_TYPE uint32_t /*!< Type of Data */ |
||||
#define EE_DATA_SHIFT 32U /*!< Bits Shifting to get Data value in element */ |
||||
#define EE_MASK_VIRTUALADDRESS (uint64_t)0x000000000000FFFFU |
||||
#define EE_MASK_CRC (uint64_t)0x00000000FFFF0000U |
||||
#define EE_MASK_DATA (uint64_t)0xFFFFFFFF00000000U |
||||
#define EE_MASK_FULL (uint64_t)0xFFFFFFFFFFFFFFFFU |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private macro -------------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Macros
|
||||
* @{ |
||||
*/ |
||||
|
||||
/** @defgroup Macros_Flash Macros to access flash
|
||||
* @{ |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
/* Private functions ---------------------------------------------------------*/ |
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{ |
||||
*/ |
||||
#ifdef DUALCORE_FLASH_SHARING |
||||
EE_Status FI_WriteDoubleWord(uint32_t Address, uint64_t Data, EE_Write_type Write_type); |
||||
#else |
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data); |
||||
#endif |
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_PageErase_IT(uint32_t Page, uint16_t NbPages); |
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address); |
||||
EE_Status FI_CheckBankConfig(void); |
||||
void FI_CacheFlush(void); |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
/**
|
||||
* @} |
||||
*/ |
||||
|
||||
#endif /* __FLASH_INTERFACE_H */ |
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
Loading…
Reference in new issue