implement EEPROM emulation
This commit is contained in:
+21
-19
File diff suppressed because one or more lines are too long
+26
-22
@@ -49,19 +49,20 @@ KeepUserPlacement=false
|
||||
Mcu.CPN=STM32F103C8T6
|
||||
Mcu.Family=STM32F1
|
||||
Mcu.IP0=ADC1
|
||||
Mcu.IP1=DMA
|
||||
Mcu.IP10=TIM3
|
||||
Mcu.IP11=TIM4
|
||||
Mcu.IP12=USART1
|
||||
Mcu.IP2=FREERTOS
|
||||
Mcu.IP3=IWDG
|
||||
Mcu.IP4=NVIC
|
||||
Mcu.IP5=RCC
|
||||
Mcu.IP6=SPI2
|
||||
Mcu.IP7=SYS
|
||||
Mcu.IP8=TIM1
|
||||
Mcu.IP9=TIM2
|
||||
Mcu.IPNb=13
|
||||
Mcu.IP1=CRC
|
||||
Mcu.IP10=TIM2
|
||||
Mcu.IP11=TIM3
|
||||
Mcu.IP12=TIM4
|
||||
Mcu.IP13=USART1
|
||||
Mcu.IP2=DMA
|
||||
Mcu.IP3=FREERTOS
|
||||
Mcu.IP4=IWDG
|
||||
Mcu.IP5=NVIC
|
||||
Mcu.IP6=RCC
|
||||
Mcu.IP7=SPI2
|
||||
Mcu.IP8=SYS
|
||||
Mcu.IP9=TIM1
|
||||
Mcu.IPNb=14
|
||||
Mcu.Name=STM32F103C(8-B)Tx
|
||||
Mcu.Package=LQFP48
|
||||
Mcu.Pin0=PC13-TAMPER-RTC
|
||||
@@ -75,14 +76,15 @@ Mcu.Pin15=PB7
|
||||
Mcu.Pin16=PB8
|
||||
Mcu.Pin17=VP_ADC1_TempSens_Input
|
||||
Mcu.Pin18=VP_ADC1_Vref_Input
|
||||
Mcu.Pin19=VP_FREERTOS_VS_CMSIS_V2
|
||||
Mcu.Pin19=VP_CRC_VS_CRC
|
||||
Mcu.Pin2=PA1
|
||||
Mcu.Pin20=VP_IWDG_VS_IWDG
|
||||
Mcu.Pin21=VP_SYS_VS_Systick
|
||||
Mcu.Pin22=VP_TIM1_VS_ClockSourceINT
|
||||
Mcu.Pin23=VP_TIM1_VS_no_output1
|
||||
Mcu.Pin24=VP_TIM2_VS_ClockSourceINT
|
||||
Mcu.Pin25=VP_TIM3_VS_ClockSourceINT
|
||||
Mcu.Pin20=VP_FREERTOS_VS_CMSIS_V2
|
||||
Mcu.Pin21=VP_IWDG_VS_IWDG
|
||||
Mcu.Pin22=VP_SYS_VS_Systick
|
||||
Mcu.Pin23=VP_TIM1_VS_ClockSourceINT
|
||||
Mcu.Pin24=VP_TIM1_VS_no_output1
|
||||
Mcu.Pin25=VP_TIM2_VS_ClockSourceINT
|
||||
Mcu.Pin26=VP_TIM3_VS_ClockSourceINT
|
||||
Mcu.Pin3=PA6
|
||||
Mcu.Pin4=PB0
|
||||
Mcu.Pin5=PB1
|
||||
@@ -90,7 +92,7 @@ Mcu.Pin6=PB10
|
||||
Mcu.Pin7=PB13
|
||||
Mcu.Pin8=PB15
|
||||
Mcu.Pin9=PA9
|
||||
Mcu.PinsNb=26
|
||||
Mcu.PinsNb=27
|
||||
Mcu.ThirdPartyNb=0
|
||||
Mcu.UserConstants=
|
||||
Mcu.UserName=STM32F103C8Tx
|
||||
@@ -202,7 +204,7 @@ ProjectManager.StackSize=0x400
|
||||
ProjectManager.TargetToolchain=Makefile
|
||||
ProjectManager.ToolChainLocation=
|
||||
ProjectManager.UnderRoot=false
|
||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-LL-false,2-MX_GPIO_Init-GPIO-false-LL-true,3-MX_IWDG_Init-IWDG-false-LL-true,4-MX_USART1_UART_Init-USART1-false-LL-true,5-MX_ADC1_Init-ADC1-false-LL-true,6-MX_DMA_Init-DMA-false-LL-true,7-MX_TIM4_Init-TIM4-false-LL-true,8-MX_TIM2_Init-TIM2-false-LL-true,9-MX_TIM3_Init-TIM3-false-LL-true,10-MX_SPI2_Init-SPI2-false-LL-true,11-MX_TIM1_Init-TIM1-false-LL-true
|
||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-LL-false,2-MX_GPIO_Init-GPIO-false-LL-true,3-MX_IWDG_Init-IWDG-false-LL-true,4-MX_USART1_UART_Init-USART1-false-LL-true,5-MX_ADC1_Init-ADC1-false-LL-true,6-MX_DMA_Init-DMA-false-LL-true,7-MX_TIM4_Init-TIM4-false-LL-true,8-MX_TIM2_Init-TIM2-false-LL-true,9-MX_TIM3_Init-TIM3-false-LL-true,10-MX_SPI2_Init-SPI2-false-LL-true,11-MX_TIM1_Init-TIM1-false-LL-true,12-MX_CRC_Init-CRC-false-LL-true
|
||||
RCC.ADCFreqValue=8000000
|
||||
RCC.ADCPresc=RCC_ADCPCLK2_DIV8
|
||||
RCC.AHBFreq_Value=64000000
|
||||
@@ -271,6 +273,8 @@ VP_ADC1_TempSens_Input.Mode=IN-TempSens
|
||||
VP_ADC1_TempSens_Input.Signal=ADC1_TempSens_Input
|
||||
VP_ADC1_Vref_Input.Mode=IN-Vrefint
|
||||
VP_ADC1_Vref_Input.Signal=ADC1_Vref_Input
|
||||
VP_CRC_VS_CRC.Mode=CRC_Activate
|
||||
VP_CRC_VS_CRC.Signal=CRC_VS_CRC
|
||||
VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2
|
||||
VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2
|
||||
VP_IWDG_VS_IWDG.Mode=IWDG_Activate
|
||||
|
||||
@@ -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__ */
|
||||
|
||||
@@ -29,6 +29,7 @@ extern "C" {
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
|
||||
#include "stm32f1xx_ll_adc.h"
|
||||
#include "stm32f1xx_ll_crc.h"
|
||||
#include "stm32f1xx_ll_dma.h"
|
||||
#include "stm32f1xx_ll_iwdg.h"
|
||||
#include "stm32f1xx_ll_rcc.h"
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "app_buzzer.h"
|
||||
#include "app_heater.h"
|
||||
#include "cmsis_os2.h"
|
||||
#include "eeprom_emul.h"
|
||||
|
||||
static struct App {
|
||||
float oven_temp;
|
||||
@@ -84,6 +85,28 @@ static void redraw_display() {
|
||||
void app_task_main(void *argument)
|
||||
{
|
||||
PUTS("Main task\r\n");
|
||||
|
||||
/* test the persistent storage */
|
||||
EE_Init(EE_CONDITIONAL_ERASE);
|
||||
|
||||
uint32_t cnt = 0;
|
||||
EE_Status eest = EE_ReadVariable32bits(1, &cnt);
|
||||
|
||||
PRINTF("EE rd status %d, cnt %d\r\n", eest, cnt);
|
||||
|
||||
cnt++;
|
||||
|
||||
eest = EE_WriteVariable32bits(1, cnt);
|
||||
PRINTF("EE wr status %d\r\n", eest);
|
||||
if (eest == EE_CLEANUP_REQUIRED) {
|
||||
eest = EE_CleanUp();
|
||||
PRINTF("EE cleanup status %d\r\n", eest);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
app_analog_init();
|
||||
app_buzzer_init();
|
||||
app_knob_init();
|
||||
|
||||
@@ -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 */
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "main.h"
|
||||
#include "cmsis_os.h"
|
||||
#include "adc.h"
|
||||
#include "crc.h"
|
||||
#include "dma.h"
|
||||
#include "iwdg.h"
|
||||
#include "spi.h"
|
||||
@@ -119,6 +120,7 @@ int main(void)
|
||||
MX_TIM3_Init();
|
||||
MX_SPI2_Init();
|
||||
MX_TIM1_Init();
|
||||
MX_CRC_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
PUTS("Start.\r\n");
|
||||
|
||||
@@ -62,6 +62,8 @@
|
||||
|
||||
/* USER CODE BEGIN EV */
|
||||
|
||||
bool EE_NMI_Callback();
|
||||
|
||||
/* USER CODE END EV */
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -74,6 +76,10 @@ void NMI_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN NonMaskableInt_IRQn 0 */
|
||||
|
||||
if (EE_NMI_Callback()) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* USER CODE END NonMaskableInt_IRQn 0 */
|
||||
/* USER CODE BEGIN NonMaskableInt_IRQn 1 */
|
||||
while (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****/
|
||||
|
||||
+837
-1533
File diff suppressed because it is too large
Load Diff
@@ -23,29 +23,23 @@
|
||||
#define __EEPROM_EMUL_H
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#define __IO volatile
|
||||
#define __weak __attribute__((weak))
|
||||
|
||||
#include "eeprom_emul_conf.h"
|
||||
#include "eeprom_emul_types.h"
|
||||
#include "flash_interface.h"
|
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Private constants ---------------------------------------------------------*/
|
||||
/** @defgroup EEPROM_Private_Constants EEPROM Private Constants
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup Private_Other_Constants Private Other Constants
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Page definitions */
|
||||
#define PAGE_SIZE FLASH_PAGE_SIZE /*!< Page size */
|
||||
#define PAGE_HEADER_SIZE EE_ELEMENT_SIZE * 4U /*!< Page Header is 4 elements to save page state */
|
||||
#define PAGE_HEADER_SIZE (EE_ELEMENT_SIZE * 4U) /*!< Page Header is 4 elements to save page state */
|
||||
#define NB_MAX_ELEMENTS_BY_PAGE ((PAGE_SIZE - PAGE_HEADER_SIZE) / EE_ELEMENT_SIZE) /*!< Max number of elements by page */
|
||||
#define PAGES_NUMBER (((((NB_OF_VARIABLES + NB_MAX_ELEMENTS_BY_PAGE) / NB_MAX_ELEMENTS_BY_PAGE) * 2U) * CYCLES_NUMBER) + GUARD_PAGES_NUMBER)
|
||||
/*!< Number of consecutives pages used by the application */
|
||||
/*!< Number of consecutives pages used by the application */
|
||||
#define NB_MAX_WRITTEN_ELEMENTS ((NB_MAX_ELEMENTS_BY_PAGE * PAGES_NUMBER) / 2U) /*!< Max number of elements written before triggering pages transfer */
|
||||
#define START_PAGE PAGE(START_PAGE_ADDRESS) /*!< Page index of the 1st page used for EEPROM emul, in the bank */
|
||||
#define END_EEPROM_ADDRESS (START_PAGE_ADDRESS + (PAGES_NUMBER * FLASH_PAGE_SIZE) - 1) /*!< Last address of EEPROM emulation flash pages */
|
||||
@@ -53,89 +47,44 @@
|
||||
/* No page define */
|
||||
#define EE_NO_PAGE_FOUND ((uint32_t)0xFFFFFFFFU)
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
/** @defgroup EEPROM_Private_Macros EEPROM Private Macros
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup Macros_Pages Macros to manipulate pages
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Macros to manipulate pages */
|
||||
#ifdef SECURE_FEATURES
|
||||
#define PAGE_ADDRESS(__PAGE__) (uint32_t)(FLASH_BASE_NS + (__PAGE__) * PAGE_SIZE + ((START_PAGE_ADDRESS - FLASH_BASE_NS) / BANK_SIZE) * BANK_SIZE) /*!< Get page address from page index */
|
||||
#define PAGE(__ADDRESS__) (uint32_t)((((__ADDRESS__) - FLASH_BASE_NS) % BANK_SIZE) / FLASH_PAGE_SIZE) /*!< Get page index from page address */
|
||||
#else
|
||||
#define PAGE_ADDRESS(__PAGE__) (uint32_t)(FLASH_BASE + (__PAGE__) * PAGE_SIZE + ((START_PAGE_ADDRESS - FLASH_BASE) / BANK_SIZE) * BANK_SIZE) /*!< Get page address from page index */
|
||||
#define PAGE(__ADDRESS__) (uint32_t)((((__ADDRESS__) - FLASH_BASE) % BANK_SIZE) / FLASH_PAGE_SIZE) /*!< Get page index from page address */
|
||||
#endif
|
||||
#define PAGE_ADDRESS(__PAGE__) (uint32_t)(FLASH_BASE + (__PAGE__) * PAGE_SIZE + ((START_PAGE_ADDRESS - FLASH_BASE) / BANK_SIZE) * BANK_SIZE) /*!< Get page address from page index */
|
||||
#define PAGE(__ADDRESS__) (uint32_t)((((__ADDRESS__) - FLASH_BASE) % BANK_SIZE) / FLASH_PAGE_SIZE) /*!< Get page index from page address */
|
||||
#define PREVIOUS_PAGE(__PAGE__) (uint32_t)((((__PAGE__) - START_PAGE - 1U + PAGES_NUMBER) % PAGES_NUMBER) + START_PAGE) /*!< Get page index of previous page, among circular page list */
|
||||
#define FOLLOWING_PAGE(__PAGE__) (uint32_t)((((__PAGE__) - START_PAGE + 1U) % PAGES_NUMBER) + START_PAGE) /*!< Get page index of following page, among circular page list */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @defgroup Macros_Elements Macros to manipulate elements
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Macros to manipulate elements */
|
||||
#define EE_VIRTUALADDRESS_VALUE(__ELEMENT__) (EE_VIRTUALADDRESS_TYPE)((__ELEMENT__) & EE_MASK_VIRTUALADDRESS) /*!< Get virtual address value from element value */
|
||||
#define EE_DATA_VALUE(__ELEMENT__) (EE_DATA_TYPE)(((__ELEMENT__) & EE_MASK_DATA) >> EE_DATA_SHIFT) /*!< Get Data value from element value */
|
||||
#define EE_CRC_VALUE(__ELEMENT__) (EE_CRC_TYPE)(((__ELEMENT__) & EE_MASK_CRC) >> EE_CRC_SHIFT) /*!< Get Crc value from element value */
|
||||
#define EE_ELEMENT_VALUE(__VIRTADDR__,__DATA__,__CRC__) (((EE_ELEMENT_TYPE)(__DATA__) << EE_DATA_SHIFT) | (__CRC__) << EE_CRC_SHIFT | (__VIRTADDR__)) /*!< Get element value from virtual addr, data and crc values */
|
||||
#define EE_ELEMENT_VALUE(__VIRTADDR__, __DATA__, __CRC__) (((EE_ELEMENT_TYPE)(__DATA__) << EE_DATA_SHIFT) | (__CRC__) << EE_CRC_SHIFT | (__VIRTADDR__)) /*!< Get element value from virtual addr, data and crc values */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
/** @defgroup EEPROM_Exported_Functions EEPROM Exported Functions
|
||||
* @{
|
||||
*/
|
||||
EE_Status EE_Format(EE_Erase_type EraseType);
|
||||
|
||||
EE_Status EE_Init(EE_Erase_type EraseType);
|
||||
#if defined(EE_ACCESS_32BITS)
|
||||
EE_Status EE_ReadVariable32bits(uint16_t VirtAddress, uint32_t* pData);
|
||||
|
||||
EE_Status EE_ReadVariable32bits(uint16_t VirtAddress, uint32_t *pData);
|
||||
|
||||
EE_Status EE_WriteVariable32bits(uint16_t VirtAddress, uint32_t Data);
|
||||
#endif
|
||||
#if defined(FLASH_LINES_128B)
|
||||
EE_Status EE_ReadVariable96bits(uint16_t VirtAddress, uint64_t* pData);
|
||||
EE_Status EE_WriteVariable96bits(uint16_t VirtAddress, uint64_t* Data);
|
||||
#endif
|
||||
EE_Status EE_ReadVariable16bits(uint16_t VirtAddress, uint16_t* pData);
|
||||
|
||||
EE_Status EE_ReadVariable16bits(uint16_t VirtAddress, uint16_t *pData);
|
||||
|
||||
EE_Status EE_WriteVariable16bits(uint16_t VirtAddress, uint16_t Data);
|
||||
EE_Status EE_ReadVariable8bits(uint16_t VirtAddress, uint8_t* pData);
|
||||
|
||||
EE_Status EE_ReadVariable8bits(uint16_t VirtAddress, uint8_t *pData);
|
||||
|
||||
EE_Status EE_WriteVariable8bits(uint16_t VirtAddress, uint8_t Data);
|
||||
|
||||
EE_Status EE_CleanUp(void);
|
||||
EE_Status EE_CleanUp_IT(void);
|
||||
|
||||
EE_Status EE_DeleteCorruptedFlashAddress(uint32_t Address);
|
||||
void EE_EndOfCleanup_UserCallback(void);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
* Callback from NMI.
|
||||
*
|
||||
* @return true if handled by this library
|
||||
*/
|
||||
bool EE_NMI_Callback();
|
||||
|
||||
#endif /* __EEPROM_EMUL_H */
|
||||
|
||||
|
||||
+3
-50
@@ -27,64 +27,17 @@
|
||||
#ifndef __EEPROM_EMUL_CONF_H
|
||||
#define __EEPROM_EMUL_CONF_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Private constants ---------------------------------------------------------*/
|
||||
/** @addtogroup EEPROM_Private_Constants
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup Private_Configuration_Constants Private Configuration Constants
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Configuration of eeprom emulation in flash, can be custom */
|
||||
#define START_PAGE_ADDRESS 0x08080000U /*!< Start address of the 1st page in flash, for EEPROM emulation */
|
||||
#define START_PAGE_ADDRESS 0x800E000U /*!< Start address of the 1st page in flash, for EEPROM emulation */
|
||||
|
||||
#define CYCLES_NUMBER 1U /*!< Number of 10Kcycles requested, minimum 1 for 10Kcycles (default),
|
||||
for instance 10 to reach 100Kcycles. This factor will increase
|
||||
pages number */
|
||||
|
||||
#define GUARD_PAGES_NUMBER 2U /*!< Number of guard pages avoiding frequent transfers (must be multiple of 2): 0,2,4.. */
|
||||
|
||||
/* Configuration of crc calculation for eeprom emulation in flash */
|
||||
#define CRC_POLYNOMIAL_LENGTH LL_CRC_POLYLENGTH_16B /* CRC polynomial lenght 16 bits */
|
||||
#define CRC_POLYNOMIAL_VALUE 0x8005U /* Polynomial to use for CRC calculation */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/** @defgroup EEPROM_Exported_Constants EEPROM Exported Constants
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup Exported_Configuration_Constants Exported Configuration Constants
|
||||
* @{
|
||||
*/
|
||||
#define NB_OF_VARIABLES 1000U /*!< Number of variables to handle in eeprom */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* __EEPROM_EMUL_CONF_H */
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __EEPROM_EMUL_TYPES_H
|
||||
#define __EEPROM_EMUL_TYPES_H
|
||||
@@ -67,7 +67,7 @@ typedef enum {
|
||||
|
||||
/* External return code : action required */
|
||||
EE_CLEANUP_REQUIRED = 0x100U,
|
||||
|
||||
|
||||
#ifdef DUALCORE_FLASH_SHARING
|
||||
/* Value returned when a program or erase operation is requested but
|
||||
* the flash is already used by CPU2 */
|
||||
|
||||
@@ -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****/
|
||||
+24
-6
@@ -27,9 +27,29 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "stm32l4xx_hal.h"
|
||||
#include "stm32l4xx_ll_crc.h"
|
||||
#include "stm32l4xx_ll_bus.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#include "stm32f1xx.h"
|
||||
#include "stm32f103xb.h"
|
||||
#include "stm32f1xx_ll_crc.h"
|
||||
#include "stm32f1xx_ll_bus.h"
|
||||
|
||||
|
||||
/** @defgroup FLASHEx_Page_Size Page Size
|
||||
* @{
|
||||
*/
|
||||
#if (defined(STM32F101x6) || defined(STM32F102x6) || defined(STM32F103x6) || defined(STM32F100xB) || defined(STM32F101xB) || defined(STM32F102xB) || defined(STM32F103xB))
|
||||
#define FLASH_PAGE_SIZE 0x400U
|
||||
#endif /* STM32F101x6 || STM32F102x6 || STM32F103x6 */
|
||||
/* STM32F100xB || STM32F101xB || STM32F102xB || STM32F103xB */
|
||||
|
||||
#if (defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG) || defined(STM32F103xG) || defined(STM32F105xC) || defined(STM32F107xC))
|
||||
#define FLASH_PAGE_SIZE 0x800U
|
||||
#endif /* STM32F100xB || STM32F101xB || STM32F102xB || STM32F103xB */
|
||||
/* STM32F101xG || STM32F103xG */
|
||||
/* STM32F105xC || STM32F107xC */
|
||||
|
||||
#define FLASH_BANK_SIZE (FLASH_BANK1_END - FLASH_BASE)
|
||||
|
||||
/** @addtogroup EEPROM_Emulation
|
||||
* @{
|
||||
@@ -100,11 +120,9 @@
|
||||
/** @addtogroup EEPROM_Private_Functions
|
||||
* @{
|
||||
*/
|
||||
HAL_StatusTypeDef FI_WriteDoubleWord(uint32_t Address, uint64_t Data);
|
||||
EE_Status 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);
|
||||
|
||||
/**
|
||||
@@ -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****/
|
||||
@@ -1,5 +1,5 @@
|
||||
##########################################################################################################################
|
||||
# File automatically-generated by tool: [projectgenerator] version: [3.16.0] date: [Mon Mar 13 00:15:21 CET 2023]
|
||||
# File automatically-generated by tool: [projectgenerator] version: [3.16.0] date: [Tue Mar 14 20:49:50 CET 2023]
|
||||
##########################################################################################################################
|
||||
|
||||
# ------------------------------------------------
|
||||
@@ -72,6 +72,8 @@ Lib/ufb/Src/fb_7seg.c \
|
||||
Lib/ufb/Src/fb_text.c \
|
||||
Lib/snprintf/snprintf.c \
|
||||
Core/Src/dma.c \
|
||||
Lib/EEPROM_Emul/Core/eeprom_emul.c \
|
||||
Lib/EEPROM_Emul/Porting/STM32F1/flash_interface.c \
|
||||
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_gpio.c \
|
||||
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_adc.c \
|
||||
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_dma.c \
|
||||
@@ -81,7 +83,9 @@ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_exti.c \
|
||||
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_spi.c \
|
||||
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_tim.c \
|
||||
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_usart.c \
|
||||
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_pwr.c
|
||||
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_pwr.c \
|
||||
Core/Src/crc.c \
|
||||
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_crc.c
|
||||
|
||||
# ASM sources
|
||||
ASM_SOURCES = \
|
||||
@@ -156,7 +160,9 @@ C_INCLUDES = \
|
||||
-IDrivers/CMSIS/Device/ST/STM32F1xx/Include \
|
||||
-IDrivers/CMSIS/Include \
|
||||
-ILib/ufb/Inc \
|
||||
-ILib/snprintf
|
||||
-ILib/snprintf \
|
||||
-ILib/EEPROM_Emul/Core \
|
||||
-ILib/EEPROM_Emul/Porting/STM32F1
|
||||
|
||||
|
||||
# compile gcc flags
|
||||
|
||||
@@ -63,7 +63,7 @@ MEMORY
|
||||
{
|
||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
|
||||
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 56K
|
||||
EEPROM_EMU (rx) : ORIGIN = ORIGIN(FLASH) + LENGTH(FLASH), LENGTH = 8K
|
||||
EEPROM_EMU (rx) : ORIGIN = 0x800E000, LENGTH = 8K
|
||||
}
|
||||
|
||||
/* Define output sections */
|
||||
|
||||
Reference in New Issue
Block a user