V3.0.0
This commit is contained in:
parent
9d9db06161
commit
c7e148c99f
687
ee.c
687
ee.c
|
@ -1,417 +1,360 @@
|
|||
|
||||
/************************************************************************************************************
|
||||
************** Include Headers
|
||||
************************************************************************************************************/
|
||||
|
||||
#include "ee.h"
|
||||
#include "eeConfig.h"
|
||||
#include <string.h>
|
||||
|
||||
#define PAGE 0
|
||||
#define SECTOR 1
|
||||
#define PAGE_NUM 2
|
||||
/************************************************************************************************************
|
||||
************** Private Definitions
|
||||
************************************************************************************************************/
|
||||
|
||||
#if defined(STM32F103xB)
|
||||
#define _EE_SIZE 1024
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#define _EE_PAGE_OR_SECTOR PAGE
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 127)
|
||||
#error "Please Enter correct address, maximum is (127)"
|
||||
#define EE_ERASE_PAGE_ADDRESS 0
|
||||
#define EE_ERASE_PAGE_NUMBER 1
|
||||
#define EE_ERASE_SECTOR_NUMBER 2
|
||||
|
||||
#ifdef STM32F0
|
||||
#define EE_ERASE EE_ERASE_PAGE_ADDRESS
|
||||
#define FLASH_SIZE ((((uint32_t)(*((uint16_t *)FLASHSIZE_BASE)) & (0xFFFFU))) * 1024)
|
||||
#endif
|
||||
|
||||
#ifdef STM32F1
|
||||
#define EE_ERASE EE_ERASE_PAGE_ADDRESS
|
||||
#define FLASH_SIZE ((((uint32_t)(*((uint16_t *)FLASHSIZE_BASE)) & (0xFFFFU))) * 1024)
|
||||
#endif
|
||||
|
||||
#ifdef STM32F2
|
||||
#define EE_ERASE EE_ERASE_SECTOR_NUMBER
|
||||
#define FLASH_SIZE ((((uint32_t)(*((uint16_t *)FLASHSIZE_BASE)) & (0xFFFFU))) * 1024)
|
||||
#endif
|
||||
|
||||
#ifdef STM32F3
|
||||
#define EE_ERASE EE_ERASE_PAGE_ADDRESS
|
||||
#define FLASH_SIZE ((((uint32_t)(*((uint16_t *)FLASHSIZE_BASE)) & (0xFFFFU))) * 1024)
|
||||
#endif
|
||||
|
||||
#ifdef STM32F4
|
||||
#define EE_ERASE EE_ERASE_SECTOR_NUMBER
|
||||
#define EE_SIZE 0x20000
|
||||
#define FLASH_SIZE ((((uint32_t)(*((uint16_t *)FLASHSIZE_BASE)) & (0xFFFFU))) * 1024)
|
||||
#endif
|
||||
|
||||
#ifdef STM32F7
|
||||
#define EE_ERASE EE_ERASE_SECTOR_NUMBER
|
||||
#define EE_SIZE 0x20000
|
||||
#endif
|
||||
|
||||
#ifdef STM32H5
|
||||
#define EE_ERASE EE_ERASE_PAGE_ADDRESS
|
||||
#endif
|
||||
|
||||
#ifdef STM32H7
|
||||
#define EE_ERASE EE_ERASE_SECTOR_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32G0
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32G4
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32U0
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32U5
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32L0
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32L1
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32L4
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32L5
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32WB
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32W0
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32WBA
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#undef FLASH_BANK_1
|
||||
#endif
|
||||
|
||||
#ifdef STM32WL
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifdef STM32C0
|
||||
#define EE_ERASE EE_ERASE_PAGE_NUMBER
|
||||
#endif
|
||||
|
||||
#ifndef EE_SIZE
|
||||
#if (EE_ERASE == EE_ERASE_PAGE_NUMBER) || (EE_ERASE == EE_ERASE_PAGE_ADDRESS)
|
||||
#define EE_SIZE FLASH_PAGE_SIZE
|
||||
#elif (EE_ERASE == EE_ERASE_SECTOR_NUMBER)
|
||||
#define EE_SIZE FLASH_SECTOR_SIZE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32F103x8)
|
||||
#define _EE_SIZE 1024
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#define _EE_PAGE_OR_SECTOR PAGE
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 63)
|
||||
#error "Please Enter correct address, maximum is (63)"
|
||||
#endif
|
||||
#if defined FLASH_BANK_2)
|
||||
#define EE_BANK_SELECT FLASH_BANK_2
|
||||
#elif (defined FLASH_BANK_1)
|
||||
#define EE_BANK_SELECT FLASH_BANK_1
|
||||
#endif
|
||||
|
||||
#if defined(STM32F103xC)
|
||||
#define _EE_SIZE 2048
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#define _EE_PAGE_OR_SECTOR PAGE
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 127)
|
||||
#error "Please Enter correct address, maximum is (127)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32F103xD)
|
||||
#define _EE_SIZE 2048
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#define _EE_PAGE_OR_SECTOR PAGE
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 191)
|
||||
#error "Please Enter correct address, maximum is (191)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32F103xE)
|
||||
#define _EE_SIZE 2048
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#define _EE_PAGE_OR_SECTOR PAGE
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 255)
|
||||
#error "Please Enter correct address, maximum is (255)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32F030x4) || defined(STM32F042x4) || defined(STM32F070x4)
|
||||
#define _EE_SIZE 1024
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_PAGE_OR_SECTOR PAGE
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 15)
|
||||
#error "Please Enter correct address, maximum is (15)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32F030x6) || defined(STM32F042x6) || defined(STM32F070x6)
|
||||
#define _EE_SIZE 1024
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_PAGE_OR_SECTOR PAGE
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 31)
|
||||
#error "Please Enter correct address, maximum is (31)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32F030x8) || defined(STM32F042x8)
|
||||
#define _EE_SIZE 1024
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_PAGE_OR_SECTOR PAGE
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 63)
|
||||
#error "Please Enter correct address, maximum is (63)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32F070xB)
|
||||
#define _EE_SIZE 2048
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_PAGE_OR_SECTOR PAGE
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 63)
|
||||
#error "Please Enter correct address, maximum is (63)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32F070xC)
|
||||
#define _EE_SIZE 2048
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_PAGE_OR_SECTOR PAGE
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 127)
|
||||
#error "Please Enter correct address, maximum is (127)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx)
|
||||
#define _EE_SIZE (1024 * 128)
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08020000) | (_EE_SIZE*(_EE_USE_FLASH_PAGE_OR_SECTOR - 5)))
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#define _EE_VOLTAGE_RANGE _EE_VOLTAGE
|
||||
#define _EE_PAGE_OR_SECTOR SECTOR
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 11)
|
||||
#error "Please Enter correct address, maximum is (11)"
|
||||
#endif
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR < 5)
|
||||
#error "Please Enter correct address, minimum is (5)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32F411xC)
|
||||
#define _EE_SIZE (1024 * 128)
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08020000) | (_EE_SIZE*(_EE_USE_FLASH_PAGE_OR_SECTOR - 5)))
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#define _EE_VOLTAGE_RANGE _EE_VOLTAGE
|
||||
#define _EE_PAGE_OR_SECTOR SECTOR
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 5)
|
||||
#error "Please Enter correct address, maximum is (5)"
|
||||
#endif
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR < 5)
|
||||
#error "Please Enter correct address, minimum is (5)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32F411xE)
|
||||
#define _EE_SIZE (1024 * 128)
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08020000) | (_EE_SIZE*(_EE_USE_FLASH_PAGE_OR_SECTOR - 5)))
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#define _EE_VOLTAGE_RANGE _EE_VOLTAGE
|
||||
#define _EE_PAGE_OR_SECTOR SECTOR
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 7)
|
||||
#error "Please Enter correct address, maximum is (7)"
|
||||
#endif
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR < 5)
|
||||
#error "Please Enter correct address, minimum is (5)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32G030xx) || defined(STM32G050xx)
|
||||
#define _EE_SIZE 2048
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_PAGE_OR_SECTOR PAGE_NUM
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 31)
|
||||
#error "Please Enter correct address, maximum is (31)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32G070xx)
|
||||
#define _EE_SIZE 2048
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_PAGE_OR_SECTOR PAGE_NUM
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 63)
|
||||
#error "Please Enter correct address, maximum is (63)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32L433xx)
|
||||
#define _EE_SIZE 2048
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#define _EE_PAGE_OR_SECTOR PAGE_NUM
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 127)
|
||||
#error "Please Enter correct address, maximum is (127)"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STM32L476xx)
|
||||
#define _EE_SIZE 2048
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR < 256)
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#ifndef EE_PAGE_SECTOR
|
||||
#if (EE_BANK_SELECT == FLASH_BANK_2)
|
||||
#define EE_PAGE_SECTOR ((FLASH_SIZE / EE_SIZE / 2) - 1)
|
||||
#else
|
||||
#define _EE_FLASH_BANK FLASH_BANK_2
|
||||
#define _EE_PAGE_OR_SECTOR PAGE_NUM
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 511)
|
||||
#error "Please Enter correct address, maximum is (511)"
|
||||
#endif
|
||||
#define EE_PAGE_SECTOR ((FLASH_SIZE / EE_SIZE) - 1)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// 2MB version
|
||||
#if defined(STM32U575xx) || defined(STM32U585xx)
|
||||
#define _EE_SIZE 8192
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_ICACHE_CTRL 1
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR < 128)
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#ifndef EE_ADDRESS
|
||||
#if (EE_BANK_SELECT != FLASH_BANK_2)
|
||||
#define EE_ADDRESS (FLASH_BASE + EE_SIZE * EE_PAGE_SECTOR)
|
||||
#else
|
||||
#define _EE_FLASH_BANK FLASH_BANK_2
|
||||
#define _EE_PAGE_OR_SECTOR PAGE_NUM
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 255)
|
||||
#error "Please Enter correct address, maximum is (255)"
|
||||
#endif
|
||||
#define EE_ADDRESS (FLASH_BASE + EE_SIZE * (EE_PAGE_SECTOR * 2 + 1))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// 4MB version
|
||||
#if defined(STM32U599xx)
|
||||
#define _EE_SIZE 8192
|
||||
#define _EE_ADDR_INUSE (((uint32_t)0x08000000) | (_EE_SIZE * _EE_USE_FLASH_PAGE_OR_SECTOR))
|
||||
#define _EE_ICACHE_CTRL 1
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR < 256)
|
||||
#define _EE_FLASH_BANK FLASH_BANK_1
|
||||
#else
|
||||
#define _EE_FLASH_BANK FLASH_BANK_2
|
||||
#define _EE_PAGE_OR_SECTOR PAGE_NUM
|
||||
#if (_EE_USE_FLASH_PAGE_OR_SECTOR > 511)
|
||||
#error "Please Enter correct address, maximum is (511)"
|
||||
#endif
|
||||
#endif
|
||||
#ifndef EE_ERASE
|
||||
#error "Not Supported MCU!"
|
||||
#endif
|
||||
|
||||
#if (_EE_USE_RAM_BYTE > 0)
|
||||
uint8_t ee_ram[_EE_USE_RAM_BYTE];
|
||||
#endif
|
||||
/************************************************************************************************************
|
||||
************** Private Variables
|
||||
************************************************************************************************************/
|
||||
|
||||
//##########################################################################################################
|
||||
bool ee_init(void)
|
||||
EE_HandleTypeDef eeHandle;
|
||||
|
||||
/************************************************************************************************************
|
||||
************** Private Functions
|
||||
************************************************************************************************************/
|
||||
|
||||
|
||||
/************************************************************************************************************
|
||||
************** Public Functions
|
||||
************************************************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Initialize the EEPROM.
|
||||
* @note Assign a struct/array for storing your data
|
||||
*
|
||||
* @param StoragePointer: Pointer to Storing data
|
||||
* @param Size: Size of Storage, It should be equal or lower than latest sector/page of selected MCU
|
||||
*
|
||||
* @retval bool: true or false
|
||||
*/
|
||||
bool EE_Init(void *StoragePointer, uint32_t Size)
|
||||
{
|
||||
#if (_EE_USE_RAM_BYTE > 0)
|
||||
return ee_read(0, _EE_USE_RAM_BYTE, NULL);
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
//##########################################################################################################
|
||||
bool ee_format(bool keepRamData)
|
||||
{
|
||||
uint32_t error;
|
||||
HAL_FLASH_Unlock();
|
||||
#if _EE_ICACHE_CTRL == 1
|
||||
HAL_ICACHE_Disable();
|
||||
#endif
|
||||
FLASH_EraseInitTypeDef flashErase;
|
||||
#if _EE_PAGE_OR_SECTOR == PAGE
|
||||
flashErase.NbPages = 1;
|
||||
flashErase.PageAddress = _EE_ADDR_INUSE;
|
||||
flashErase.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||
#elif _EE_PAGE_OR_SECTOR == SECTOR
|
||||
flashErase.NbSectors = 1;
|
||||
flashErase.Sector = _EE_USE_FLASH_PAGE_OR_SECTOR;
|
||||
flashErase.TypeErase = FLASH_TYPEERASE_SECTORS;
|
||||
#elif _EE_PAGE_OR_SECTOR == PAGE_NUM
|
||||
flashErase.NbPages = 1;
|
||||
flashErase.Page = _EE_USE_FLASH_PAGE_OR_SECTOR;
|
||||
flashErase.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||
#endif
|
||||
#ifdef _EE_FLASH_BANK
|
||||
flashErase.Banks = _EE_FLASH_BANK;
|
||||
#endif
|
||||
#ifdef _EE_VOLTAGE_RANGE
|
||||
flashErase.VoltageRange = _EE_VOLTAGE_RANGE;
|
||||
#endif
|
||||
if (HAL_FLASHEx_Erase(&flashErase, &error) == HAL_OK)
|
||||
bool answer = false;
|
||||
do
|
||||
{
|
||||
HAL_FLASH_Lock();
|
||||
if (Size > EE_SIZE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
eeHandle.Size = Size;
|
||||
eeHandle.DataPointer = (uint8_t*)StoragePointer;
|
||||
answer = true;
|
||||
|
||||
} while (0);
|
||||
|
||||
return answer;
|
||||
}
|
||||
|
||||
/***********************************************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Get Capacity of EEPROM
|
||||
* @note It shall return the latest sector/page size
|
||||
*
|
||||
* @retval uint32_t: Returned size in bytes
|
||||
*/
|
||||
uint32_t EE_Capacity(void)
|
||||
{
|
||||
return EE_SIZE;
|
||||
}
|
||||
|
||||
/***********************************************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Get Capacity of EEPROM
|
||||
* @note It shall return the latest sector/page size
|
||||
*
|
||||
* @param EraseBuffer: Erase data buffer of Storage or not
|
||||
*
|
||||
* @retval bool: true or false
|
||||
*/
|
||||
bool EE_Format(bool EraseBuffer)
|
||||
{
|
||||
bool answer = false;
|
||||
uint32_t error;
|
||||
FLASH_EraseInitTypeDef flashErase;
|
||||
do
|
||||
{
|
||||
HAL_FLASH_Unlock();
|
||||
#ifdef HAL_ICACHE_MODULE_ENABLED
|
||||
HAL_ICACHE_Disable();
|
||||
#endif
|
||||
#if EE_ERASE == EE_ERASE_PAGE_ADDRESS
|
||||
flashErase.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||
flashErase.PageAddress = EE_ADDRESS;
|
||||
flashErase.NbPages = 1;
|
||||
#elif EE_ERASE == EE_ERASE_PAGE_NUMBER
|
||||
flashErase.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||
flashErase.Page = EE_PAGE_SECTOR;
|
||||
flashErase.NbPages = 1;
|
||||
#else
|
||||
flashErase.TypeErase = FLASH_TYPEERASE_SECTORS;
|
||||
flashErase.Sector = EE_PAGE_SECTOR;
|
||||
flashErase.NbSectors = 1;
|
||||
#endif
|
||||
#ifdef EE_BANK_SELECT
|
||||
flashErase.Banks = EE_BANK_SELECT;
|
||||
#endif
|
||||
#ifdef FLASH_VOLTAGE_RANGE_3
|
||||
flashErase.VoltageRange = FLASH_VOLTAGE_RANGE_3;
|
||||
#endif
|
||||
if (HAL_FLASHEx_Erase(&flashErase, &error) != HAL_OK)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (error != 0xFFFFFFFF)
|
||||
{
|
||||
#if _EE_ICACHE_CTRL == 1
|
||||
HAL_ICACHE_Enable();
|
||||
#endif
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if (_EE_USE_RAM_BYTE > 0)
|
||||
if (keepRamData == false)
|
||||
memset(ee_ram, 0xFF, _EE_USE_RAM_BYTE);
|
||||
#endif
|
||||
#if _EE_ICACHE_CTRL == 1
|
||||
HAL_ICACHE_Enable();
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
}
|
||||
answer = true;
|
||||
|
||||
} while (0);
|
||||
|
||||
HAL_FLASH_Lock();
|
||||
#if _EE_ICACHE_CTRL == 1
|
||||
#ifdef HAL_ICACHE_MODULE_ENABLED
|
||||
HAL_ICACHE_Enable();
|
||||
#endif
|
||||
return false;
|
||||
return answer;
|
||||
}
|
||||
//##########################################################################################################
|
||||
bool ee_read(uint32_t startVirtualAddress, uint32_t len, uint8_t* data)
|
||||
|
||||
/***********************************************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Read all data
|
||||
* @note Read from flash memory and fill up the buffer
|
||||
*
|
||||
* @param none
|
||||
*
|
||||
* @retval none
|
||||
*/
|
||||
void EE_Read(void)
|
||||
{
|
||||
if ((startVirtualAddress + len) > _EE_SIZE)
|
||||
return false;
|
||||
for (uint32_t i = startVirtualAddress; i < len + startVirtualAddress; i++)
|
||||
uint8_t *data = eeHandle.DataPointer;
|
||||
for (uint32_t i = 0; i < eeHandle.Size; i++)
|
||||
{
|
||||
if (data != NULL)
|
||||
{
|
||||
*data = (*(__IO uint8_t*) (i + _EE_ADDR_INUSE));
|
||||
data++;
|
||||
}
|
||||
#if (_EE_USE_RAM_BYTE > 0)
|
||||
if (i < _EE_USE_RAM_BYTE)
|
||||
ee_ram[i] = (*(__IO uint8_t*) (i + _EE_ADDR_INUSE));
|
||||
#endif
|
||||
*data = (*(__IO uint8_t*) (EE_ADDRESS + i));
|
||||
data++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
//##########################################################################################################
|
||||
bool ee_write(uint32_t startVirtualAddress, uint32_t len, uint8_t *data)
|
||||
|
||||
/***********************************************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Write Buffer to flash memory
|
||||
* @note
|
||||
*
|
||||
* @param FormatFirst: Format the flash before writing
|
||||
*
|
||||
* @retval bool: true or false
|
||||
*/
|
||||
bool EE_Write(bool FormatFirst)
|
||||
{
|
||||
if ((startVirtualAddress + len) > _EE_SIZE)
|
||||
return false;
|
||||
if (data == NULL)
|
||||
return false;
|
||||
HAL_FLASH_Unlock();
|
||||
#if _EE_ICACHE_CTRL == 1
|
||||
HAL_ICACHE_Disable();
|
||||
#endif
|
||||
#ifdef FLASH_TYPEPROGRAM_BYTE
|
||||
for (uint32_t i = 0; i < len ; i++)
|
||||
{
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, ((i + startVirtualAddress)) + _EE_ADDR_INUSE, (uint64_t)(data[i])) != HAL_OK)
|
||||
{
|
||||
HAL_FLASH_Lock();
|
||||
#if _EE_ICACHE_CTRL == 1
|
||||
HAL_ICACHE_Enable();
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#elif FLASH_TYPEPROGRAM_HALFWORD
|
||||
for (uint32_t i = 0; i < len ; i+=2)
|
||||
{
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ((i + startVirtualAddress)) + _EE_ADDR_INUSE, (uint64_t)(data[i] | (data[i+1] << 8))) != HAL_OK)
|
||||
{
|
||||
HAL_FLASH_Lock();
|
||||
#if _EE_ICACHE_CTRL == 1
|
||||
HAL_ICACHE_Enable();
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#elif FLASH_TYPEPROGRAM_DOUBLEWORD
|
||||
for (uint32_t i = 0; i < len; i += 8)
|
||||
bool answer = true;
|
||||
uint8_t *data = eeHandle.DataPointer;
|
||||
do
|
||||
{
|
||||
uint8_t DoubleWord[8] =
|
||||
{
|
||||
data[i + 0], data[i + 1], data[i + 2], data[i + 3], data[i + 4],\
|
||||
data[i + 5], data[i + 6], data[i + 7]
|
||||
};
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, ((i + startVirtualAddress)) + _EE_ADDR_INUSE, (uint32_t)DoubleWord) != HAL_OK)
|
||||
if (FormatFirst)
|
||||
{
|
||||
HAL_FLASH_Lock();
|
||||
#if _EE_ICACHE_CTRL == 1
|
||||
HAL_ICACHE_Enable();
|
||||
#endif
|
||||
return false;
|
||||
if (EE_Format(false) == false)
|
||||
{
|
||||
answer = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#elif FLASH_TYPEPROGRAM_QUADWORD
|
||||
for (uint32_t i = 0; i < len; i += 16)
|
||||
{
|
||||
uint8_t QuadWord[16] =
|
||||
{
|
||||
data[i + 0], data[i + 1], data[i + 2], data[i + 3], data[i + 4],\
|
||||
data[i + 5], data[i + 6], data[i + 7], data[i + 8], data[i + 9],\
|
||||
data[i + 10], data[i + 11], data[i + 12], data[i + 13], data[i + 14],\
|
||||
data[i + 15]
|
||||
};
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_QUADWORD, ((i + startVirtualAddress)) + _EE_ADDR_INUSE, (uint32_t)QuadWord) != HAL_OK)
|
||||
HAL_FLASH_Unlock();
|
||||
#ifdef HAL_ICACHE_MODULE_ENABLED
|
||||
HAL_ICACHE_Disable();
|
||||
#endif
|
||||
#if (defined FLASH_TYPEPROGRAM_HALFWORD)
|
||||
for (uint32_t i = 0; i < eeHandle.Size ; i += 2)
|
||||
{
|
||||
HAL_FLASH_Lock();
|
||||
#if _EE_ICACHE_CTRL == 1
|
||||
HAL_ICACHE_Enable();
|
||||
#endif
|
||||
return false;
|
||||
uint64_t halfWord;
|
||||
memcpy((uint8_t*)&halfWord, data, 2);
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, EE_ADDRESS + i, halfWord) != HAL_OK)
|
||||
{
|
||||
answer = false;
|
||||
break;
|
||||
}
|
||||
data += 2;
|
||||
}
|
||||
#elif (defined FLASH_TYPEPROGRAM_DOUBLEWORD)
|
||||
for (uint32_t i = 0; i < eeHandle.Size; i += 8)
|
||||
{
|
||||
uint64_t doubleWord;
|
||||
memcpy((uint8_t*)&doubleWord, data, 8);
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, EE_ADDRESS + i, doubleWord) != HAL_OK)
|
||||
{
|
||||
answer = false;
|
||||
break;
|
||||
}
|
||||
data += 8;
|
||||
}
|
||||
#elif (defined FLASH_TYPEPROGRAM_QUADWORD)
|
||||
for (uint32_t i = 0; i < eeHandle.Size; i += 16)
|
||||
{
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_QUADWORD, EE_ADDRESS + i, (uint32_t)data) != HAL_OK)
|
||||
{
|
||||
answer = false;
|
||||
break;
|
||||
}
|
||||
data += 16;
|
||||
}
|
||||
#elif (defined FLASH_TYPEPROGRAM_FLASHWORD)
|
||||
for (uint32_t i = 0; i < eeHandle.Size; i += 32)
|
||||
{
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, EE_ADDRESS + i, (uint32_t)data) != HAL_OK)
|
||||
{
|
||||
answer = false;
|
||||
break;
|
||||
}
|
||||
data += 32;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
} while (0);
|
||||
|
||||
HAL_FLASH_Lock();
|
||||
#if _EE_ICACHE_CTRL == 1
|
||||
#ifdef HAL_ICACHE_MODULE_ENABLED
|
||||
HAL_ICACHE_Enable();
|
||||
#endif
|
||||
return true;
|
||||
return answer;
|
||||
}
|
||||
//##########################################################################################################
|
||||
bool ee_writeToRam(uint32_t startVirtualAddress, uint32_t len, uint8_t* data)
|
||||
{
|
||||
#if (_EE_USE_RAM_BYTE > 0)
|
||||
if ((startVirtualAddress + len) > _EE_USE_RAM_BYTE)
|
||||
return false;
|
||||
if (data == NULL)
|
||||
return false;
|
||||
memcpy(&ee_ram[startVirtualAddress], data, len);
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
//##########################################################################################################
|
||||
bool ee_commit(void)
|
||||
{
|
||||
#if (_EE_USE_RAM_BYTE > 0)
|
||||
if (ee_format(true) == false)
|
||||
return false;
|
||||
return ee_write(0, _EE_USE_RAM_BYTE, ee_ram);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
//##########################################################################################################
|
||||
uint32_t ee_maxVirtualAddress(void)
|
||||
{
|
||||
return (_EE_SIZE);
|
||||
}
|
||||
//##########################################################################################################
|
||||
|
||||
/***********************************************************************************************************/
|
||||
|
|
85
ee.h
85
ee.h
|
@ -1,58 +1,65 @@
|
|||
#ifndef __EEPROM_H
|
||||
#define __EEPROM_H
|
||||
#ifndef _EE_H_
|
||||
#define _EE_H_
|
||||
|
||||
/***********************************************************************************************************
|
||||
|
||||
/*
|
||||
Author: Nima Askari
|
||||
WebSite: http://www.github.com/NimaLTD
|
||||
Instagram: http://instagram.com/github.NimaLTD
|
||||
Youtube: https://www.youtube.com/@NimaLTD
|
||||
|
||||
Version: 2.0.6
|
||||
Github: https://www.github.com/NimaLTD
|
||||
LinkedIn: https://www.linkedin.com/in/nimaltd
|
||||
Youtube: https://www.youtube.com/@nimaltd
|
||||
Instagram: https://instagram.com/github.NimaLTD
|
||||
|
||||
(2.0.6)
|
||||
Fix Write bug.
|
||||
Version: 3.0.0
|
||||
|
||||
(2.0.5)
|
||||
Add U575, U585.
|
||||
History:
|
||||
|
||||
(2.0.4)
|
||||
Add G030, G050, G070.
|
||||
|
||||
(2.0.3)
|
||||
Add F411.
|
||||
|
||||
(2.0.2)
|
||||
Add L4.
|
||||
|
||||
(2.0.1)
|
||||
Change function name to ee_commit().
|
||||
|
||||
Reversion History:
|
||||
(2.0.0)
|
||||
Rewrite again.
|
||||
3.0.0
|
||||
- Rewrite again
|
||||
- Support STM32CubeMx Packet installer
|
||||
|
||||
*/
|
||||
***********************************************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/************************************************************************************************************
|
||||
************** Include Headers
|
||||
************************************************************************************************************/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "main.h"
|
||||
|
||||
//################################################################################################################
|
||||
bool ee_init(void);
|
||||
bool ee_format(bool keepRamData);
|
||||
bool ee_read(uint32_t startVirtualAddress, uint32_t len, uint8_t* data);
|
||||
bool ee_write(uint32_t startVirtualAddress, uint32_t len, uint8_t* data);
|
||||
bool ee_writeToRam(uint32_t startVirtualAddress, uint32_t len, uint8_t* data); // only use when _EE_USE_RAM_BYTE is enabled
|
||||
bool ee_commit(void); // only use when _EE_USE_RAM_BYTE is enabled
|
||||
uint32_t ee_maxVirtualAddress(void);
|
||||
/************************************************************************************************************
|
||||
************** Public Definitions
|
||||
************************************************************************************************************/
|
||||
|
||||
//################################################################################################################
|
||||
|
||||
/************************************************************************************************************
|
||||
************** Public struct/enum
|
||||
************************************************************************************************************/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t MagicWord;
|
||||
uint8_t *DataPointer;
|
||||
uint32_t Size;
|
||||
uint32_t Lock;
|
||||
|
||||
} EE_HandleTypeDef;
|
||||
|
||||
/************************************************************************************************************
|
||||
************** Public Functions
|
||||
************************************************************************************************************/
|
||||
|
||||
bool EE_Init(void *StoragePointer, uint32_t Size);
|
||||
uint32_t EE_Capacity(void);
|
||||
bool EE_Format(bool EraseBuffer);
|
||||
void EE_Read(void);
|
||||
bool EE_Write(bool FormatFirst);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
#ifndef __EECONFIG_H
|
||||
#define __EECONFIG_H
|
||||
|
||||
#define _EE_USE_FLASH_PAGE_OR_SECTOR (31)
|
||||
#define _EE_USE_RAM_BYTE (1024)
|
||||
#define _EE_VOLTAGE FLASH_VOLTAGE_RANGE_3 // use in some devices
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user