implement EEPROM emulation
This commit is contained in:
@@ -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****/
|
||||
@@ -0,0 +1,143 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file EEPROM_Emul/Porting/STM32L4/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 <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
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* 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
|
||||
* @{
|
||||
*/
|
||||
EE_Status FI_WriteDoubleWord(uint32_t Address, uint64_t Data);
|
||||
EE_Status FI_PageErase(uint32_t Page, uint16_t NbPages);
|
||||
EE_Status FI_DeleteCorruptedFlashAddress(uint32_t Address);
|
||||
void FI_CacheFlush(void);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* __FLASH_INTERFACE_H */
|
||||
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
Reference in New Issue
Block a user