From 374b3eec377d3520fbc45c58f53a03ce6488b715 Mon Sep 17 00:00:00 2001 From: danyhm Date: Fri, 2 Mar 2018 00:13:46 +0000 Subject: [PATCH] Initial Commit initial Commit --- eeprom.c | 256 +++++++++++++++++++++++++++++++++++++++++++++++++ eeprom.h | 20 ++++ eepromConfig.h | 70 ++++++++++++++ 3 files changed, 346 insertions(+) create mode 100644 eeprom.c create mode 100644 eeprom.h create mode 100644 eepromConfig.h diff --git a/eeprom.c b/eeprom.c new file mode 100644 index 0000000..712b376 --- /dev/null +++ b/eeprom.c @@ -0,0 +1,256 @@ +#include "eeprom.h" +#include "eepromConfig.h" + +//########################################################################################################## +#define _X_BYTE_ROUNDUP(Dividend,Divisor) ((Dividend/Divisor)+(Dividend%Divisor==0?0:1)) +//########################################################################################################## +//copy page to transfer page excluding the bad data +static bool EE_PageTransfer(uint32_t PageAddress,uint16_t BadDataOffset,uint16_t BadDataNum); +static uint32_t EE_FindPageAddressOfVirtualAddress(uint16_t VirtualAddress); +static uint16_t EE_FindVirtualAddressOffset(uint16_t VirtualAddress); +//########################################################################################################## +bool EE_FormatPage(uint32_t PageAddress) +{ + uint32_t error; + FLASH_EraseInitTypeDef flashErase; + HAL_FLASH_Unlock(); + flashErase.NbPages=1; + #if(_CORTEX_!=M0) + flashErase.Banks = FLASH_BANK_1; + #endif + flashErase.TypeErase = FLASH_TYPEERASE_PAGES; + flashErase.PageAddress = PageAddress; + if(HAL_FLASHEx_Erase(&flashErase,&error)==HAL_OK) + { + HAL_FLASH_Lock(); + if(error != 0xFFFFFFFF) + return false; + else + return true; + } + HAL_FLASH_Lock(); + return false; +} +//########################################################################################################## +bool EE_Read(uint16_t VirtualAddress, uint32_t* Data) +{ + if(VirtualAddress >= _EEPROM_End_VirtualAddr) + return false; + *Data = (*(__IO uint32_t*)((VirtualAddress*4)+_EEPROM_START_FLASH_PAGE_ADDRESS)); + return true; +} +//########################################################################################################## +bool EE_Reads(uint16_t StartVirtualAddress,uint16_t HowMuchToRead,uint32_t* Data) +{ + if((StartVirtualAddress+HowMuchToRead) > _EEPROM_End_VirtualAddr) + return false; + for(uint16_t i=StartVirtualAddress ; i _EEPROM_End_VirtualAddr) + return false; + + for(uint16_t i=StartVirtualAddress , currentbyte=0 ; i < _X_BYTE_ROUNDUP(HowManyBytesToRead,4)+StartVirtualAddress ; i++) + { + temp.fbyte = (*(__IO uint32_t*)((i*4)+_EEPROM_START_FLASH_PAGE_ADDRESS)); + // Fill bytes + for(uint8_t j=0;j<4;j++) + { + if (currentbyte= _EEPROM_End_VirtualAddr) + return false; + + //If flash space is not empty make it empty + if((*(__IO uint32_t*)((VirtualAddress*4)+_EEPROM_START_FLASH_PAGE_ADDRESS)) != 0xFFFFFFFF) + { + //create backup of that page excluding bad data + EE_PageTransfer(EE_FindPageAddressOfVirtualAddress(VirtualAddress),EE_FindVirtualAddressOffset(VirtualAddress),1); + } + //Write data + if(Data!=0xFFFFFFFF) + { + HAL_FLASH_Unlock(); + if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,(VirtualAddress*4)+_EEPROM_START_FLASH_PAGE_ADDRESS,(uint64_t)Data)==HAL_OK) + { + HAL_FLASH_Lock(); + return true; + } + else + { + HAL_FLASH_Lock(); + return false; + } + } + HAL_FLASH_Lock(); + return true; + +} +//########################################################################################################## +bool EE_Writes(uint16_t StartVirtualAddress,uint16_t HowMuchToWrite,uint32_t* Data) +{ + //check address validation + if((StartVirtualAddress+HowMuchToWrite) > _EEPROM_End_VirtualAddr) + return false; + + //If flash space is not empty make it empty + for(uint16_t i=StartVirtualAddress ; i _EEPROM_End_VirtualAddr) + return false; + + //If flash space is not empty make it empty + for(uint16_t i=StartVirtualAddress ; i=BadDataOffset && i +//include the Correct HAL version here according to the Cortex core. +//#include "stm32f1xx_hal.h" +#include "stm32f0xx_hal.h" + + +//################################################################################################################ +bool EE_FormatPage(uint32_t PageAddress); +bool EE_Read(uint16_t VirtualAddress, uint32_t* Data); +bool EE_Reads(uint16_t StartVirtualAddress,uint16_t HowMuchToRead,uint32_t* Data); +bool EE_ReadBytes(uint16_t StartVirtualAddress,uint16_t HowManyBytesToRead,void* Data); +bool EE_Write(uint16_t VirtualAddress, uint32_t Data); +bool EE_Writes(uint16_t StartVirtualAddress,uint16_t HowMuchToWrite,uint32_t* Data); +bool EE_WriteBytes(uint16_t StartVirtualAddress,uint16_t HowManyBytesToWrite,void* Data); +//################################################################################################################ + +#endif diff --git a/eepromConfig.h b/eepromConfig.h new file mode 100644 index 0000000..2297f6b --- /dev/null +++ b/eepromConfig.h @@ -0,0 +1,70 @@ +#ifndef __EEPROMCONFIG_H +#define __EEPROMCONFIG_H + +/* +References for further development: +https://github.com/whatcall/stm32f0-emulated-eeprom +https://github.com/nimaltd/EEPROM + +@TODO check for compiler options to reserve the flash space. +@TODO Check for 16 bit Flash Writing +@TODO implement way to detect data being written on overlapping pages +*/ +/* +Low Density : From Page 0 to Page 31 , Page Size : 0x400 = 1024 +Medium Density : From Page 0 to Page 63 , Page Size : 0x400 = 1024 +High Density : From Page 0 to Page 127 , Page Size : 0x800 = 2048 +*/ + +// Use RTOS so be carefull not to interrupt in critical areas +#ifndef _USE_RTOS +#define _USE_RTOS 0 +#endif + +// Valid Values: M0 , M0P , M3 , M7 +#define _CORTEX_ M0 + +// Valid Values: LOW , MEDIUM , HIGH +#define _DENSITY_ LOW + +#define _EEPROM_PAGES_TO_USE 2 //The number of pages needed to be used (excluding the transfer page) +#define _EEPROM_START_FLASH_PAGE 29 +#define _EEPROM_TRANSFER_PAGE 31 //Should be last page of memory - this is the temp page for updating other pages without using RAM + +/*################################################################################################################################*/ +/*######################DO NOT EDIT ANYTHING BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING!!!!!!#############################*/ +/*################################################################################################################################*/ +#if(_EEPROM_PAGES_TO_USE+_EEPROM_START_FLASH_PAGE>_EEPROM_TRANSFER_PAGE) + #error "Transfer Page is overlapping Data Pages" +#endif +#if(_EEPROM_PAGES_TO_USE+_EEPROM_START_FLASH_PAGE!=_EEPROM_TRANSFER_PAGE) + #warning "Page Gap between User Data and Transfer Page" +#endif + +/* Emulated data and virtual address bits */ +#define EE_DATA_16BIT 16 +#define EE_DATA_32BIT 32 +#define EE_DATA_WIDTH (uint32_t)EE_DATA_32BIT + +// Valid Values: 0x400 , 0x800 +#define _EEPROM_FLASH_PAGE_SIZE (uint32_t)FLASH_PAGE_SIZE /* Page size --> From HAL Library */ + +#define _EEPROM_Num_VirtualAdd_IN_PAGE ((uint32_t)FLASH_PAGE_SIZE)/(EE_DATA_WIDTH/8) + +// Virtual Address points to uint32_t types of data so we divide it by 32bits=4byes +#define _EEPROM_End_VirtualAddr (_EEPROM_FLASH_PAGE_SIZE/4)*_EEPROM_PAGES_TO_USE + +/* Base address of the Flash sectors */ +#define ADDR_FLASH_PAGE_0 ((uint32_t)0x08000000) /* Base @ of Page 0 */ +#define _EEPROM_START_FLASH_PAGE_ADDRESS (uint32_t)(ADDR_FLASH_PAGE_0|(_EEPROM_FLASH_PAGE_SIZE*_EEPROM_START_FLASH_PAGE)) +#define _EEPROM_TRANSFER_PAGE_ADDRESS (uint32_t)(ADDR_FLASH_PAGE_0|(_EEPROM_FLASH_PAGE_SIZE*_EEPROM_TRANSFER_PAGE)) + +#if(_DENSITY_==LOW&&_EEPROM_USE_FLASH_PAGE>31) + #error "Please Enter currect value _EEPROM_USE_FLASH_PAGE (0 to 31)" +#elseif(_DENSITY_==MEDIUM&&_EEPROM_USE_FLASH_PAGE>63) + #error "Please Enter currect value _EEPROM_USE_FLASH_PAGE (0 to 63)" +#elseif(_DENSITY_==HIGH&&_EEPROM_USE_FLASH_PAGE>127) + #error "Please Enter currect value _EEPROM_USE_FLASH_PAGE (0 to 127)" +#endif + +#endif