Mercurial > public > ostc4
diff Small_CPU/Src/RTE_FlashAccess.c @ 38:5f11787b4f42
include in ostc4 repository
author | heinrichsweikamp |
---|---|
date | Sat, 28 Apr 2018 11:52:34 +0200 |
parents | |
children | 91a8f9893e68 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Small_CPU/Src/RTE_FlashAccess.c Sat Apr 28 11:52:34 2018 +0200 @@ -0,0 +1,215 @@ +/** + ****************************************************************************** + * @file RTE_FLashAccess.c based on BonexFlashAccess.c based on firmwareEraseProgram.v + * @author heinrichs weikamp gmbh + * @version V0.0.1 + * @date 20-July-2016 + * @version V0.0.1 + * @since 20-July-2016 + * @brief erase and program the STM32F4xx internal FLASH memory for compasss calib etc. + * based on firmwareEraseProgram.c from OSTC4 + * + @verbatim + ============================================================================== + ##### How to use ##### + ============================================================================== + + 4 x 32 Byte with first block can not be 0xFFFFFFFF + + + + @endverbatim + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2> + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "RTE_FlashAccess.h" +#include "stdio.h" + +/** @addtogroup BONEXINFOSYSTEM + * @{ + */ + +/* Exported variables --------------------------------------------------------*/ + +/* Private types -------------------------------------------------------------*/ +/* taken from + * C:\Users\hw\STM32Cube\Repository\STM32Cube_FW_F3_V1.2.0\Projects\STM32F3-Discovery\Examples\FLASH\FLASH_EraseProgram + */ + +#define FLASH_SECTOR_SIZE_128KB (0x00020000) +#define FLASH_USER_START_ADDR (ADDR_FLASH_SECTOR_7) /* Start @ of user Flash area */ +#define FLASH_USER_END_ADDR (ADDR_FLASH_SECTOR_7 + FLASH_SECTOR_SIZE_128KB) /* End @ of user Flash area */ + +/* Base address of the Flash pages */ + +#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */ +#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */ + + + + +/* Private variables ---------------------------------------------------------*/ + +//static FLASH_EraseInitTypeDef EraseInitStruct; //Variable used for Erase procedure + +uint32_t Address = 0; +uint32_t PageError = 0; +__IO uint32_t data32 = 0 , MemoryProgramStatus = 0; + +/* Private function prototypes -----------------------------------------------*/ +//uint8_t BFA_eraseSectors(uint32_t SectorAddress, uint32_t NbSectors); +//uint8_t BFA_eraseSectorsAll(void); +uint8_t BFA_FindLastDataBlockAndSetAddress(void); + +/* Exported functions --------------------------------------------------------*/ + +uint8_t BFA_readLastDataBlock(uint32_t *dataArray4) +{ + uint8_t answer; + + answer = BFA_FindLastDataBlockAndSetAddress(); + if(answer != BFA_OK) + return answer; + + dataArray4[0] = *(__IO uint32_t*)(Address + 0); + dataArray4[1] = *(__IO uint32_t*)(Address + 4); + dataArray4[2] = *(__IO uint32_t*)(Address + 8); + dataArray4[3] = *(__IO uint32_t*)(Address + 12); + return BFA_OK; +} + + +uint8_t BFA_writeDataBlock(const uint32_t *dataArray4) +{ + uint8_t answer; + uint32_t dataTest[4]; + uint32_t StartAddress; + + answer = BFA_FindLastDataBlockAndSetAddress(); + Address = Address + 16; + + if((answer == BFA_EMPTY) || (Address >= FLASH_USER_END_ADDR) || (Address < FLASH_USER_START_ADDR)) + Address = FLASH_USER_START_ADDR; + + dataTest[0] = *(__IO uint32_t*)(Address + 0); + dataTest[1] = *(__IO uint32_t*)(Address + 4); + dataTest[2] = *(__IO uint32_t*)(Address + 8); + dataTest[3] = *(__IO uint32_t*)(Address + 12); + + for(int i=0;i<4;i++) + { + if(dataTest[i] != 0xFFFFFFFF) + { + return 0; +// answer = BFA_eraseSectorsAll(); +// break; + } + else + answer = BFA_OK; + } + + // can I write? + if(answer != BFA_OK) + return answer; + + StartAddress = Address; + HAL_FLASH_Unlock(); + for(int i=0;i<4;i++) + { + answer = HAL_FLASH_Program(TYPEPROGRAM_WORD, Address, dataArray4[i]); + Address = Address + 4; + } + HAL_FLASH_Lock(); + Address = StartAddress; // back to start of this data set (for reading etc.) + return answer; +} + + +/* Private functions ---------------------------------------------------------*/ +/* +uint8_t BFA_eraseSectorsAll(void) +{ + return BFA_eraseSectors(FLASH_USER_START_ADDR, (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR)/FLASH_SECTOR_SIZE_128KB); +} + + +uint8_t BFA_eraseSectors(uint32_t SectorAddress, uint32_t NbSectors) +{ + if((NbSectors > 1) || (SectorAddress != FLASH_USER_START_ADDR)) + return 0; + + uint8_t answer; + uint32_t PageError = 0; + + HAL_FLASH_Unlock(); + + EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;//ERASE_SECTORS; + EraseInitStruct.Sector = SectorAddress; + EraseInitStruct.NbSectors = NbSectors; + + answer = HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); + + HAL_FLASH_Lock(); + return answer; +} +*/ + +uint8_t BFA_FindLastDataBlockAndSetAddress(void) +{ + uint32_t StartAddress; + + // first part from here to the end + // there it should be, most likely at Address itself + if(Address == 0) + Address = FLASH_USER_END_ADDR - 16; + else + Address &= 0xFFFFFFF0; // align with 16Byte + + StartAddress = Address; + while (Address >= FLASH_USER_START_ADDR) + { + data32 = *(__IO uint32_t*)Address; + if(data32 != 0xFFFFFFFF) + { + return BFA_OK; + } + Address = Address - 16; + } + + // second part from the end to here + if(StartAddress == FLASH_USER_END_ADDR - 16) + return BFA_EMPTY; + + Address = FLASH_USER_END_ADDR - 16; + while (Address > StartAddress) + { + data32 = *(__IO uint32_t*)Address; + if(data32 != 0xFFFFFFFF) + { + return BFA_OK; + } + Address = Address - 16; + } + + // empty flash + return BFA_EMPTY; +} +/** + * @} + */ + +/************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ + +