Proyecto ABInBev para la tarjeta Guaria 1/2.

Committer:
fmanzano_dtk
Date:
Thu Jul 07 16:17:25 2022 +0000
Revision:
19:5580a9a54ad5
Parent:
16:772ea817ec43
Sincronizacion;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fmanzano_dtk 5:07720e3f99d2 1 /**
fmanzano_dtk 5:07720e3f99d2 2 ******************************************************************************
fmanzano_dtk 5:07720e3f99d2 3 * @file EEPROM/EEPROM_Emulation/src/eeprom.c
fmanzano_dtk 5:07720e3f99d2 4 * @author MCD Application Team
fmanzano_dtk 5:07720e3f99d2 5 * @brief This file provides all the EEPROM emulation firmware functions.
fmanzano_dtk 5:07720e3f99d2 6 ******************************************************************************
fmanzano_dtk 5:07720e3f99d2 7 * @attention
fmanzano_dtk 5:07720e3f99d2 8 *
fmanzano_dtk 5:07720e3f99d2 9 * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
fmanzano_dtk 5:07720e3f99d2 10 * All rights reserved.</center></h2>
fmanzano_dtk 5:07720e3f99d2 11 *
fmanzano_dtk 5:07720e3f99d2 12 * This software component is licensed by ST under Ultimate Liberty license
fmanzano_dtk 5:07720e3f99d2 13 * SLA0044, the "License"; You may not use this file except in compliance with
fmanzano_dtk 5:07720e3f99d2 14 * the License. You may obtain a copy of the License at:
fmanzano_dtk 5:07720e3f99d2 15 * www.st.com/SLA0044
fmanzano_dtk 5:07720e3f99d2 16 *
fmanzano_dtk 5:07720e3f99d2 17 ******************************************************************************
fmanzano_dtk 5:07720e3f99d2 18 */
fmanzano_dtk 5:07720e3f99d2 19 /** @addtogroup EEPROM_Emulation
fmanzano_dtk 5:07720e3f99d2 20 * @{
fmanzano_dtk 5:07720e3f99d2 21 */
fmanzano_dtk 5:07720e3f99d2 22
fmanzano_dtk 5:07720e3f99d2 23 /* Includes ------------------------------------------------------------------*/
fmanzano_dtk 5:07720e3f99d2 24 #include "flash_eeprom.h"
fmanzano_dtk 16:772ea817ec43 25 //#include "stm32f4xx_hal.h"
fmanzano_dtk 16:772ea817ec43 26 #include <ctype.h>
fmanzano_dtk 5:07720e3f99d2 27
fmanzano_dtk 5:07720e3f99d2 28 /* Private typedef -----------------------------------------------------------*/
fmanzano_dtk 5:07720e3f99d2 29 /* Private define ------------------------------------------------------------*/
fmanzano_dtk 5:07720e3f99d2 30 /* Private macro -------------------------------------------------------------*/
fmanzano_dtk 5:07720e3f99d2 31 /* Private variables ---------------------------------------------------------*/
fmanzano_dtk 5:07720e3f99d2 32
fmanzano_dtk 5:07720e3f99d2 33 /* Global variable used to store variable value in read sequence */
fmanzano_dtk 5:07720e3f99d2 34 uint16_t DataVar = 0;
fmanzano_dtk 5:07720e3f99d2 35
fmanzano_dtk 5:07720e3f99d2 36 /* Virtual address defined by the user: 0xFFFF value is prohibited */
fmanzano_dtk 5:07720e3f99d2 37 extern uint16_t VirtAddVarTab[NB_OF_VAR];
fmanzano_dtk 5:07720e3f99d2 38
fmanzano_dtk 5:07720e3f99d2 39 /* Private function prototypes -----------------------------------------------*/
fmanzano_dtk 5:07720e3f99d2 40 /* Private functions ---------------------------------------------------------*/
fmanzano_dtk 5:07720e3f99d2 41 static HAL_StatusTypeDef EE_Format(void);
fmanzano_dtk 5:07720e3f99d2 42 static uint16_t EE_FindValidPage(uint8_t Operation);
fmanzano_dtk 5:07720e3f99d2 43 static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data);
fmanzano_dtk 5:07720e3f99d2 44 static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data);
fmanzano_dtk 5:07720e3f99d2 45 static uint16_t EE_VerifyPageFullyErased(uint32_t Address);
fmanzano_dtk 5:07720e3f99d2 46
fmanzano_dtk 5:07720e3f99d2 47 /**
fmanzano_dtk 5:07720e3f99d2 48 * @brief Restore the pages to a known good state in case of page's status
fmanzano_dtk 5:07720e3f99d2 49 * corruption after a power loss.
fmanzano_dtk 5:07720e3f99d2 50 * @param None.
fmanzano_dtk 5:07720e3f99d2 51 * @retval - Flash error code: on write Flash error
fmanzano_dtk 5:07720e3f99d2 52 * - FLASH_COMPLETE: on success
fmanzano_dtk 5:07720e3f99d2 53 */
fmanzano_dtk 5:07720e3f99d2 54 uint16_t EE_Init(void)
fmanzano_dtk 5:07720e3f99d2 55 {
fmanzano_dtk 5:07720e3f99d2 56 uint16_t PageStatus0 = 6, PageStatus1 = 6;
fmanzano_dtk 5:07720e3f99d2 57 uint16_t VarIdx = 0;
fmanzano_dtk 5:07720e3f99d2 58 uint16_t EepromStatus = 0, ReadStatus = 0;
fmanzano_dtk 5:07720e3f99d2 59 int16_t x = -1;
fmanzano_dtk 5:07720e3f99d2 60 HAL_StatusTypeDef FlashStatus;
fmanzano_dtk 5:07720e3f99d2 61 uint32_t SectorError = 0;
fmanzano_dtk 5:07720e3f99d2 62 FLASH_EraseInitTypeDef pEraseInit;
fmanzano_dtk 5:07720e3f99d2 63
fmanzano_dtk 5:07720e3f99d2 64
fmanzano_dtk 5:07720e3f99d2 65 /* Get Page0 status */
fmanzano_dtk 5:07720e3f99d2 66 PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
fmanzano_dtk 5:07720e3f99d2 67 /* Get Page1 status */
fmanzano_dtk 5:07720e3f99d2 68 PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
fmanzano_dtk 5:07720e3f99d2 69
fmanzano_dtk 5:07720e3f99d2 70 pEraseInit.TypeErase = TYPEERASE_SECTORS;
fmanzano_dtk 5:07720e3f99d2 71 pEraseInit.Sector = PAGE0_ID;
fmanzano_dtk 5:07720e3f99d2 72 pEraseInit.NbSectors = 1;
fmanzano_dtk 5:07720e3f99d2 73 pEraseInit.VoltageRange = VOLTAGE_RANGE;
fmanzano_dtk 5:07720e3f99d2 74
fmanzano_dtk 5:07720e3f99d2 75 /* Check for invalid header states and repair if necessary */
fmanzano_dtk 5:07720e3f99d2 76 switch (PageStatus0)
fmanzano_dtk 5:07720e3f99d2 77 {
fmanzano_dtk 5:07720e3f99d2 78 case ERASED:
fmanzano_dtk 5:07720e3f99d2 79 if (PageStatus1 == VALID_PAGE) /* Page0 erased, Page1 valid */
fmanzano_dtk 5:07720e3f99d2 80 {
fmanzano_dtk 5:07720e3f99d2 81 /* Erase Page0 */
fmanzano_dtk 5:07720e3f99d2 82 if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
fmanzano_dtk 5:07720e3f99d2 83 {
fmanzano_dtk 5:07720e3f99d2 84 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
fmanzano_dtk 5:07720e3f99d2 85 /* If erase operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 86 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 87 {
fmanzano_dtk 5:07720e3f99d2 88 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 89 }
fmanzano_dtk 5:07720e3f99d2 90 }
fmanzano_dtk 5:07720e3f99d2 91 }
fmanzano_dtk 5:07720e3f99d2 92 else if (PageStatus1 == RECEIVE_DATA) /* Page0 erased, Page1 receive */
fmanzano_dtk 5:07720e3f99d2 93 {
fmanzano_dtk 5:07720e3f99d2 94 /* Erase Page0 */
fmanzano_dtk 5:07720e3f99d2 95 if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
fmanzano_dtk 5:07720e3f99d2 96 {
fmanzano_dtk 5:07720e3f99d2 97 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
fmanzano_dtk 5:07720e3f99d2 98 /* If erase operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 99 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 100 {
fmanzano_dtk 5:07720e3f99d2 101 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 102 }
fmanzano_dtk 5:07720e3f99d2 103 }
fmanzano_dtk 5:07720e3f99d2 104 /* Mark Page1 as valid */
fmanzano_dtk 5:07720e3f99d2 105 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE);
fmanzano_dtk 5:07720e3f99d2 106 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 107 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 108 {
fmanzano_dtk 5:07720e3f99d2 109 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 110 }
fmanzano_dtk 5:07720e3f99d2 111 }
fmanzano_dtk 5:07720e3f99d2 112 else /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */
fmanzano_dtk 5:07720e3f99d2 113 {
fmanzano_dtk 5:07720e3f99d2 114 /* Erase both Page0 and Page1 and set Page0 as valid page */
fmanzano_dtk 5:07720e3f99d2 115 FlashStatus = EE_Format();
fmanzano_dtk 5:07720e3f99d2 116 /* If erase/program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 117 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 118 {
fmanzano_dtk 5:07720e3f99d2 119 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 120 }
fmanzano_dtk 5:07720e3f99d2 121 }
fmanzano_dtk 5:07720e3f99d2 122 break;
fmanzano_dtk 5:07720e3f99d2 123
fmanzano_dtk 5:07720e3f99d2 124 case RECEIVE_DATA:
fmanzano_dtk 5:07720e3f99d2 125 if (PageStatus1 == VALID_PAGE) /* Page0 receive, Page1 valid */
fmanzano_dtk 5:07720e3f99d2 126 {
fmanzano_dtk 5:07720e3f99d2 127 /* Transfer data from Page1 to Page0 */
fmanzano_dtk 5:07720e3f99d2 128 for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
fmanzano_dtk 5:07720e3f99d2 129 {
fmanzano_dtk 5:07720e3f99d2 130 if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])
fmanzano_dtk 5:07720e3f99d2 131 {
fmanzano_dtk 5:07720e3f99d2 132 x = VarIdx;
fmanzano_dtk 5:07720e3f99d2 133 }
fmanzano_dtk 5:07720e3f99d2 134 if (VarIdx != x)
fmanzano_dtk 5:07720e3f99d2 135 {
fmanzano_dtk 5:07720e3f99d2 136 /* Read the last variables' updates */
fmanzano_dtk 5:07720e3f99d2 137 ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
fmanzano_dtk 5:07720e3f99d2 138 /* In case variable corresponding to the virtual address was found */
fmanzano_dtk 5:07720e3f99d2 139 if (ReadStatus != 0x1)
fmanzano_dtk 5:07720e3f99d2 140 {
fmanzano_dtk 5:07720e3f99d2 141 /* Transfer the variable to the Page0 */
fmanzano_dtk 5:07720e3f99d2 142 EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
fmanzano_dtk 5:07720e3f99d2 143 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 144 if (EepromStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 145 {
fmanzano_dtk 5:07720e3f99d2 146 return EepromStatus;
fmanzano_dtk 5:07720e3f99d2 147 }
fmanzano_dtk 5:07720e3f99d2 148 }
fmanzano_dtk 5:07720e3f99d2 149 }
fmanzano_dtk 5:07720e3f99d2 150 }
fmanzano_dtk 5:07720e3f99d2 151 /* Mark Page0 as valid */
fmanzano_dtk 5:07720e3f99d2 152 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE);
fmanzano_dtk 5:07720e3f99d2 153 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 154 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 155 {
fmanzano_dtk 5:07720e3f99d2 156 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 157 }
fmanzano_dtk 5:07720e3f99d2 158 pEraseInit.Sector = PAGE1_ID;
fmanzano_dtk 5:07720e3f99d2 159 pEraseInit.NbSectors = 1;
fmanzano_dtk 5:07720e3f99d2 160 pEraseInit.VoltageRange = VOLTAGE_RANGE;
fmanzano_dtk 5:07720e3f99d2 161 /* Erase Page1 */
fmanzano_dtk 5:07720e3f99d2 162 if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
fmanzano_dtk 5:07720e3f99d2 163 {
fmanzano_dtk 5:07720e3f99d2 164 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
fmanzano_dtk 5:07720e3f99d2 165 /* If erase operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 166 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 167 {
fmanzano_dtk 5:07720e3f99d2 168 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 169 }
fmanzano_dtk 5:07720e3f99d2 170 }
fmanzano_dtk 5:07720e3f99d2 171 }
fmanzano_dtk 5:07720e3f99d2 172 else if (PageStatus1 == ERASED) /* Page0 receive, Page1 erased */
fmanzano_dtk 5:07720e3f99d2 173 {
fmanzano_dtk 5:07720e3f99d2 174 pEraseInit.Sector = PAGE1_ID;
fmanzano_dtk 5:07720e3f99d2 175 pEraseInit.NbSectors = 1;
fmanzano_dtk 5:07720e3f99d2 176 pEraseInit.VoltageRange = VOLTAGE_RANGE;
fmanzano_dtk 5:07720e3f99d2 177 /* Erase Page1 */
fmanzano_dtk 5:07720e3f99d2 178 if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
fmanzano_dtk 5:07720e3f99d2 179 {
fmanzano_dtk 5:07720e3f99d2 180 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
fmanzano_dtk 5:07720e3f99d2 181 /* If erase operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 182 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 183 {
fmanzano_dtk 5:07720e3f99d2 184 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 185 }
fmanzano_dtk 5:07720e3f99d2 186 }
fmanzano_dtk 5:07720e3f99d2 187 /* Mark Page0 as valid */
fmanzano_dtk 5:07720e3f99d2 188 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE);
fmanzano_dtk 5:07720e3f99d2 189 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 190 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 191 {
fmanzano_dtk 5:07720e3f99d2 192 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 193 }
fmanzano_dtk 5:07720e3f99d2 194 }
fmanzano_dtk 5:07720e3f99d2 195 else /* Invalid state -> format eeprom */
fmanzano_dtk 5:07720e3f99d2 196 {
fmanzano_dtk 5:07720e3f99d2 197 /* Erase both Page0 and Page1 and set Page0 as valid page */
fmanzano_dtk 5:07720e3f99d2 198 FlashStatus = EE_Format();
fmanzano_dtk 5:07720e3f99d2 199 /* If erase/program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 200 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 201 {
fmanzano_dtk 5:07720e3f99d2 202 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 203 }
fmanzano_dtk 5:07720e3f99d2 204 }
fmanzano_dtk 5:07720e3f99d2 205 break;
fmanzano_dtk 5:07720e3f99d2 206
fmanzano_dtk 5:07720e3f99d2 207 case VALID_PAGE:
fmanzano_dtk 5:07720e3f99d2 208 if (PageStatus1 == VALID_PAGE) /* Invalid state -> format eeprom */
fmanzano_dtk 5:07720e3f99d2 209 {
fmanzano_dtk 5:07720e3f99d2 210 /* Erase both Page0 and Page1 and set Page0 as valid page */
fmanzano_dtk 5:07720e3f99d2 211 FlashStatus = EE_Format();
fmanzano_dtk 5:07720e3f99d2 212 /* If erase/program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 213 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 214 {
fmanzano_dtk 5:07720e3f99d2 215 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 216 }
fmanzano_dtk 5:07720e3f99d2 217 }
fmanzano_dtk 5:07720e3f99d2 218 else if (PageStatus1 == ERASED) /* Page0 valid, Page1 erased */
fmanzano_dtk 5:07720e3f99d2 219 {
fmanzano_dtk 5:07720e3f99d2 220 pEraseInit.Sector = PAGE1_ID;
fmanzano_dtk 5:07720e3f99d2 221 pEraseInit.NbSectors = 1;
fmanzano_dtk 5:07720e3f99d2 222 pEraseInit.VoltageRange = VOLTAGE_RANGE;
fmanzano_dtk 5:07720e3f99d2 223 /* Erase Page1 */
fmanzano_dtk 5:07720e3f99d2 224 if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
fmanzano_dtk 5:07720e3f99d2 225 {
fmanzano_dtk 5:07720e3f99d2 226 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
fmanzano_dtk 5:07720e3f99d2 227 /* If erase operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 228 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 229 {
fmanzano_dtk 5:07720e3f99d2 230 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 231 }
fmanzano_dtk 5:07720e3f99d2 232 }
fmanzano_dtk 5:07720e3f99d2 233 }
fmanzano_dtk 5:07720e3f99d2 234 else /* Page0 valid, Page1 receive */
fmanzano_dtk 5:07720e3f99d2 235 {
fmanzano_dtk 5:07720e3f99d2 236 /* Transfer data from Page0 to Page1 */
fmanzano_dtk 5:07720e3f99d2 237 for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
fmanzano_dtk 5:07720e3f99d2 238 {
fmanzano_dtk 5:07720e3f99d2 239 if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])
fmanzano_dtk 5:07720e3f99d2 240 {
fmanzano_dtk 5:07720e3f99d2 241 x = VarIdx;
fmanzano_dtk 5:07720e3f99d2 242 }
fmanzano_dtk 5:07720e3f99d2 243 if (VarIdx != x)
fmanzano_dtk 5:07720e3f99d2 244 {
fmanzano_dtk 5:07720e3f99d2 245 /* Read the last variables' updates */
fmanzano_dtk 5:07720e3f99d2 246 ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
fmanzano_dtk 5:07720e3f99d2 247 /* In case variable corresponding to the virtual address was found */
fmanzano_dtk 5:07720e3f99d2 248 if (ReadStatus != 0x1)
fmanzano_dtk 5:07720e3f99d2 249 {
fmanzano_dtk 5:07720e3f99d2 250 /* Transfer the variable to the Page1 */
fmanzano_dtk 5:07720e3f99d2 251 EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
fmanzano_dtk 5:07720e3f99d2 252 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 253 if (EepromStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 254 {
fmanzano_dtk 5:07720e3f99d2 255 return EepromStatus;
fmanzano_dtk 5:07720e3f99d2 256 }
fmanzano_dtk 5:07720e3f99d2 257 }
fmanzano_dtk 5:07720e3f99d2 258 }
fmanzano_dtk 5:07720e3f99d2 259 }
fmanzano_dtk 5:07720e3f99d2 260 /* Mark Page1 as valid */
fmanzano_dtk 5:07720e3f99d2 261 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE);
fmanzano_dtk 5:07720e3f99d2 262 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 263 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 264 {
fmanzano_dtk 5:07720e3f99d2 265 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 266 }
fmanzano_dtk 5:07720e3f99d2 267 pEraseInit.Sector = PAGE0_ID;
fmanzano_dtk 5:07720e3f99d2 268 pEraseInit.NbSectors = 1;
fmanzano_dtk 5:07720e3f99d2 269 pEraseInit.VoltageRange = VOLTAGE_RANGE;
fmanzano_dtk 5:07720e3f99d2 270 /* Erase Page0 */
fmanzano_dtk 5:07720e3f99d2 271 if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
fmanzano_dtk 5:07720e3f99d2 272 {
fmanzano_dtk 5:07720e3f99d2 273 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
fmanzano_dtk 5:07720e3f99d2 274 /* If erase operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 275 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 276 {
fmanzano_dtk 5:07720e3f99d2 277 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 278 }
fmanzano_dtk 5:07720e3f99d2 279 }
fmanzano_dtk 5:07720e3f99d2 280 }
fmanzano_dtk 5:07720e3f99d2 281 break;
fmanzano_dtk 5:07720e3f99d2 282
fmanzano_dtk 5:07720e3f99d2 283 default: /* Any other state -> format eeprom */
fmanzano_dtk 5:07720e3f99d2 284 /* Erase both Page0 and Page1 and set Page0 as valid page */
fmanzano_dtk 5:07720e3f99d2 285 FlashStatus = EE_Format();
fmanzano_dtk 5:07720e3f99d2 286 /* If erase/program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 287 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 288 {
fmanzano_dtk 5:07720e3f99d2 289 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 290 }
fmanzano_dtk 5:07720e3f99d2 291 break;
fmanzano_dtk 5:07720e3f99d2 292 }
fmanzano_dtk 5:07720e3f99d2 293
fmanzano_dtk 5:07720e3f99d2 294 return HAL_OK;
fmanzano_dtk 5:07720e3f99d2 295 }
fmanzano_dtk 5:07720e3f99d2 296
fmanzano_dtk 5:07720e3f99d2 297 /**
fmanzano_dtk 5:07720e3f99d2 298 * @brief Verify if specified page is fully erased.
fmanzano_dtk 5:07720e3f99d2 299 * @param Address: page address
fmanzano_dtk 5:07720e3f99d2 300 * This parameter can be one of the following values:
fmanzano_dtk 5:07720e3f99d2 301 * @arg PAGE0_BASE_ADDRESS: Page0 base address
fmanzano_dtk 5:07720e3f99d2 302 * @arg PAGE1_BASE_ADDRESS: Page1 base address
fmanzano_dtk 5:07720e3f99d2 303 * @retval page fully erased status:
fmanzano_dtk 5:07720e3f99d2 304 * - 0: if Page not erased
fmanzano_dtk 5:07720e3f99d2 305 * - 1: if Page erased
fmanzano_dtk 5:07720e3f99d2 306 */
fmanzano_dtk 5:07720e3f99d2 307 uint16_t EE_VerifyPageFullyErased(uint32_t Address)
fmanzano_dtk 5:07720e3f99d2 308 {
fmanzano_dtk 5:07720e3f99d2 309 uint32_t ReadStatus = 1;
fmanzano_dtk 5:07720e3f99d2 310 uint16_t AddressValue = 0x5555;
fmanzano_dtk 5:07720e3f99d2 311
fmanzano_dtk 5:07720e3f99d2 312 /* Check each active page address starting from end */
fmanzano_dtk 5:07720e3f99d2 313 while (Address <= PAGE0_END_ADDRESS)
fmanzano_dtk 5:07720e3f99d2 314 {
fmanzano_dtk 5:07720e3f99d2 315 /* Get the current location content to be compared with virtual address */
fmanzano_dtk 5:07720e3f99d2 316 AddressValue = (*(__IO uint16_t*)Address);
fmanzano_dtk 5:07720e3f99d2 317
fmanzano_dtk 5:07720e3f99d2 318 /* Compare the read address with the virtual address */
fmanzano_dtk 5:07720e3f99d2 319 if (AddressValue != ERASED)
fmanzano_dtk 5:07720e3f99d2 320 {
fmanzano_dtk 5:07720e3f99d2 321
fmanzano_dtk 5:07720e3f99d2 322 /* In case variable value is read, reset ReadStatus flag */
fmanzano_dtk 5:07720e3f99d2 323 ReadStatus = 0;
fmanzano_dtk 5:07720e3f99d2 324
fmanzano_dtk 5:07720e3f99d2 325 break;
fmanzano_dtk 5:07720e3f99d2 326 }
fmanzano_dtk 5:07720e3f99d2 327 /* Next address location */
fmanzano_dtk 5:07720e3f99d2 328 Address = Address + 4;
fmanzano_dtk 5:07720e3f99d2 329 }
fmanzano_dtk 5:07720e3f99d2 330
fmanzano_dtk 5:07720e3f99d2 331 /* Return ReadStatus value: (0: Page not erased, 1: Sector erased) */
fmanzano_dtk 5:07720e3f99d2 332 return ReadStatus;
fmanzano_dtk 5:07720e3f99d2 333 }
fmanzano_dtk 5:07720e3f99d2 334
fmanzano_dtk 5:07720e3f99d2 335 /**
fmanzano_dtk 5:07720e3f99d2 336 * @brief Returns the last stored variable data, if found, which correspond to
fmanzano_dtk 5:07720e3f99d2 337 * the passed virtual address
fmanzano_dtk 5:07720e3f99d2 338 * @param VirtAddress: Variable virtual address
fmanzano_dtk 5:07720e3f99d2 339 * @param Data: Global variable contains the read variable value
fmanzano_dtk 5:07720e3f99d2 340 * @retval Success or error status:
fmanzano_dtk 5:07720e3f99d2 341 * - 0: if variable was found
fmanzano_dtk 5:07720e3f99d2 342 * - 1: if the variable was not found
fmanzano_dtk 5:07720e3f99d2 343 * - NO_VALID_PAGE: if no valid page was found.
fmanzano_dtk 5:07720e3f99d2 344 */
fmanzano_dtk 5:07720e3f99d2 345 uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
fmanzano_dtk 5:07720e3f99d2 346 {
fmanzano_dtk 5:07720e3f99d2 347 uint16_t ValidPage = PAGE0;
fmanzano_dtk 5:07720e3f99d2 348 uint16_t AddressValue = 0x5555, ReadStatus = 1;
fmanzano_dtk 5:07720e3f99d2 349 uint32_t Address = EEPROM_START_ADDRESS, PageStartAddress = EEPROM_START_ADDRESS;
fmanzano_dtk 5:07720e3f99d2 350
fmanzano_dtk 5:07720e3f99d2 351 /* Get active Page for read operation */
fmanzano_dtk 5:07720e3f99d2 352 ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE);
fmanzano_dtk 5:07720e3f99d2 353
fmanzano_dtk 5:07720e3f99d2 354 /* Check if there is no valid page */
fmanzano_dtk 5:07720e3f99d2 355 if (ValidPage == NO_VALID_PAGE)
fmanzano_dtk 5:07720e3f99d2 356 {
fmanzano_dtk 5:07720e3f99d2 357 return NO_VALID_PAGE;
fmanzano_dtk 5:07720e3f99d2 358 }
fmanzano_dtk 5:07720e3f99d2 359
fmanzano_dtk 5:07720e3f99d2 360 /* Get the valid Page start Address */
fmanzano_dtk 5:07720e3f99d2 361 PageStartAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
fmanzano_dtk 5:07720e3f99d2 362
fmanzano_dtk 5:07720e3f99d2 363 /* Get the valid Page end Address */
fmanzano_dtk 5:07720e3f99d2 364 Address = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE));
fmanzano_dtk 5:07720e3f99d2 365
fmanzano_dtk 5:07720e3f99d2 366 /* Check each active page address starting from end */
fmanzano_dtk 5:07720e3f99d2 367 while (Address > (PageStartAddress + 2))
fmanzano_dtk 5:07720e3f99d2 368 {
fmanzano_dtk 5:07720e3f99d2 369 /* Get the current location content to be compared with virtual address */
fmanzano_dtk 5:07720e3f99d2 370 AddressValue = (*(__IO uint16_t*)Address);
fmanzano_dtk 5:07720e3f99d2 371
fmanzano_dtk 5:07720e3f99d2 372 /* Compare the read address with the virtual address */
fmanzano_dtk 5:07720e3f99d2 373 if (AddressValue == VirtAddress)
fmanzano_dtk 5:07720e3f99d2 374 {
fmanzano_dtk 5:07720e3f99d2 375 /* Get content of Address-2 which is variable value */
fmanzano_dtk 5:07720e3f99d2 376 *Data = (*(__IO uint16_t*)(Address - 2));
fmanzano_dtk 5:07720e3f99d2 377
fmanzano_dtk 5:07720e3f99d2 378 /* In case variable value is read, reset ReadStatus flag */
fmanzano_dtk 5:07720e3f99d2 379 ReadStatus = 0;
fmanzano_dtk 5:07720e3f99d2 380
fmanzano_dtk 5:07720e3f99d2 381 break;
fmanzano_dtk 5:07720e3f99d2 382 }
fmanzano_dtk 5:07720e3f99d2 383 else
fmanzano_dtk 5:07720e3f99d2 384 {
fmanzano_dtk 5:07720e3f99d2 385 /* Next address location */
fmanzano_dtk 5:07720e3f99d2 386 Address = Address - 4;
fmanzano_dtk 5:07720e3f99d2 387 }
fmanzano_dtk 5:07720e3f99d2 388 }
fmanzano_dtk 5:07720e3f99d2 389
fmanzano_dtk 5:07720e3f99d2 390 /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */
fmanzano_dtk 5:07720e3f99d2 391 return ReadStatus;
fmanzano_dtk 5:07720e3f99d2 392 }
fmanzano_dtk 5:07720e3f99d2 393
fmanzano_dtk 5:07720e3f99d2 394 /**
fmanzano_dtk 5:07720e3f99d2 395 * @brief Writes/upadtes variable data in EEPROM.
fmanzano_dtk 5:07720e3f99d2 396 * @param VirtAddress: Variable virtual address
fmanzano_dtk 5:07720e3f99d2 397 * @param Data: 16 bit data to be written
fmanzano_dtk 5:07720e3f99d2 398 * @retval Success or error status:
fmanzano_dtk 5:07720e3f99d2 399 * - FLASH_COMPLETE: on success
fmanzano_dtk 5:07720e3f99d2 400 * - PAGE_FULL: if valid page is full
fmanzano_dtk 5:07720e3f99d2 401 * - NO_VALID_PAGE: if no valid page was found
fmanzano_dtk 5:07720e3f99d2 402 * - Flash error code: on write Flash error
fmanzano_dtk 5:07720e3f99d2 403 */
fmanzano_dtk 5:07720e3f99d2 404 uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
fmanzano_dtk 5:07720e3f99d2 405 {
fmanzano_dtk 5:07720e3f99d2 406 uint16_t Status = 0;
fmanzano_dtk 5:07720e3f99d2 407
fmanzano_dtk 5:07720e3f99d2 408 /* Write the variable virtual address and value in the EEPROM */
fmanzano_dtk 5:07720e3f99d2 409 Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data);
fmanzano_dtk 5:07720e3f99d2 410
fmanzano_dtk 5:07720e3f99d2 411 /* In case the EEPROM active page is full */
fmanzano_dtk 5:07720e3f99d2 412 if (Status == PAGE_FULL)
fmanzano_dtk 5:07720e3f99d2 413 {
fmanzano_dtk 5:07720e3f99d2 414 /* Perform Page transfer */
fmanzano_dtk 5:07720e3f99d2 415 Status = EE_PageTransfer(VirtAddress, Data);
fmanzano_dtk 5:07720e3f99d2 416 }
fmanzano_dtk 5:07720e3f99d2 417
fmanzano_dtk 5:07720e3f99d2 418 /* Return last operation status */
fmanzano_dtk 5:07720e3f99d2 419 return Status;
fmanzano_dtk 5:07720e3f99d2 420 }
fmanzano_dtk 5:07720e3f99d2 421
fmanzano_dtk 5:07720e3f99d2 422 /**
fmanzano_dtk 5:07720e3f99d2 423 * @brief Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE
fmanzano_dtk 5:07720e3f99d2 424 * @param None
fmanzano_dtk 5:07720e3f99d2 425 * @retval Status of the last operation (Flash write or erase) done during
fmanzano_dtk 5:07720e3f99d2 426 * EEPROM formating
fmanzano_dtk 5:07720e3f99d2 427 */
fmanzano_dtk 5:07720e3f99d2 428 static HAL_StatusTypeDef EE_Format(void)
fmanzano_dtk 5:07720e3f99d2 429 {
fmanzano_dtk 5:07720e3f99d2 430 HAL_StatusTypeDef FlashStatus = HAL_OK;
fmanzano_dtk 5:07720e3f99d2 431 uint32_t SectorError = 0;
fmanzano_dtk 5:07720e3f99d2 432 FLASH_EraseInitTypeDef pEraseInit;
fmanzano_dtk 5:07720e3f99d2 433
fmanzano_dtk 5:07720e3f99d2 434 pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
fmanzano_dtk 5:07720e3f99d2 435 pEraseInit.Sector = PAGE0_ID;
fmanzano_dtk 5:07720e3f99d2 436 pEraseInit.NbSectors = 1;
fmanzano_dtk 5:07720e3f99d2 437 pEraseInit.VoltageRange = VOLTAGE_RANGE;
fmanzano_dtk 5:07720e3f99d2 438 /* Erase Page0 */
fmanzano_dtk 5:07720e3f99d2 439 if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
fmanzano_dtk 5:07720e3f99d2 440 {
fmanzano_dtk 5:07720e3f99d2 441 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
fmanzano_dtk 5:07720e3f99d2 442 /* If erase operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 443 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 444 {
fmanzano_dtk 5:07720e3f99d2 445 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 446 }
fmanzano_dtk 5:07720e3f99d2 447 }
fmanzano_dtk 5:07720e3f99d2 448 /* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */
fmanzano_dtk 5:07720e3f99d2 449 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE);
fmanzano_dtk 5:07720e3f99d2 450 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 451 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 452 {
fmanzano_dtk 5:07720e3f99d2 453 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 454 }
fmanzano_dtk 5:07720e3f99d2 455
fmanzano_dtk 5:07720e3f99d2 456 pEraseInit.Sector = PAGE1_ID;
fmanzano_dtk 5:07720e3f99d2 457 /* Erase Page1 */
fmanzano_dtk 5:07720e3f99d2 458 if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
fmanzano_dtk 5:07720e3f99d2 459 {
fmanzano_dtk 5:07720e3f99d2 460 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
fmanzano_dtk 5:07720e3f99d2 461 /* If erase operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 462 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 463 {
fmanzano_dtk 5:07720e3f99d2 464 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 465 }
fmanzano_dtk 5:07720e3f99d2 466 }
fmanzano_dtk 5:07720e3f99d2 467
fmanzano_dtk 5:07720e3f99d2 468 return HAL_OK;
fmanzano_dtk 5:07720e3f99d2 469 }
fmanzano_dtk 5:07720e3f99d2 470
fmanzano_dtk 5:07720e3f99d2 471 /**
fmanzano_dtk 5:07720e3f99d2 472 * @brief Find valid Page for write or read operation
fmanzano_dtk 5:07720e3f99d2 473 * @param Operation: operation to achieve on the valid page.
fmanzano_dtk 5:07720e3f99d2 474 * This parameter can be one of the following values:
fmanzano_dtk 5:07720e3f99d2 475 * @arg READ_FROM_VALID_PAGE: read operation from valid page
fmanzano_dtk 5:07720e3f99d2 476 * @arg WRITE_IN_VALID_PAGE: write operation from valid page
fmanzano_dtk 5:07720e3f99d2 477 * @retval Valid page number (PAGE or PAGE1) or NO_VALID_PAGE in case
fmanzano_dtk 5:07720e3f99d2 478 * of no valid page was found
fmanzano_dtk 5:07720e3f99d2 479 */
fmanzano_dtk 5:07720e3f99d2 480 static uint16_t EE_FindValidPage(uint8_t Operation)
fmanzano_dtk 5:07720e3f99d2 481 {
fmanzano_dtk 5:07720e3f99d2 482 uint16_t PageStatus0 = 6, PageStatus1 = 6;
fmanzano_dtk 5:07720e3f99d2 483
fmanzano_dtk 5:07720e3f99d2 484 /* Get Page0 actual status */
fmanzano_dtk 5:07720e3f99d2 485 PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
fmanzano_dtk 5:07720e3f99d2 486
fmanzano_dtk 5:07720e3f99d2 487 /* Get Page1 actual status */
fmanzano_dtk 5:07720e3f99d2 488 PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
fmanzano_dtk 5:07720e3f99d2 489
fmanzano_dtk 5:07720e3f99d2 490 /* Write or read operation */
fmanzano_dtk 5:07720e3f99d2 491 switch (Operation)
fmanzano_dtk 5:07720e3f99d2 492 {
fmanzano_dtk 5:07720e3f99d2 493 case WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */
fmanzano_dtk 5:07720e3f99d2 494 if (PageStatus1 == VALID_PAGE)
fmanzano_dtk 5:07720e3f99d2 495 {
fmanzano_dtk 5:07720e3f99d2 496 /* Page0 receiving data */
fmanzano_dtk 5:07720e3f99d2 497 if (PageStatus0 == RECEIVE_DATA)
fmanzano_dtk 5:07720e3f99d2 498 {
fmanzano_dtk 5:07720e3f99d2 499 return PAGE0; /* Page0 valid */
fmanzano_dtk 5:07720e3f99d2 500 }
fmanzano_dtk 5:07720e3f99d2 501 else
fmanzano_dtk 5:07720e3f99d2 502 {
fmanzano_dtk 5:07720e3f99d2 503 return PAGE1; /* Page1 valid */
fmanzano_dtk 5:07720e3f99d2 504 }
fmanzano_dtk 5:07720e3f99d2 505 }
fmanzano_dtk 5:07720e3f99d2 506 else if (PageStatus0 == VALID_PAGE)
fmanzano_dtk 5:07720e3f99d2 507 {
fmanzano_dtk 5:07720e3f99d2 508 /* Page1 receiving data */
fmanzano_dtk 5:07720e3f99d2 509 if (PageStatus1 == RECEIVE_DATA)
fmanzano_dtk 5:07720e3f99d2 510 {
fmanzano_dtk 5:07720e3f99d2 511 return PAGE1; /* Page1 valid */
fmanzano_dtk 5:07720e3f99d2 512 }
fmanzano_dtk 5:07720e3f99d2 513 else
fmanzano_dtk 5:07720e3f99d2 514 {
fmanzano_dtk 5:07720e3f99d2 515 return PAGE0; /* Page0 valid */
fmanzano_dtk 5:07720e3f99d2 516 }
fmanzano_dtk 5:07720e3f99d2 517 }
fmanzano_dtk 5:07720e3f99d2 518 else
fmanzano_dtk 5:07720e3f99d2 519 {
fmanzano_dtk 5:07720e3f99d2 520 return NO_VALID_PAGE; /* No valid Page */
fmanzano_dtk 5:07720e3f99d2 521 }
fmanzano_dtk 5:07720e3f99d2 522
fmanzano_dtk 5:07720e3f99d2 523 case READ_FROM_VALID_PAGE: /* ---- Read operation ---- */
fmanzano_dtk 5:07720e3f99d2 524 if (PageStatus0 == VALID_PAGE)
fmanzano_dtk 5:07720e3f99d2 525 {
fmanzano_dtk 5:07720e3f99d2 526 return PAGE0; /* Page0 valid */
fmanzano_dtk 5:07720e3f99d2 527 }
fmanzano_dtk 5:07720e3f99d2 528 else if (PageStatus1 == VALID_PAGE)
fmanzano_dtk 5:07720e3f99d2 529 {
fmanzano_dtk 5:07720e3f99d2 530 return PAGE1; /* Page1 valid */
fmanzano_dtk 5:07720e3f99d2 531 }
fmanzano_dtk 5:07720e3f99d2 532 else
fmanzano_dtk 5:07720e3f99d2 533 {
fmanzano_dtk 5:07720e3f99d2 534 return NO_VALID_PAGE ; /* No valid Page */
fmanzano_dtk 5:07720e3f99d2 535 }
fmanzano_dtk 5:07720e3f99d2 536
fmanzano_dtk 5:07720e3f99d2 537 default:
fmanzano_dtk 5:07720e3f99d2 538 return PAGE0; /* Page0 valid */
fmanzano_dtk 5:07720e3f99d2 539 }
fmanzano_dtk 5:07720e3f99d2 540 }
fmanzano_dtk 5:07720e3f99d2 541
fmanzano_dtk 5:07720e3f99d2 542 /**
fmanzano_dtk 5:07720e3f99d2 543 * @brief Verify if active page is full and Writes variable in EEPROM.
fmanzano_dtk 5:07720e3f99d2 544 * @param VirtAddress: 16 bit virtual address of the variable
fmanzano_dtk 5:07720e3f99d2 545 * @param Data: 16 bit data to be written as variable value
fmanzano_dtk 5:07720e3f99d2 546 * @retval Success or error status:
fmanzano_dtk 5:07720e3f99d2 547 * - FLASH_COMPLETE: on success
fmanzano_dtk 5:07720e3f99d2 548 * - PAGE_FULL: if valid page is full
fmanzano_dtk 5:07720e3f99d2 549 * - NO_VALID_PAGE: if no valid page was found
fmanzano_dtk 5:07720e3f99d2 550 * - Flash error code: on write Flash error
fmanzano_dtk 5:07720e3f99d2 551 */
fmanzano_dtk 5:07720e3f99d2 552 static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data)
fmanzano_dtk 5:07720e3f99d2 553 {
fmanzano_dtk 5:07720e3f99d2 554 HAL_StatusTypeDef FlashStatus = HAL_OK;
fmanzano_dtk 5:07720e3f99d2 555 uint16_t ValidPage = PAGE0;
fmanzano_dtk 5:07720e3f99d2 556 uint32_t Address = EEPROM_START_ADDRESS, PageEndAddress = EEPROM_START_ADDRESS+PAGE_SIZE;
fmanzano_dtk 5:07720e3f99d2 557
fmanzano_dtk 5:07720e3f99d2 558 /* Get valid Page for write operation */
fmanzano_dtk 5:07720e3f99d2 559 ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE);
fmanzano_dtk 5:07720e3f99d2 560
fmanzano_dtk 5:07720e3f99d2 561 /* Check if there is no valid page */
fmanzano_dtk 5:07720e3f99d2 562 if (ValidPage == NO_VALID_PAGE)
fmanzano_dtk 5:07720e3f99d2 563 {
fmanzano_dtk 5:07720e3f99d2 564 return NO_VALID_PAGE;
fmanzano_dtk 5:07720e3f99d2 565 }
fmanzano_dtk 5:07720e3f99d2 566
fmanzano_dtk 5:07720e3f99d2 567 /* Get the valid Page start Address */
fmanzano_dtk 5:07720e3f99d2 568 Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
fmanzano_dtk 5:07720e3f99d2 569
fmanzano_dtk 5:07720e3f99d2 570 /* Get the valid Page end Address */
fmanzano_dtk 5:07720e3f99d2 571 PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 1) + (uint32_t)((ValidPage + 1) * PAGE_SIZE));
fmanzano_dtk 5:07720e3f99d2 572
fmanzano_dtk 5:07720e3f99d2 573 /* Check each active page address starting from begining */
fmanzano_dtk 5:07720e3f99d2 574 while (Address < PageEndAddress)
fmanzano_dtk 5:07720e3f99d2 575 {
fmanzano_dtk 5:07720e3f99d2 576 /* Verify if Address and Address+2 contents are 0xFFFFFFFF */
fmanzano_dtk 5:07720e3f99d2 577 if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF)
fmanzano_dtk 5:07720e3f99d2 578 {
fmanzano_dtk 5:07720e3f99d2 579 /* Set variable data */
fmanzano_dtk 5:07720e3f99d2 580 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address, Data);
fmanzano_dtk 5:07720e3f99d2 581 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 582 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 583 {
fmanzano_dtk 5:07720e3f99d2 584 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 585 }
fmanzano_dtk 5:07720e3f99d2 586 /* Set variable virtual address */
fmanzano_dtk 5:07720e3f99d2 587 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address + 2, VirtAddress);
fmanzano_dtk 5:07720e3f99d2 588 /* Return program operation status */
fmanzano_dtk 5:07720e3f99d2 589 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 590 }
fmanzano_dtk 5:07720e3f99d2 591 else
fmanzano_dtk 5:07720e3f99d2 592 {
fmanzano_dtk 5:07720e3f99d2 593 /* Next address location */
fmanzano_dtk 5:07720e3f99d2 594 Address = Address + 4;
fmanzano_dtk 5:07720e3f99d2 595 }
fmanzano_dtk 5:07720e3f99d2 596 }
fmanzano_dtk 5:07720e3f99d2 597
fmanzano_dtk 5:07720e3f99d2 598 /* Return PAGE_FULL in case the valid page is full */
fmanzano_dtk 5:07720e3f99d2 599 return PAGE_FULL;
fmanzano_dtk 5:07720e3f99d2 600 }
fmanzano_dtk 5:07720e3f99d2 601
fmanzano_dtk 5:07720e3f99d2 602 /**
fmanzano_dtk 5:07720e3f99d2 603 * @brief Transfers last updated variables data from the full Page to
fmanzano_dtk 5:07720e3f99d2 604 * an empty one.
fmanzano_dtk 5:07720e3f99d2 605 * @param VirtAddress: 16 bit virtual address of the variable
fmanzano_dtk 5:07720e3f99d2 606 * @param Data: 16 bit data to be written as variable value
fmanzano_dtk 5:07720e3f99d2 607 * @retval Success or error status:
fmanzano_dtk 5:07720e3f99d2 608 * - FLASH_COMPLETE: on success
fmanzano_dtk 5:07720e3f99d2 609 * - PAGE_FULL: if valid page is full
fmanzano_dtk 5:07720e3f99d2 610 * - NO_VALID_PAGE: if no valid page was found
fmanzano_dtk 5:07720e3f99d2 611 * - Flash error code: on write Flash error
fmanzano_dtk 5:07720e3f99d2 612 */
fmanzano_dtk 5:07720e3f99d2 613 static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
fmanzano_dtk 5:07720e3f99d2 614 {
fmanzano_dtk 5:07720e3f99d2 615 HAL_StatusTypeDef FlashStatus = HAL_OK;
fmanzano_dtk 5:07720e3f99d2 616 uint32_t NewPageAddress = EEPROM_START_ADDRESS;
fmanzano_dtk 5:07720e3f99d2 617 uint16_t OldPageId=0;
fmanzano_dtk 5:07720e3f99d2 618 uint16_t ValidPage = PAGE0, VarIdx = 0;
fmanzano_dtk 5:07720e3f99d2 619 uint16_t EepromStatus = 0, ReadStatus = 0;
fmanzano_dtk 5:07720e3f99d2 620 uint32_t SectorError = 0;
fmanzano_dtk 5:07720e3f99d2 621 FLASH_EraseInitTypeDef pEraseInit;
fmanzano_dtk 5:07720e3f99d2 622
fmanzano_dtk 5:07720e3f99d2 623 /* Get active Page for read operation */
fmanzano_dtk 5:07720e3f99d2 624 ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE);
fmanzano_dtk 5:07720e3f99d2 625
fmanzano_dtk 5:07720e3f99d2 626 if (ValidPage == PAGE1) /* Page1 valid */
fmanzano_dtk 5:07720e3f99d2 627 {
fmanzano_dtk 5:07720e3f99d2 628 /* New page address where variable will be moved to */
fmanzano_dtk 5:07720e3f99d2 629 NewPageAddress = PAGE0_BASE_ADDRESS;
fmanzano_dtk 5:07720e3f99d2 630
fmanzano_dtk 5:07720e3f99d2 631 /* Old page ID where variable will be taken from */
fmanzano_dtk 5:07720e3f99d2 632 OldPageId = PAGE1_ID;
fmanzano_dtk 5:07720e3f99d2 633 }
fmanzano_dtk 5:07720e3f99d2 634 else if (ValidPage == PAGE0) /* Page0 valid */
fmanzano_dtk 5:07720e3f99d2 635 {
fmanzano_dtk 5:07720e3f99d2 636 /* New page address where variable will be moved to */
fmanzano_dtk 5:07720e3f99d2 637 NewPageAddress = PAGE1_BASE_ADDRESS;
fmanzano_dtk 5:07720e3f99d2 638
fmanzano_dtk 5:07720e3f99d2 639 /* Old page ID where variable will be taken from */
fmanzano_dtk 5:07720e3f99d2 640 OldPageId = PAGE0_ID;
fmanzano_dtk 5:07720e3f99d2 641 }
fmanzano_dtk 5:07720e3f99d2 642 else
fmanzano_dtk 5:07720e3f99d2 643 {
fmanzano_dtk 5:07720e3f99d2 644 return NO_VALID_PAGE; /* No valid Page */
fmanzano_dtk 5:07720e3f99d2 645 }
fmanzano_dtk 5:07720e3f99d2 646
fmanzano_dtk 5:07720e3f99d2 647 /* Set the new Page status to RECEIVE_DATA status */
fmanzano_dtk 5:07720e3f99d2 648 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, RECEIVE_DATA);
fmanzano_dtk 5:07720e3f99d2 649 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 650 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 651 {
fmanzano_dtk 5:07720e3f99d2 652 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 653 }
fmanzano_dtk 5:07720e3f99d2 654
fmanzano_dtk 5:07720e3f99d2 655 /* Write the variable passed as parameter in the new active page */
fmanzano_dtk 5:07720e3f99d2 656 EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data);
fmanzano_dtk 5:07720e3f99d2 657 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 658 if (EepromStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 659 {
fmanzano_dtk 5:07720e3f99d2 660 return EepromStatus;
fmanzano_dtk 5:07720e3f99d2 661 }
fmanzano_dtk 5:07720e3f99d2 662
fmanzano_dtk 5:07720e3f99d2 663 /* Transfer process: transfer variables from old to the new active page */
fmanzano_dtk 5:07720e3f99d2 664 for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
fmanzano_dtk 5:07720e3f99d2 665 {
fmanzano_dtk 5:07720e3f99d2 666 if (VirtAddVarTab[VarIdx] != VirtAddress) /* Check each variable except the one passed as parameter */
fmanzano_dtk 5:07720e3f99d2 667 {
fmanzano_dtk 5:07720e3f99d2 668 /* Read the other last variable updates */
fmanzano_dtk 5:07720e3f99d2 669 ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
fmanzano_dtk 5:07720e3f99d2 670 /* In case variable corresponding to the virtual address was found */
fmanzano_dtk 5:07720e3f99d2 671 if (ReadStatus != 0x1)
fmanzano_dtk 5:07720e3f99d2 672 {
fmanzano_dtk 5:07720e3f99d2 673 /* Transfer the variable to the new active page */
fmanzano_dtk 5:07720e3f99d2 674 EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
fmanzano_dtk 5:07720e3f99d2 675 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 676 if (EepromStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 677 {
fmanzano_dtk 5:07720e3f99d2 678 return EepromStatus;
fmanzano_dtk 5:07720e3f99d2 679 }
fmanzano_dtk 5:07720e3f99d2 680 }
fmanzano_dtk 5:07720e3f99d2 681 }
fmanzano_dtk 5:07720e3f99d2 682 }
fmanzano_dtk 5:07720e3f99d2 683
fmanzano_dtk 5:07720e3f99d2 684 pEraseInit.TypeErase = TYPEERASE_SECTORS;
fmanzano_dtk 5:07720e3f99d2 685 pEraseInit.Sector = OldPageId;
fmanzano_dtk 5:07720e3f99d2 686 pEraseInit.NbSectors = 1;
fmanzano_dtk 5:07720e3f99d2 687 pEraseInit.VoltageRange = VOLTAGE_RANGE;
fmanzano_dtk 5:07720e3f99d2 688
fmanzano_dtk 5:07720e3f99d2 689 /* Erase the old Page: Set old Page status to ERASED status */
fmanzano_dtk 5:07720e3f99d2 690 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
fmanzano_dtk 5:07720e3f99d2 691 /* If erase operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 692 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 693 {
fmanzano_dtk 5:07720e3f99d2 694 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 695 }
fmanzano_dtk 5:07720e3f99d2 696
fmanzano_dtk 5:07720e3f99d2 697 /* Set new Page status to VALID_PAGE status */
fmanzano_dtk 5:07720e3f99d2 698 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, VALID_PAGE);
fmanzano_dtk 5:07720e3f99d2 699 /* If program operation was failed, a Flash error code is returned */
fmanzano_dtk 5:07720e3f99d2 700 if (FlashStatus != HAL_OK)
fmanzano_dtk 5:07720e3f99d2 701 {
fmanzano_dtk 5:07720e3f99d2 702 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 703 }
fmanzano_dtk 5:07720e3f99d2 704
fmanzano_dtk 5:07720e3f99d2 705 /* Return last operation flash status */
fmanzano_dtk 5:07720e3f99d2 706 return FlashStatus;
fmanzano_dtk 5:07720e3f99d2 707 }
fmanzano_dtk 5:07720e3f99d2 708
fmanzano_dtk 5:07720e3f99d2 709 /**
fmanzano_dtk 5:07720e3f99d2 710 * @}
fmanzano_dtk 5:07720e3f99d2 711 */
fmanzano_dtk 5:07720e3f99d2 712
fmanzano_dtk 5:07720e3f99d2 713 /******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/