![](/media/cache/profiles/Felicito_-_New_Avatar.jpg.50x50_q85.jpg)
Proyecto ABInBev para la tarjeta Guaria 1/2.
flash_ee/flash_eeprom.c@19:5580a9a54ad5, 2022-07-07 (annotated)
- 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?
User | Revision | Line number | New 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>© 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****/ |