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