source: trunk/firmware/Src/eeprom.c @ 6

Last change on this file since 6 was 6, checked in by f.jahn, 3 months ago
File size: 55.3 KB
Line 
1#include <assert.h>
2
3#include "eeprom.h"
4#include "stdio.h"
5
6#define CONCAT(a, b) CONCAT_INNER(a, b)                                                                                 // These three macros
7#define CONCAT_INNER(a, b) a ## b                                                                                               // generate unique variables
8#define UNIQUE_NAME(base) CONCAT(base, __COUNTER__)                                                             // according to template "baseX", like "base1", "base2" and etc
9
10/********************************************************/
11
12// Eeprom state related defines
13
14/*****************EEPROM_EMULATOR************************/
15
16typedef struct
17{
18  // Schnittstellenparameter
19  uint32_t        baudrate;
20  uint16_t        parityMode;
21  uint16_t        stopBits;
22  uint16_t        slave_adress;
23  uint16_t        ibn_day;
24  uint16_t        ibn_month;
25  uint16_t        ibn_year;
26  uint16_t        user_id;
27
28  // Offset und Gain
29  int16_t         batteryCurrentOffsetRefTemperatureShunt;
30  int16_t         batteryCurrentOffsetRefTemperatureChip;
31  int16_t         batteryCurrentGainRefTempShunt;
32  int16_t         batteryCurrentGainRefTempChip;
33  int16_t         batteryCurrentOffsetTemperatureCalibrationTemperature;
34  int16_t         batteryCurrentGainTemperatureCalibrationShuntTemperature;
35  int16_t         batteryCurrentGainTemperatureCalibrationChipTemperature;
36  int32_t         batteryCurrentOffsetRefshuntVoltage;
37  int32_t         batteryCurrentOffsetCommonModeCalibrationVoltage;
38  int32_t         batteryCurrentOffsetCommonModeCompensationFactor;
39  int32_t         batteryCurrentOffsetTemperatureCompensationFactor;
40  int32_t         batteryCurrentGainRefCurrent;
41  int32_t         batteryCurrentGainTemperatureCompensationShuntFactor;
42  int32_t         batteryCurrentGainTemperatureCompensationChipFactor;
43
44  int32_t         currentOffset;
45  uint32_t        currentGain;
46
47  int64_t         mAsCounter;
48  int32_t         detectedCapacity;
49  int32_t         detectedEnergy;
50  //int32_t       mAh_AutoMode;
51  //int32_t       mWh_AutoMode;
52  int64_t         mAs_AutoMode;                                                         // 160-163      Helps to restore current SoC after Reset or Shutdown
53  int64_t         mWs_AutoMode;                                                         // 164-167      Helps to restore current SoC after Reset or Shutdown
54
55  // battery parameter
56  uint16_t        cef;
57  uint16_t        peukert;
58  uint32_t        cellCapacity;
59  uint32_t        cellEnergy;
60  uint16_t        iBatFull;
61  uint16_t        tBatFull;
62  uint16_t        uBatFull;
63  uint16_t        uBatEmpty;
64  uint8_t         socCalcMode;
65  uint16_t        cellRatedDischargeTime;
66
67  // Schaltausgänge
68  uint16_t        lvpStart;                                                                     // Spannung ab der die LOW Voltage Protection aktiv wird in mV
69  uint16_t        lvpStop;                                                                      // Spannung ab der die LOW Voltage Protection wieder inaktiv wird
70  uint16_t        ovpStart;                                                                     // Spannung ab der die OVER Voltage Protection aktiv wird in mV
71  uint16_t        ovpStop;                                                                      // Spannung ab der die OVER Voltage Protection wieder inaktiv wird
72  int16_t         loadCurrentLimit;                                                     // maximaler Laststrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Laststrom Protection aktiv
73  int16_t         chargeCurrentLimit;                                           // maximaler Ladestrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Ladestrom Protection aktiv
74  int16_t         chargeStopHighTemperatureStart;                       // Abschalttemperatur Ladung wegen zu hoher Temperatur
75  int16_t         chargeStopHighTemperatureStop;                        // Wiedereinschalttemperatur
76  int16_t         chargeStopLowTemperatureStart;                        // Abschalttemperatur Ladung wegen zu niedriger Temperatur
77  int16_t         chargeStopLowTemperatureStop;                         // Wiedereinschalttemperatur
78  int16_t         dischargeStopHighTemperatureStart;            // Abschalttemperatur Entladung wegen zu hoher Temperatur
79  int16_t         dischargeStopHighTemperatureStop;                     // Wiedereinschalttemperatur
80  int16_t         dischargeStopLowTemperatureStart;                     // Abschalttemperatur EntLadung wegen zu niedriger Temperatur
81  int16_t         dischargeStopLowTemperatureStop;                      // Wiedereinschalttemperatur
82
83  int16_t         uBatEmptyCompStartTemp;                                       // We start calculating uBatEmpty compensations only when cell temperature is lower than this value
84  int16_t         uBatEmptyCompStopTemp;                                        // We stop calculating uBatEmpty compensations when cell temperature is lower than this value
85  uint16_t        uBatEmptyCompStopVolt;                                        // uBatEmpty Voltage at temperatures lower than lvpCompStopTemp
86
87  int16_t         extraDischargeStrom_mA;                                       // For example, current that consumes LiPro itself
88  uint32_t        dischargeTotalAh;
89  uint32_t        chargeTotalAh;
90  uint32_t        dischargeTotalWh;                                                     // 154-155      [mAs]
91  uint32_t        chargeTotalWh;                                                        // 156-157      [mAs]
92
93  uint16_t        cefW;
94  uint32_t        onTime;
95
96} eeprom_data_t;
97
98typedef struct
99{
100  // Schnittstellenparameter
101  uint32_t        baudrate;
102  uint16_t        parityMode;
103  uint16_t        stopBits;
104  uint16_t        slave_adress;
105  uint16_t        ibn_day;
106  uint16_t        ibn_month;
107  uint16_t        ibn_year;
108  uint16_t        user_id;
109
110  // Offset und Gain
111  int16_t         batteryCurrentOffsetRefTemperatureShunt;
112  int16_t         batteryCurrentOffsetRefTemperatureChip;
113  int16_t         batteryCurrentGainRefTempShunt;
114  int16_t         batteryCurrentGainRefTempChip;
115  int16_t         batteryCurrentOffsetTemperatureCalibrationTemperature;
116  int16_t         batteryCurrentGainTemperatureCalibrationShuntTemperature;
117  int16_t         batteryCurrentGainTemperatureCalibrationChipTemperature;
118  int32_t         batteryCurrentOffsetRefshuntVoltage;
119  int32_t         batteryCurrentOffsetCommonModeCalibrationVoltage;
120  int32_t         batteryCurrentOffsetCommonModeCompensationFactor;
121  int32_t         batteryCurrentOffsetTemperatureCompensationFactor;
122  int32_t         batteryCurrentGainRefCurrent;
123  int32_t         batteryCurrentGainTemperatureCompensationShuntFactor;
124  int32_t         batteryCurrentGainTemperatureCompensationChipFactor;
125
126  int32_t         currentOffset;
127  uint32_t        currentGain;
128
129  int64_t         mAsCounter;
130  int32_t         detectedCapacity;
131  int32_t         detectedEnergy;
132  int32_t         mAh_AutoMode;
133  int32_t         mWh_AutoMode;
134
135  // battery parameter
136  uint16_t        cef;
137  uint16_t        peukert;
138  uint32_t        cellCapacity;
139  uint32_t        cellEnergy;
140  uint16_t        iBatFull;
141  uint16_t        tBatFull;
142  uint16_t        uBatFull;
143  uint16_t        uBatEmpty;
144  uint8_t         socCalcMode;
145  uint16_t        cellRatedDischargeTime;
146
147  // Schaltausgänge
148  uint16_t        lvpStart;                                                                     // Spannung ab der die LOW Voltage Protection aktiv wird in mV
149  uint16_t        lvpStop;                                                                      // Spannung ab der die LOW Voltage Protection wieder inaktiv wird
150  uint16_t        ovpStart;                                                                     // Spannung ab der die OVER Voltage Protection aktiv wird in mV
151  uint16_t        ovpStop;                                                                      // Spannung ab der die OVER Voltage Protection wieder inaktiv wird
152  int16_t         loadCurrentLimit;                                                     // maximaler Laststrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Laststrom Protection aktiv
153  int16_t         chargeCurrentLimit;                                           // maximaler Ladestrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Ladestrom Protection aktiv
154  int16_t         chargeStopHighTemperatureStart;                       // Abschalttemperatur Ladung wegen zu hoher Temperatur
155  int16_t         chargeStopHighTemperatureStop;                        // Wiedereinschalttemperatur
156  int16_t         chargeStopLowTemperatureStart;                        // Abschalttemperatur Ladung wegen zu niedriger Temperatur
157  int16_t         chargeStopLowTemperatureStop;                         // Wiedereinschalttemperatur
158  int16_t         dischargeStopHighTemperatureStart;            // Abschalttemperatur Entladung wegen zu hoher Temperatur
159  int16_t         dischargeStopHighTemperatureStop;                     // Wiedereinschalttemperatur
160  int16_t         dischargeStopLowTemperatureStart;                     // Abschalttemperatur EntLadung wegen zu niedriger Temperatur
161  int16_t         dischargeStopLowTemperatureStop;                      // Wiedereinschalttemperatur
162
163  int16_t         uBatEmptyCompStartTemp;                                       // We start calculating uBatEmpty compensations only when cell temperature is lower than this value
164  int16_t         uBatEmptyCompStopTemp;                                        // We stop calculating uBatEmpty compensations when cell temperature is lower than this value
165  uint16_t        uBatEmptyCompStopVolt;                                        // uBatEmpty Voltage at temperatures lower than lvpCompStopTemp
166
167  int16_t         extraDischargeStrom_mA;                                       // For example, current that consumes LiPro itself
168  uint32_t        dischargeTotalAh;
169  uint32_t        chargeTotalAh;
170  uint32_t        dischargeTotalWh;                                                     // 154-155      [mAs]
171  uint32_t        chargeTotalWh;                                                        // 156-157      [mAs]
172
173  uint16_t        cefW;
174  uint32_t        onTime;
175
176}eeprom_old_data_t;
177
178// Substitute for #if sizeof(some_type) == sizeof(another_type) functionality
179#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
180
181typedef struct
182{
183  // Geräteinformation
184  uint32_t    SN;
185  uint8_t     deviceInfoWritten;
186  uint8_t     UNIQUE_NAME(reserved)[3];
187}device_info_t;
188
189typedef struct
190{
191  // Eeprom Status Infos
192   uint8_t     firstStartId;
193   uint8_t     UNIQUE_NAME(reserved)[3];
194  uint16_t     structureSize;
195  uint16_t     revisionInfo;
196  uint32_t     writeCounter;
197}eeprom_state_t;
198
199// fasse zu einer Struktur zusammen um nachher einfach darauf zugreifen zu können
200typedef struct
201{
202  eeprom_state_t eepromState;
203  device_info_t  deviceInfo;
204  eeprom_data_t  changedData;
205}eeprom_stored_data_t;
206
207typedef struct
208{
209  eeprom_state_t eepromState;
210  device_info_t  deviceInfo;
211  eeprom_old_data_t changedData;
212}eeprom_stored_old_data_t;
213
214
215// Flash related defines
216#define USER_FLASH_BASE_ADRESS                    FLASH_BASE                                                              // 0x08000000
217#define USER_FLASH_SIZE                           FLASH_SIZE                                                              // 0x00020000 - 128 kB
218#define USER_FLASH_END                            (USER_FLASH_BASE_ADRESS + USER_FLASH_SIZE)  // 0x08020000
219#define USER_FLASH_PAGE_SIZE                      (0x800)                                                                 //- 2 kB
220
221// Eeprom emulator related defines
222#define NUMBER_OF_PAGES                           (1U)
223#define USER_EEPROM_BASE_ADRESS                   (USER_FLASH_END - (USER_FLASH_PAGE_SIZE * NUMBER_OF_PAGES))             // 0x0801F800 - EEPROM start address (CONFIG_ID location)
224
225// Data to store reated defines
226//#define SIZEOF_DEFAULT_EEPROM_DATA                (sizeof(eeprom_new_data_t))
227#define SIZEOF_CHANGED_EEPROM_DATA                (sizeof(eeprom_data_t))
228#define SIZEOF_CHANGED_EEPROM_OLD_DATA            (sizeof(eeprom_old_data_t))
229#define SIZEOF_DEVICE_INFO                        (sizeof(device_info_t))
230#define SIZEOF_EEPROM_STATE                       (sizeof(eeprom_state_t))
231
232#define SIZE_OF_DATA_TO_STORE                     (SIZEOF_CHANGED_EEPROM_DATA + SIZEOF_DEVICE_INFO + SIZEOF_EEPROM_STATE)
233#define SIZE_OF_OLD_DATA_TO_STORE                 (SIZEOF_CHANGED_EEPROM_OLD_DATA + SIZEOF_DEVICE_INFO + SIZEOF_EEPROM_STATE)
234
235// Adress related defines
236#define EEPROM_ADRESS_FIRST_START_ID              (USER_EEPROM_BASE_ADRESS)// - 1 + SIZE_OF_DATA_TO_STORE - 1 - SIZEOF_DEVICE_INFO - 1 - 1)
237#define FIRST_START_ID                            (0xFF)
238#define CONFIG_ID                                                                 (57)    // Increment by 1 to make compartible update, more than 1 - incompartible
239#if CONFIG_ID == FIRST_START_ID
240#error "CONFIG_ID must not be equal to FIRST_START_ID!!! Calibration data will be erased!!!"
241#endif
242
243static uint32_t GetPage(uint32_t Address);
244static HAL_StatusTypeDef getEEPROMData(uint32_t address, uint8_t * data, uint32_t len);
245
246// muss modulo 8 noch hinzufügen wg 8 byte alignement
247static uint64_t eepromData[(SIZE_OF_DATA_TO_STORE / 8) + 1];
248static uint64_t eepromOldData[(SIZE_OF_OLD_DATA_TO_STORE / 8) + 1];
249
250static FLASH_EraseInitTypeDef EraseInitStruct = {0};
251
252static const eeprom_data_t defaultEepromData =
253{
254        // Schnittstellenparameter
255
256        /* baudrate             */                                                                                                              19200,                  // uint32_t   baudrate;
257        /* parityMode   */                                                                                                              0,                              // uint16_t   parityMode;
258        /* stopBits             */                                                                                                              1,                              // uint16_t   stopBits;
259        /* slave_adress */                                                                                                              1,                              // uint16_t   slave_adress;
260        /* ibn_day              */                                                                                                              0,                              // ibm_day
261        /* ibn_month    */                                                                                                              0,                              // ibm_month
262        /* ibn_year             */                                                                                                              0,                              // ibm_year
263        /* user_id              */                                                                                                              0,                              // user id
264
265        // Offset und Gain
266
267        /* batteryCurrentOffsetRefTemperatureShunt                                      */                      0,                              // int16_t   batteryCurrentOffsetRefTemperatureShunt;
268        /* batteryCurrentOffsetRefTemperatureChip                                       */                      0,                              // int16_t   batteryCurrentOffsetRefTemperatureChip
269        /* batteryCurrentGainRefTempShunt                                                       */                      0,                              // int16_t   batteryCurrentGainRefTempShunt;
270        /* batteryCurrentGainRefTempChip                                                        */                      0,                              // int16_t   batteryCurrentGainRefTempShip
271        /* batteryCurrentOffsetTemperatureCalibrationTemperature        */                      0,                              // int16_t   batteryCurrentOffsetTemperatureCalibrationTemperature;
272        /* batteryCurrentGainTemperatureCalibrationShuntTemperature     */                      0,                              // int16_t   batteryCurrentGainTemperatureCalibrationShuntTemperature;
273        /* batteryCurrentGainTemperatureCalibrationChipTemperature      */                      0,                              // int16_t   batteryCurrentGainTemperatureCalibrationChipTemperature;
274        /* batteryCurrentOffsetRefshuntVoltage                                          */                      0,                              // int32_t   batteryCurrentOffsetRefshuntVoltage;
275        /* batteryCurrentOffsetCommonModeCalibrationVoltage                     */                      0,                              // int32_t   batteryCurrentOffsetCommonModeCalibrationVoltage;
276        /* batteryCurrentOffsetTemperatureCompensationFactor            */                      0,                              // int32_t   batteryCurrentOffsetTemperatureCompensationFactor;
277        /* batteryCurrentOffsetCommonModeCompensationFactor                     */                      0,                              // int32_t   batteryCurrentOffsetCommonModeCompensationFactor;
278        /* batteryCurrentGainRefCurrent                                                         */                      250000,                 // int32_t   batteryCurrentGainRefCurrent;
279        /* batteryCurrentGainTemperatureCompensationShuntFactor         */                      0,                              // int32_t   batteryCurrentGainTemperatureCompensationShuntFactor;
280        /* batteryCurrentGainTemperatureCompensationChipFactor          */                      0,                              // int32_t   batteryCurrentGainTemperatureCompensationChipFactor;
281
282        /* currentOffset  */                                                                                                    0,                              //int32_t   currentOffset;
283        /* currentGain    */                                                                                                    1000000,                //uint32_t  currentGain;
284
285        /* mAsCounter           */                                                                                                      0,                              // mAsCounter
286        /* detectedCapacity     */                                                                                                      -1,                             // detectedCapacity
287        /* detectedEnergy       */                                                                                                      -1,                             // detectedEnergy
288        /* mAs_AutoMode         */                                                                                                      (-100000LL*3600LL),     // mAs_AutoMode = cellCapacity*3600,
289        /* mWs_AutoMode         */                                                                                                      (-2640000LL*3600LL),// mWs_AutoMode = cellEnergy*3600,
290
291        // battery parameter
292
293        /* cef                                          */                                                                                      99,                             // cef
294        /* peukert                                      */                                                                                      105,                    // peukert
295        /* cellCapacity                         */                                                                                      100000,                 // cell Capacity in mAh
296        /* cellEnergy                           */                                                                                      2640000,                // cell energy in mWh
297        /* iBatFull                                     */                                                                                      10,                             // I-batt full 4% 4A bei 100Ah akku
298        /* tBatFull                                     */                                                                                      2,                              // t-batt full 2 Sekunden
299        /* uBatFull                                     */                                                                                      14000,                  // 14Volt Ubatt full
300        /* uBatEmpty                            */                                                                                      11312,                  // 11,312V Ubatt Empty
301        /* socCalcMode                          */                                                                                      1,                              // SoC calculation mode: 0(default)
302        /* cellRatedDischargeTime       */                                                                                      2,                              // cell rated current discharge time [C/x]. For example, if 40Ah cell is rated as 0.5c, then rated discharge time is 2
303
304        /* lvpStart     */                                                                                                                      11200,                  // uint16_t lvpStart; Spannung ab der die LOW Voltage Protection aktiv wird in mV
305        /* lvpStop      */                                                                                                                      12000,                  // uint16_t lvpStop; Spannung ab der die LOW Voltage Protection wieder inaktiv wird
306        /* ovpStart     */                                                                                                                      60000,                  // uint16_t  ovpStart; Spannung ab der die OVER Voltage Protection aktiv wird in mV
307        /* ovpStop      */                                                                                                                      56000,                  // uint16_t  ovpStop; Spannung ab der die OVER Voltage Protection wieder inaktiv wird
308
309#if (DEVICETYPE == 500)
310        /* loadCurrentLimit       */                                                                                            -500,                   // uint16_t loadCurrentLimit; maximaler Laststrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Laststrom Protection aktiv
311        /* chargeCurrentLimit */                                                                                                500,                    // uint16_t chargeCurrentLimit; maximaler Ladestrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Ladestrom Protection aktiv
312#elif (DEVICETYPE == 250)
313        /* loadCurrentLimit       */                                                                                            -250,                   // uint16_t loadCurrentLimit; maximaler Laststrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Laststrom Protection aktiv
314        /* chargeCurrentLimit */                                                                                                250,                    // uint16_t chargeCurrentLimit maximaler Ladestrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Ladestrom Protection aktiv
315#elif (DEVICETYPE == 125)
316        /* loadCurrentLimit       */                                                                                            -125,                   // uint16_t loadCurrentLimit; maximaler Laststrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Laststrom Protection aktiv
317        /* chargeCurrentLimit */                                                                                                125,                    // uint16_t chargeCurrentLimit; maximaler Ladestrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Ladestrom Protection aktiv
318#else
319#error No valid device type
320#endif
321        /* chargeStopHighTemperatureStart       */                                                                      7500,                   // 80°C int16_t chargeStopHighTemperatureStart; Abschalttemperatur Ladung wegen zu hoher Temperatur
322        /* chargeStopHighTemperatureStop        */                                                                      7000,                   // 75°C int16_t chargeStopHighTemperatureStop;  Wiedereinschalttemperatur
323        /* chargeStopLowTemperatureStart        */                                                                      -3500,                  // -35°C int16_t chargeStopLowTemperatureStart; Abschalttemperatur Ladung wegen zu niedriger Temperatur
324        /* chargeStopLowTemperatureStop         */                                                                      -3000,                  // -30°C int16_t chargeStopLowTemperatureStop; Wiedereinschalttemperatur
325        /* dischargeStopHighTemperatureStart*/                                                                  7500,                   // 80°C int16_t dischargeStopHighTemperatureStart; Abschalttemperatur Entladung wegen zu hoher Temperatur
326        /* dischargeStopHighTemperatureStop     */                                                                      7000,                   // 75°C int16_t dischargeStopHighTemperatureStop; Wiedereinschalttemperatur
327        /* dischargeStopLowTemperatureStart     */                                                                      -3500,                  // -35°C int16_t dischargeStopLowTemperatureStart; Abschalttemperatur EntLadung wegen zu niedriger Temperatur
328        /* dischargeStopLowTemperatureStop      */                                                                      -3000,                  // -30°C int16_t dischargeStopLowTemperatureStop; Wiedereinschalttemperatur
329
330        /* uBatEmptyCompStartTemp       */                                                                                      50,                             // 5°C We start calculating uBatEmpty compensations only when cell temperature is lower than this value
331        /* uBatEmptyCompStopTemp        */                                                                                      -200,                   // -20°C We stop calculating uBatEmpty compensations when cell temperature is lower than this value
332        /* uBatEmptyCompStopVolt        */                                                                                      10000,                  // 10V uBatEmpty voltage at temperatures lower than -20°C
333
334        /* extraDischargeStrom_mA       */                                                                                      7,                              // mA, current that LiPro consumes itself
335        /* dischargeTotalAh                     */                                                                                      0,                              // Ah for negative current counter
336        /* chargeTotalAh                        */                                                                                      0,                              // Ah for total charge counter
337        /* dischargeTotalWh                     */                                                                                      0,
338        /* chargeTotalWh                        */                                                                                      0,
339
340        /* cefW         */                                                                                                                      90,                             // 90% cef for Wh calculations
341        /* onTime       */                                                                                                                      0
342
343};
344
345/**
346  * @brief  Gets the page of a given address
347  * @param  Addr: Address of the FLASH Memory
348  * @retval The page of a given address
349  */
350static uint32_t GetPage(uint32_t Addr)
351{
352  return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;
353}
354
355//------------------------------------------------------------------------------
356
357static HAL_StatusTypeDef getEEPROMData(uint32_t address, uint8_t* data, uint32_t len)
358{
359    uint8_t daten;
360
361    if ((address + len) > USER_FLASH_END) return HAL_ERROR;
362
363    for (size_t i = 0; i < len; ++i) data[i] = *((uint8_t *)(address + i));
364
365    return HAL_OK;
366}
367
368//------------------------------------------------------------------------------
369
370startType_t EEPROM_isFirstStart(uint8_t* fsID)
371{
372  // sizeof eeprom_new_data_t must not be equal to size of eeprom_old_data_t
373  BUILD_BUG_ON(sizeof(eeprom_data_t) == sizeof(eeprom_old_data_t));
374
375  uint8_t firstStartCatcher;
376
377  if (getEEPROMData(EEPROM_ADRESS_FIRST_START_ID, &firstStartCatcher, 1) != HAL_OK) return FIRST_START_ERROR;
378
379  if (fsID != NULL) *fsID = firstStartCatcher;
380
381  if (firstStartCatcher == FIRST_START_ID)
382  {
383          printf ("First start detected!\n");
384          return FIRST_START_AFTER_ERASE;
385  }
386  else if (firstStartCatcher == CONFIG_ID)
387  {
388          printf ("Normal start without EEPROM changes detected\n");
389          return FIRST_START_AFTER_COMPARTIBLE_UPDATE;
390  }
391  else if (firstStartCatcher == CONFIG_ID - 1)
392  {
393          printf ("EEPROM was changed! We need to preserve calibration and settings data!\n");
394          return FIRST_START_AFTER_INCOMPARTIBLE_UPDATE;
395  }
396  else return FIRST_START_ERROR;
397}
398
399//------------------------------------------------------------------------------
400
401HAL_StatusTypeDef EEPROM_fullRestore(sys_data_t* data)
402{
403  eeprom_stored_data_t* dataToStore;
404  uint32_t PageError;
405  uint32_t Address;
406  uint32_t x;
407
408  printf("EEPROM FULL RESTORE!\n");
409
410  /**************** LESE_DEFAULT_WERTE ************************/
411
412  dataToStore = (eeprom_stored_data_t*) eepromData;
413
414  // Schnittstellenparameter
415  dataToStore->changedData.baudrate                                                                                                     = defaultEepromData.baudrate;
416  dataToStore->changedData.parityMode                                                                                           = defaultEepromData.parityMode;
417  dataToStore->changedData.stopBits                                                                                                     = defaultEepromData.stopBits;
418  dataToStore->changedData.slave_adress                                                                                         = defaultEepromData.slave_adress;
419
420  // Offset und Gain
421  dataToStore->changedData.batteryCurrentOffsetRefTemperatureShunt                                      = defaultEepromData.batteryCurrentOffsetRefTemperatureShunt;
422  dataToStore->changedData.batteryCurrentOffsetRefTemperatureChip                                       = defaultEepromData.batteryCurrentOffsetRefTemperatureChip;
423  dataToStore->changedData.batteryCurrentGainRefTempShunt                                                       = defaultEepromData.batteryCurrentGainRefTempShunt;
424  dataToStore->changedData.batteryCurrentGainRefTempChip                                                        = defaultEepromData.batteryCurrentGainRefTempChip;
425  dataToStore->changedData.batteryCurrentOffsetTemperatureCalibrationTemperature        = defaultEepromData.batteryCurrentOffsetTemperatureCalibrationTemperature;
426  dataToStore->changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature     = defaultEepromData.batteryCurrentGainTemperatureCalibrationShuntTemperature;
427  dataToStore->changedData.batteryCurrentGainTemperatureCalibrationChipTemperature      = defaultEepromData.batteryCurrentGainTemperatureCalibrationChipTemperature;
428  dataToStore->changedData.batteryCurrentOffsetRefshuntVoltage                                          = defaultEepromData.batteryCurrentOffsetRefshuntVoltage;
429  dataToStore->changedData.batteryCurrentOffsetCommonModeCalibrationVoltage                     = defaultEepromData.batteryCurrentOffsetCommonModeCalibrationVoltage;
430  dataToStore->changedData.batteryCurrentOffsetCommonModeCompensationFactor                     = defaultEepromData.batteryCurrentOffsetCommonModeCompensationFactor;
431  dataToStore->changedData.batteryCurrentOffsetTemperatureCompensationFactor            = defaultEepromData.batteryCurrentOffsetTemperatureCompensationFactor;
432  dataToStore->changedData.batteryCurrentGainRefCurrent                                                         = defaultEepromData.batteryCurrentGainRefCurrent;
433  dataToStore->changedData.batteryCurrentGainTemperatureCompensationShuntFactor         = defaultEepromData.batteryCurrentGainTemperatureCompensationShuntFactor;
434  dataToStore->changedData.batteryCurrentGainTemperatureCompensationChipFactor          = defaultEepromData.batteryCurrentGainTemperatureCompensationChipFactor;
435
436  dataToStore->changedData.currentOffset                                                                                        = defaultEepromData.currentOffset;
437  dataToStore->changedData.currentGain                                                                                          = defaultEepromData.currentGain;
438
439  // AH Counter Parameter
440  dataToStore->changedData.cef                                                                                                          = defaultEepromData.cef;
441  dataToStore->changedData.peukert                                                                                                      = defaultEepromData.peukert;
442  dataToStore->changedData.cellCapacity                                                                                         = defaultEepromData.cellCapacity;
443  dataToStore->changedData.cellEnergy                                                                                           = defaultEepromData.cellEnergy;
444  dataToStore->changedData.iBatFull                                                                                                     = defaultEepromData.iBatFull;
445  dataToStore->changedData.tBatFull                                                                                                     = defaultEepromData.tBatFull;
446  dataToStore->changedData.uBatFull                                                                                                     = defaultEepromData.uBatFull;
447  dataToStore->changedData.uBatEmpty                                                                                            = defaultEepromData.uBatEmpty;
448  dataToStore->changedData.socCalcMode                                                                                          = defaultEepromData.socCalcMode;
449  dataToStore->changedData.cellRatedDischargeTime                                                                       = defaultEepromData.cellRatedDischargeTime;
450
451  // Schaltausgänge
452  dataToStore->changedData.lvpStart                                                                                                     = defaultEepromData.lvpStart;
453  dataToStore->changedData.lvpStop                                                                                                      = defaultEepromData.lvpStop;
454  dataToStore->changedData.ovpStart                                                                                                     = defaultEepromData.ovpStart;
455  dataToStore->changedData.ovpStop                                                                                                      = defaultEepromData.ovpStop;
456  dataToStore->changedData.loadCurrentLimit                                                                                     = defaultEepromData.loadCurrentLimit;
457  dataToStore->changedData.chargeCurrentLimit                                                                           = defaultEepromData.chargeCurrentLimit;
458  dataToStore->changedData.chargeStopHighTemperatureStart                                                       = defaultEepromData.chargeStopHighTemperatureStart;
459  dataToStore->changedData.chargeStopHighTemperatureStop                                                        = defaultEepromData.chargeStopHighTemperatureStop;
460  dataToStore->changedData.chargeStopLowTemperatureStart                                                        = defaultEepromData.chargeStopLowTemperatureStart;
461  dataToStore->changedData.chargeStopLowTemperatureStop                                                         = defaultEepromData.chargeStopLowTemperatureStop;
462  dataToStore->changedData.dischargeStopHighTemperatureStart                                            = defaultEepromData.dischargeStopHighTemperatureStart;
463  dataToStore->changedData.dischargeStopHighTemperatureStop                                                     = defaultEepromData.dischargeStopHighTemperatureStop;
464  dataToStore->changedData.dischargeStopLowTemperatureStart                                                     = defaultEepromData.dischargeStopLowTemperatureStart;
465  dataToStore->changedData.dischargeStopLowTemperatureStop                                                      = defaultEepromData.dischargeStopLowTemperatureStop;
466
467  dataToStore->changedData.uBatEmptyCompStartTemp                                                                       = defaultEepromData.uBatEmptyCompStartTemp;
468  dataToStore->changedData.uBatEmptyCompStopTemp                                                                        = defaultEepromData.uBatEmptyCompStopTemp;
469  dataToStore->changedData.uBatEmptyCompStopVolt                                                                        = defaultEepromData.uBatEmptyCompStopVolt;
470
471  dataToStore->changedData.extraDischargeStrom_mA                                                                       = defaultEepromData.extraDischargeStrom_mA;
472  dataToStore->changedData.dischargeTotalAh                                                                                     = defaultEepromData.dischargeTotalAh;
473  dataToStore->changedData.chargeTotalAh                                                                                        = defaultEepromData.chargeTotalAh;
474  dataToStore->changedData.dischargeTotalWh                                                                                     = defaultEepromData.dischargeTotalWh;
475  dataToStore->changedData.chargeTotalWh                                                                                        = defaultEepromData.chargeTotalWh;
476  dataToStore->changedData.cefW                                                                                                         = defaultEepromData.cefW;
477  dataToStore->changedData.onTime                                                                                                       = defaultEepromData.onTime;
478
479  dataToStore->changedData.mAsCounter                                                                                           = defaultEepromData.mAsCounter;
480  dataToStore->changedData.detectedCapacity                                                                                     = defaultEepromData.detectedCapacity;
481  dataToStore->changedData.detectedEnergy                                                                                       = defaultEepromData.detectedEnergy;
482  dataToStore->changedData.mAs_AutoMode                                                                                         = defaultEepromData.mAs_AutoMode;
483  dataToStore->changedData.mWs_AutoMode                                                                                         = defaultEepromData.mWs_AutoMode;
484
485  // Eeprom Status Infos
486  dataToStore->eepromState.writeCounter++;
487  dataToStore->eepromState.structureSize = sizeof(eeprom_stored_data_t);
488  dataToStore->eepromState.revisionInfo = 0;
489  dataToStore->eepromState.firstStartId = CONFIG_ID;
490
491  /****************PAGE_LÖSCHEN********************/
492  HAL_FLASH_Unlock();
493
494  // check for PG bit set if so clear bit
495  FLASH_WaitForLastOperation(1000);
496  if(READ_BIT(FLASH->CR, FLASH_CR_PG))
497  {
498    CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
499  }
500
501  /* Fill EraseInit structure*/
502  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
503  EraseInitStruct.Page        = FLASH_PAGE_NB - 1; //GetPage(USER_EEPROM_BASE_ADRESS);
504  EraseInitStruct.NbPages     = 1;
505
506  /* erase Sektoren daten d+rfen nicht im instuction cache liegen  */
507  if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
508  {
509    while (1)
510    {
511      // ERROR HAL_FLASH_GetError() kann info geben
512    }
513  }
514
515  /****************IM_FLASH_SPEICHERN********************/
516
517  /* programmiere uint64_t */
518  Address = USER_EEPROM_BASE_ADRESS;
519  x = 0;
520  while (Address < (USER_EEPROM_BASE_ADRESS + SIZE_OF_DATA_TO_STORE))
521  {
522    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, eepromData[x]) == HAL_OK)
523    {
524      Address = Address + 8;
525      x ++;
526    }
527   else
528    {
529      /* Error occurred while writing data in Flash memory.
530         User can add here some code to deal with this error */
531      while (1)
532      {
533        // ERROR
534      }
535    }
536  }
537
538  /* Lock the Flash */
539  HAL_FLASH_Lock();
540
541  /**************** AUSLESEN_UND_PRÜFEN ********************/
542
543  return EEPROM_readConfig(data);
544
545  //  Die Geräteinformation wird nicht geändert:
546  /*
547  dataToStore->deviceInfo.SN1;
548  dataToStore->deviceInfo.SN1;
549  dataToStore->deviceInfo.SN1;
550  dataToStore->deviceInfo.deviceInfoWritten;
551  */
552}
553
554HAL_StatusTypeDef EEPROM_factoryRestore(sys_data_t* data, int resetToDefault)
555{
556  printf("EEPROM FACTORY RESTORE/UPDATE!\n");
557
558  // Reading from FLASH old calibration and parameters data
559  if (getEEPROMData(USER_EEPROM_BASE_ADRESS, (uint8_t*)eepromOldData, sizeof(eepromOldData)) != HAL_OK) return HAL_ERROR;
560  // Interpreting these data as it were in last version of the program
561  eeprom_stored_old_data_t* oldDataToStore = (eeprom_stored_old_data_t*)eepromOldData;
562  // Allocating free space for calibration and parameters data for new version of the program
563  eeprom_stored_data_t* dataToStore = (eeprom_stored_data_t*)eepromData;
564
565  //EEPROM_readConfig(data);                                                                                                            // Restoring calibration data
566
567  // Offset und Gain
568  dataToStore->changedData.currentOffset                                                                                        = oldDataToStore->changedData.currentOffset;
569  dataToStore->changedData.batteryCurrentOffsetRefTemperatureShunt                                      = oldDataToStore->changedData.batteryCurrentOffsetRefTemperatureShunt;
570  dataToStore->changedData.batteryCurrentOffsetRefTemperatureChip                                       = oldDataToStore->changedData.batteryCurrentOffsetRefTemperatureChip;
571  dataToStore->changedData.batteryCurrentOffsetRefshuntVoltage                                          = oldDataToStore->changedData.batteryCurrentOffsetRefshuntVoltage;
572  dataToStore->changedData.batteryCurrentOffsetCommonModeCalibrationVoltage                     = oldDataToStore->changedData.batteryCurrentOffsetCommonModeCalibrationVoltage;
573  dataToStore->changedData.batteryCurrentOffsetCommonModeCompensationFactor                     = oldDataToStore->changedData.batteryCurrentOffsetCommonModeCompensationFactor;
574  dataToStore->changedData.batteryCurrentOffsetTemperatureCalibrationTemperature        = oldDataToStore->changedData.batteryCurrentOffsetTemperatureCalibrationTemperature;
575  dataToStore->changedData.batteryCurrentOffsetTemperatureCompensationFactor            = oldDataToStore->changedData.batteryCurrentOffsetTemperatureCompensationFactor;
576  dataToStore->changedData.currentGain                                                                                          = oldDataToStore->changedData.currentGain;
577  dataToStore->changedData.batteryCurrentGainRefTempShunt                                                       = oldDataToStore->changedData.batteryCurrentGainRefTempShunt;
578  dataToStore->changedData.batteryCurrentGainRefTempChip                                                        = oldDataToStore->changedData.batteryCurrentGainRefTempChip;
579  dataToStore->changedData.batteryCurrentGainRefCurrent                                                         = oldDataToStore->changedData.batteryCurrentGainRefCurrent;
580  dataToStore->changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature     = oldDataToStore->changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature;
581  dataToStore->changedData.batteryCurrentGainTemperatureCompensationShuntFactor         = oldDataToStore->changedData.batteryCurrentGainTemperatureCompensationShuntFactor;
582  dataToStore->changedData.batteryCurrentGainTemperatureCalibrationChipTemperature      = oldDataToStore->changedData.batteryCurrentGainTemperatureCalibrationChipTemperature;
583  dataToStore->changedData.batteryCurrentGainTemperatureCompensationChipFactor          = oldDataToStore->changedData.batteryCurrentGainTemperatureCompensationChipFactor;
584
585  // Schnittstellenparameter
586  dataToStore->changedData.baudrate                                                                                                     = resetToDefault == 1 ? defaultEepromData.baudrate              : oldDataToStore->changedData.baudrate;
587  dataToStore->changedData.parityMode                                                                                           = resetToDefault == 1 ? defaultEepromData.parityMode    : oldDataToStore->changedData.parityMode;
588  dataToStore->changedData.stopBits                                                                                                     = resetToDefault == 1 ? defaultEepromData.stopBits              : oldDataToStore->changedData.stopBits;
589  dataToStore->changedData.slave_adress                                                                                         = resetToDefault == 1 ? defaultEepromData.slave_adress  : oldDataToStore->changedData.slave_adress;
590  dataToStore->changedData.ibn_day                                                                                                      = resetToDefault == 1 ? defaultEepromData.ibn_day               : oldDataToStore->changedData.ibn_day;
591  dataToStore->changedData.ibn_month                                                                                            = resetToDefault == 1 ? defaultEepromData.ibn_month             : oldDataToStore->changedData.ibn_month;
592  dataToStore->changedData.ibn_year                                                                                                     = resetToDefault == 1 ? defaultEepromData.ibn_year              : oldDataToStore->changedData.ibn_year;
593  dataToStore->changedData.user_id                                                                                                      = resetToDefault == 1 ? defaultEepromData.user_id               : oldDataToStore->changedData.user_id;
594
595  //Ah counter
596  dataToStore->changedData.cef                                                                                                          = resetToDefault == 1 ? defaultEepromData.cef                                     : oldDataToStore->changedData.cef;
597  dataToStore->changedData.cellCapacity                                                                                         = resetToDefault == 1 ? defaultEepromData.cellCapacity                    : oldDataToStore->changedData.cellCapacity;
598  dataToStore->changedData.cellEnergy                                                                                           = resetToDefault == 1 ? defaultEepromData.cellEnergy                      : oldDataToStore->changedData.cellEnergy;
599  dataToStore->changedData.iBatFull                                                                                                     = resetToDefault == 1 ? defaultEepromData.iBatFull                                : oldDataToStore->changedData.iBatFull;
600  dataToStore->changedData.peukert                                                                                                      = resetToDefault == 1 ? defaultEepromData.peukert                                 : oldDataToStore->changedData.peukert;
601  dataToStore->changedData.tBatFull                                                                                                     = resetToDefault == 1 ? defaultEepromData.tBatFull                                : oldDataToStore->changedData.tBatFull;
602  dataToStore->changedData.uBatFull                                                                                                     = resetToDefault == 1 ? defaultEepromData.uBatFull                                : oldDataToStore->changedData.uBatFull;
603  dataToStore->changedData.uBatEmpty                                                                                            = resetToDefault == 1 ? defaultEepromData.uBatEmpty                               : oldDataToStore->changedData.uBatEmpty;
604  dataToStore->changedData.socCalcMode                                                                                          = resetToDefault == 1 ? defaultEepromData.socCalcMode                     : oldDataToStore->changedData.socCalcMode;
605  dataToStore->changedData.cellRatedDischargeTime                                                                       = resetToDefault == 1 ? defaultEepromData.cellRatedDischargeTime  : oldDataToStore->changedData.cellRatedDischargeTime;
606
607  // Schaltausgänge
608  dataToStore->changedData.lvpStart                                                                                                     = resetToDefault == 1 ? defaultEepromData.lvpStart                                                      : oldDataToStore->changedData.lvpStart;
609  dataToStore->changedData.lvpStop                                                                                                      = resetToDefault == 1 ? defaultEepromData.lvpStop                                                       : oldDataToStore->changedData.lvpStop;
610  dataToStore->changedData.ovpStart                                                                                                     = resetToDefault == 1 ? defaultEepromData.ovpStart                                                      : oldDataToStore->changedData.ovpStart;
611  dataToStore->changedData.ovpStop                                                                                                      = resetToDefault == 1 ? defaultEepromData.ovpStop                                                       : oldDataToStore->changedData.ovpStop;
612  dataToStore->changedData.loadCurrentLimit                                                                                     = resetToDefault == 1 ? defaultEepromData.loadCurrentLimit                                      : oldDataToStore->changedData.loadCurrentLimit;
613  dataToStore->changedData.chargeCurrentLimit                                                                           = resetToDefault == 1 ? defaultEepromData.chargeCurrentLimit                            : oldDataToStore->changedData.chargeCurrentLimit;
614  dataToStore->changedData.chargeStopHighTemperatureStart                                                       = resetToDefault == 1 ? defaultEepromData.chargeStopHighTemperatureStart        : oldDataToStore->changedData.chargeStopHighTemperatureStart;
615  dataToStore->changedData.chargeStopHighTemperatureStop                                                        = resetToDefault == 1 ? defaultEepromData.chargeStopHighTemperatureStop         : oldDataToStore->changedData.chargeStopHighTemperatureStop;
616  dataToStore->changedData.chargeStopLowTemperatureStart                                                        = resetToDefault == 1 ? defaultEepromData.chargeStopLowTemperatureStart         : oldDataToStore->changedData.chargeStopHighTemperatureStop;
617  dataToStore->changedData.chargeStopLowTemperatureStop                                                         = resetToDefault == 1 ? defaultEepromData.chargeStopLowTemperatureStop          : oldDataToStore->changedData.chargeStopLowTemperatureStop;
618  dataToStore->changedData.dischargeStopHighTemperatureStart                                            = resetToDefault == 1 ? defaultEepromData.dischargeStopHighTemperatureStart     : oldDataToStore->changedData.dischargeStopHighTemperatureStart;
619  dataToStore->changedData.dischargeStopHighTemperatureStop                                                     = resetToDefault == 1 ? defaultEepromData.dischargeStopHighTemperatureStop      : oldDataToStore->changedData.dischargeStopHighTemperatureStop;
620  dataToStore->changedData.dischargeStopLowTemperatureStart                                                     = resetToDefault == 1 ? defaultEepromData.dischargeStopLowTemperatureStart      : oldDataToStore->changedData.dischargeStopLowTemperatureStart;
621  dataToStore->changedData.dischargeStopLowTemperatureStop                                                      = resetToDefault == 1 ? defaultEepromData.dischargeStopLowTemperatureStop       : oldDataToStore->changedData.dischargeStopLowTemperatureStop;
622
623  dataToStore->changedData.uBatEmptyCompStartTemp                                                                       = resetToDefault == 1 ? defaultEepromData.uBatEmptyCompStartTemp  : oldDataToStore->changedData.uBatEmptyCompStartTemp;
624  dataToStore->changedData.uBatEmptyCompStopTemp                                                                        = resetToDefault == 1 ? defaultEepromData.uBatEmptyCompStopTemp   : oldDataToStore->changedData.uBatEmptyCompStopTemp;
625  dataToStore->changedData.uBatEmptyCompStopVolt                                                                        = resetToDefault == 1 ? defaultEepromData.uBatEmptyCompStopVolt   : oldDataToStore->changedData.uBatEmptyCompStopVolt;
626
627  dataToStore->changedData.extraDischargeStrom_mA                                                                       = resetToDefault == 1 ? defaultEepromData.extraDischargeStrom_mA  : oldDataToStore->changedData.extraDischargeStrom_mA;
628  dataToStore->changedData.dischargeTotalAh                                                                                     = resetToDefault == 1 ? defaultEepromData.dischargeTotalAh                : oldDataToStore->changedData.dischargeTotalAh;
629  dataToStore->changedData.chargeTotalAh                                                                                        = resetToDefault == 1 ? defaultEepromData.chargeTotalAh                   : oldDataToStore->changedData.chargeTotalAh;
630  dataToStore->changedData.cefW                                                                                                         = resetToDefault == 1 ? defaultEepromData.cefW                                    : oldDataToStore->changedData.cefW;
631  dataToStore->changedData.onTime                                                                                                       = resetToDefault == 1 ? defaultEepromData.onTime                                  : oldDataToStore->changedData.onTime;
632
633  // These fields are new
634  dataToStore->changedData.mAsCounter                                                                                           = defaultEepromData.mAsCounter;
635  dataToStore->changedData.detectedCapacity                                                                                     = defaultEepromData.detectedCapacity;
636  dataToStore->changedData.detectedEnergy                                                                                       = defaultEepromData.detectedEnergy;
637  dataToStore->changedData.mAs_AutoMode                                                                                         = defaultEepromData.mAs_AutoMode;
638  dataToStore->changedData.mWs_AutoMode                                                                                         = defaultEepromData.mWs_AutoMode;
639  dataToStore->changedData.dischargeTotalWh                                                                                     = defaultEepromData.dischargeTotalWh;
640  dataToStore->changedData.chargeTotalWh                                                                                        = defaultEepromData.chargeTotalWh;
641
642
643  dataToStore->eepromState.writeCounter   = ++oldDataToStore->eepromState.writeCounter;
644  dataToStore->eepromState.structureSize  = sizeof(eeprom_stored_data_t);
645  dataToStore->eepromState.revisionInfo   = 0;
646  dataToStore->eepromState.firstStartId = CONFIG_ID;
647
648  dataToStore->deviceInfo.deviceInfoWritten     = resetToDefault == 1 ? 0 : oldDataToStore->deviceInfo.deviceInfoWritten;
649  dataToStore->deviceInfo.SN                            = resetToDefault == 1 ? 0 : oldDataToStore->deviceInfo.SN;
650
651  /**************** PAGE_LÖSCHEN ********************/
652  HAL_FLASH_Unlock();
653
654  // check for PG bit set if so clear bit
655  FLASH_WaitForLastOperation(1000);
656  if(READ_BIT(FLASH->CR, FLASH_CR_PG)) CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
657
658  /* Fill EraseInit structure*/
659  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
660  EraseInitStruct.Page        = FLASH_PAGE_NB - 1; //GetPage(USER_EEPROM_BASE_ADRESS);
661  EraseInitStruct.NbPages     = 1;
662
663  /* erase Sektoren daten dürfen nicht im instruction cache liegen  */
664  uint32_t PageError;
665  if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
666  {
667    while (1)
668    {
669      // ERROR HAL_FLASH_GetError() kann info geben
670    }
671  }
672
673  /**************** IM_FLASH_SPEICHERN ********************/
674  uint32_t Address;
675  uint32_t x;
676
677  /* programmiere uint64_t */
678  Address = USER_EEPROM_BASE_ADRESS;
679  x = 0;
680  while (Address < (USER_EEPROM_BASE_ADRESS + SIZE_OF_DATA_TO_STORE))
681  {
682    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, eepromData[x]) == HAL_OK)
683    {
684      Address += 8;
685      x++;
686    }
687   else
688    {
689      /* Error occurred while writing data in Flash memory.
690         User can add here some code to deal with this error */
691      while (1)
692      {
693        // ERROR
694      }
695    }
696  }
697
698  /* Lock the Flash */
699  HAL_FLASH_Lock();
700
701  /****************AUSLESEN_UND_PRÜFEN********************/
702
703  return EEPROM_readConfig(data);
704}
705
706HAL_StatusTypeDef EEPROM_storeConfig(sys_data_t* data, uint8_t withSN)
707{
708  eeprom_stored_data_t* dataToStore;
709  uint32_t PageError;
710  uint32_t Address;
711  uint32_t x;
712  /****************LESE_WERTE_AUS_SYSDATA*********************/
713  printf("EEPROM STORE CONFIG!\n");
714  dataToStore = (eeprom_stored_data_t*) eepromData;
715
716  // Schnittstellenparameter
717  dataToStore->changedData.baudrate = data->s.parameter.baudrate;
718  dataToStore->changedData.parityMode = data->s.parameter.parityMode;
719  dataToStore->changedData.stopBits = data->s.parameter.stopBit;
720  dataToStore->changedData.slave_adress = data->s.parameter.slave_address;
721  dataToStore->changedData.ibn_day = data->s.parameter.ibn_day;
722  dataToStore->changedData.ibn_month = data->s.parameter.ibn_month;
723  dataToStore->changedData.ibn_year = data->s.parameter.ibn_year;
724  dataToStore->changedData.user_id = data->s.parameter.user_id;
725
726  // Offset und Gain
727  dataToStore->changedData.batteryCurrentOffsetRefTemperatureChip = data->s.parameter.batteryCurrentOffsetRefTemperatureChip;
728  dataToStore->changedData.batteryCurrentOffsetRefTemperatureShunt = data->s.parameter.batteryCurrentOffsetRefTemperatureShunt;
729
730  dataToStore->changedData.batteryCurrentGainRefTempShunt = data->s.parameter.batteryCurrentGainRefTempShunt;
731  dataToStore->changedData.batteryCurrentGainRefTempChip = data->s.parameter.batteryCurrentGainRefTempChip;
732  dataToStore->changedData.batteryCurrentOffsetTemperatureCalibrationTemperature = data->s.parameter.batteryCurrentOffsetTemperatureCalibrationTemperature;
733  dataToStore->changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature = data->s.parameter.batteryCurrentGainTemperatureCalibrationShuntTemperature;
734  dataToStore->changedData.batteryCurrentGainTemperatureCalibrationChipTemperature = data->s.parameter.batteryCurrentGainTemperatureCalibrationChipTemperature;
735  dataToStore->changedData.batteryCurrentOffsetRefshuntVoltage = data->s.parameter.batteryCurrentOffsetRefshuntVoltage;
736
737  dataToStore->changedData.batteryCurrentOffsetCommonModeCalibrationVoltage = data->s.parameter.batteryCurrentOffsetCommonModeCalibrationVoltage;
738  dataToStore->changedData.batteryCurrentOffsetCommonModeCompensationFactor = data->s.parameter.batteryCurrentOffsetCommonModeCompensationFactor;
739  dataToStore->changedData.batteryCurrentOffsetTemperatureCompensationFactor = data->s.parameter.batteryCurrentOffsetTemperatureCompensationFactor;
740  dataToStore->changedData.batteryCurrentGainRefCurrent = data->s.parameter.batteryCurrentGainRefCurrent;
741  dataToStore->changedData.batteryCurrentGainTemperatureCompensationShuntFactor = data->s.parameter.batteryCurrentGainTemperatureCompensationShuntFactor;
742  dataToStore->changedData.batteryCurrentGainTemperatureCompensationChipFactor = data->s.parameter.batteryCurrentGainTemperatureCompensationChipFactor;
743
744  dataToStore->changedData.currentOffset = data->s.parameter.batteryCurrentOffset;
745  dataToStore->changedData.currentGain = data->s.parameter.batteryCurrentGainCorrectionFaktor;
746
747  // AH COUNTER Einstellungen
748  dataToStore->changedData.cef = data->s.parameter.cef;
749  dataToStore->changedData.peukert = data->s.parameter.peukert;
750  dataToStore->changedData.cellCapacity = data->s.parameter.cellCapacity;
751  dataToStore->changedData.cellEnergy = data->s.parameter.battEnergy;
752  dataToStore->changedData.iBatFull = data->s.parameter.iBatFull;
753  dataToStore->changedData.tBatFull = data->s.parameter.tBatFull;
754  dataToStore->changedData.uBatFull = data->s.parameter.uBatFull;
755  dataToStore->changedData.uBatEmpty = data->s.parameter.uBatEmpty;
756  dataToStore->changedData.socCalcMode = data->s.parameter.socCalcMode;
757
758  dataToStore->changedData.cellRatedDischargeTime = data->s.parameter.cellRatedDischargeTime;
759  // Schaltausgänge
760  dataToStore->changedData.lvpStart = data->s.parameter.lvpStart;
761  dataToStore->changedData.lvpStop = data->s.parameter.lvpStop;
762  dataToStore->changedData.ovpStart = data->s.parameter.ovpStart;
763  dataToStore->changedData.ovpStop = data->s.parameter.ovpStop;
764  dataToStore->changedData.loadCurrentLimit = data->s.parameter.loadCurrentLimit;
765  dataToStore->changedData.chargeCurrentLimit = data->s.parameter.chargeCurrentLimit;
766  dataToStore->changedData.chargeStopHighTemperatureStart = data->s.parameter.chargeStopHighTemperatureStart;
767  dataToStore->changedData.chargeStopHighTemperatureStop = data->s.parameter.chargeStopHighTemperatureStop;
768  dataToStore->changedData.chargeStopLowTemperatureStart = data->s.parameter.chargeStopLowTemperatureStart;
769  dataToStore->changedData.chargeStopLowTemperatureStop = data->s.parameter.chargeStopLowTemperatureStop;
770  dataToStore->changedData.dischargeStopHighTemperatureStart = data->s.parameter.dischargeStopHighTemperatureStart;
771  dataToStore->changedData.dischargeStopHighTemperatureStop = data->s.parameter.dischargeStopHighTemperatureStop;
772  dataToStore->changedData.dischargeStopLowTemperatureStart = data->s.parameter.dischargeStopLowTemperatureStart;
773  dataToStore->changedData.dischargeStopLowTemperatureStop = data->s.parameter.dischargeStopLowTemperatureStop;
774
775  // Neue Parameter für SOC
776  dataToStore->changedData.uBatEmptyCompStartTemp = data->s.parameter.uBatEmptyCompStartTemp;
777  dataToStore->changedData.uBatEmptyCompStopTemp = data->s.parameter.uBatEmptyCompStopTemp;
778  dataToStore->changedData.uBatEmptyCompStopVolt = data->s.parameter.uBatEmptyCompStopVolt;
779
780  dataToStore->changedData.extraDischargeStrom_mA = data->s.parameter.extraDischargeStrom_mA;
781  dataToStore->changedData.dischargeTotalAh = data->s.values.dischargeTotalAh;
782  dataToStore->changedData.chargeTotalAh = data->s.values.chargeTotalAh;
783  dataToStore->changedData.dischargeTotalWh = data->s.values.dischargeTotalWh;
784  dataToStore->changedData.chargeTotalWh = data->s.values.chargeTotalWh;
785  dataToStore->changedData.cefW = data->s.parameter.cefW;
786  dataToStore->changedData.onTime = data->s.values.onTime;
787
788  dataToStore->changedData.mAsCounter = data->s.values.mAsCounter;
789  dataToStore->changedData.detectedCapacity = data->s.values.detectedCapacity;
790  dataToStore->changedData.detectedEnergy = data->s.values.detectedEnergy;
791  dataToStore->changedData.mAs_AutoMode = data->s.values.mAs_AutoMode;
792  dataToStore->changedData.mWs_AutoMode = data->s.values.mWs_AutoMode;
793
794  // Eeprom Status Infos
795  dataToStore->eepromState.writeCounter++;
796  dataToStore->eepromState.structureSize = sizeof(eeprom_stored_data_t);
797  dataToStore->eepromState.revisionInfo = 0;
798  dataToStore->eepromState.firstStartId = CONFIG_ID;
799
800  if (withSN)
801  {
802    printf("Writing SN!\n");
803    dataToStore->deviceInfo.SN = data->s.parameter.sn;
804  }
805
806  /****************PAGE_LÖSCHEN********************/
807  HAL_FLASH_Unlock();
808
809  // check for PG bit set if so clear bit
810  FLASH_WaitForLastOperation(1000);
811  if(READ_BIT(FLASH->CR, FLASH_CR_PG))
812  {
813    CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
814  }
815
816  /* Fill EraseInit structure*/
817  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
818  EraseInitStruct.Page        = FLASH_PAGE_NB - 1; //GetPage(USER_EEPROM_BASE_ADRESS);
819  EraseInitStruct.NbPages     = 1;
820
821  /* erase Sektoren daten dürfen nicht im instuction cache liegen  */
822  if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
823  {
824    while (1)
825    {
826      // ERROR HAL_FLASH_GetError() kann info geben
827    }
828  }
829
830  /****************IM_FLASH_SPEICHERN********************/
831
832  /* programmiere uint64_t */
833  Address = USER_EEPROM_BASE_ADRESS;
834  x = 0;
835  while (Address < (USER_EEPROM_BASE_ADRESS + SIZE_OF_DATA_TO_STORE))
836  {
837    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, eepromData[x]) == HAL_OK)
838    {
839      Address += 8;
840      x++;
841    }
842   else
843    {
844      /* Error occurred while writing data in Flash memory.
845         User can add here some code to deal with this error */
846      while (1)
847      {
848        // ERROR
849      }
850    }
851  }
852
853  /* Lock the Flash */
854  HAL_FLASH_Lock();
855
856  /****************AUSLESEN_UND_PRÜFEN********************/
857
858  return EEPROM_readConfig(data);
859}
860
861//------------------------------------------------------------------------------
862
863HAL_StatusTypeDef EEPROM_readConfig(sys_data_t* data)
864{
865  eeprom_stored_data_t* dataToStore;
866
867  /****************WERTE_AUS_FLASH_LESEN********************/
868
869  if (getEEPROMData(USER_EEPROM_BASE_ADRESS, (uint8_t*)eepromData, sizeof(eepromData)) != HAL_OK) return HAL_ERROR;
870
871  dataToStore = (eeprom_stored_data_t*)eepromData;
872
873  // Schnittstellenparameter
874  data->s.parameter.baudrate                                                                                                    = dataToStore->changedData.baudrate;
875  data->s.parameter.parityMode                                                                                                  = dataToStore->changedData.parityMode;
876  data->s.parameter.stopBit                                                                                                             = dataToStore->changedData.stopBits;
877  data->s.parameter.slave_address                                                                                               = dataToStore->changedData.slave_adress;
878  data->s.parameter.ibn_day                                                                                                             = dataToStore->changedData.ibn_day;
879  data->s.parameter.ibn_month                                                                                                   = dataToStore->changedData.ibn_month;
880  data->s.parameter.ibn_year                                                                                                    = dataToStore->changedData.ibn_year;
881  data->s.parameter.user_id                                                                                                             = dataToStore->changedData.user_id;
882
883  // Offset und Gain
884  data->s.parameter.batteryCurrentOffsetRefTemperatureShunt                                             = dataToStore->changedData.batteryCurrentOffsetRefTemperatureShunt;
885  data->s.parameter.batteryCurrentOffsetRefTemperatureChip                                              = dataToStore->changedData.batteryCurrentOffsetRefTemperatureChip;
886  data->s.parameter.batteryCurrentGainRefTempShunt                                                              = dataToStore->changedData.batteryCurrentGainRefTempShunt;
887  data->s.parameter.batteryCurrentGainRefTempChip                                                               = dataToStore->changedData.batteryCurrentGainRefTempChip;
888  data->s.parameter.batteryCurrentOffsetTemperatureCalibrationTemperature               = dataToStore->changedData.batteryCurrentOffsetTemperatureCalibrationTemperature;
889  data->s.parameter.batteryCurrentGainTemperatureCalibrationShuntTemperature    = dataToStore->changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature;
890  data->s.parameter.batteryCurrentGainTemperatureCalibrationChipTemperature             = dataToStore->changedData.batteryCurrentGainTemperatureCalibrationChipTemperature;
891  data->s.parameter.batteryCurrentOffsetRefshuntVoltage                                                 = dataToStore ->changedData.batteryCurrentOffsetRefshuntVoltage;
892  data->s.parameter.batteryCurrentOffsetCommonModeCalibrationVoltage                    = dataToStore->changedData.batteryCurrentOffsetCommonModeCalibrationVoltage;
893  data->s.parameter.batteryCurrentOffsetCommonModeCompensationFactor                    = dataToStore->changedData.batteryCurrentOffsetCommonModeCompensationFactor;
894  data->s.parameter.batteryCurrentOffsetTemperatureCompensationFactor                   = dataToStore->changedData.batteryCurrentOffsetTemperatureCompensationFactor;
895  data->s.parameter.batteryCurrentGainRefCurrent                                                                = dataToStore->changedData.batteryCurrentGainRefCurrent;
896  data->s.parameter.batteryCurrentGainTemperatureCompensationShuntFactor                = dataToStore->changedData.batteryCurrentGainTemperatureCompensationShuntFactor;
897  data->s.parameter.batteryCurrentGainTemperatureCompensationChipFactor                 = dataToStore->changedData.batteryCurrentGainTemperatureCompensationChipFactor;
898  data->s.parameter.batteryCurrentOffset                                                                                = dataToStore->changedData.currentOffset;
899  data->s.parameter.batteryCurrentGainCorrectionFaktor                                                  = dataToStore->changedData.currentGain;
900
901  //Einstellungenm für AH counter
902  data->s.parameter.cef                                                                                                                 = dataToStore ->changedData.cef;
903  data->s.parameter.peukert                                                                                                             = dataToStore ->changedData.peukert;
904  data->s.parameter.cellCapacity                                                                                                = dataToStore ->changedData.cellCapacity;
905  data->s.parameter.battEnergy                                                                                                  = dataToStore ->changedData.cellEnergy;
906  data->s.parameter.iBatFull                                                                                                    = dataToStore ->changedData.iBatFull;
907  data->s.parameter.tBatFull                                                                                                    = dataToStore->changedData.tBatFull;
908  data->s.parameter.uBatFull                                                                                                    = dataToStore->changedData.uBatFull;
909  data->s.parameter.uBatEmpty                                                                                                   = dataToStore->changedData.uBatEmpty;
910  data->s.parameter.socCalcMode                                                                                                 = dataToStore->changedData.socCalcMode;
911  data->s.parameter.cellRatedDischargeTime                                                                              = dataToStore->changedData.cellRatedDischargeTime;
912
913  // New EU directive says that cell Energy in Wh must be somwhere on the
914  // visible part of the cell as well as capacity in Ah
915
916
917  // Schaltausgänge
918  data->s.parameter.lvpStart                                                                                                    = dataToStore->changedData.lvpStart;
919  data->s.parameter.lvpStop                                                                                                             = dataToStore->changedData.lvpStop;
920  data->s.parameter.ovpStart                                                                                                    = dataToStore->changedData.ovpStart;
921  data->s.parameter.ovpStop                                                                                                             = dataToStore->changedData.ovpStop;
922  data->s.parameter.loadCurrentLimit                                                                                    = dataToStore->changedData.loadCurrentLimit;
923  data->s.parameter.chargeCurrentLimit                                                                                  = dataToStore->changedData.chargeCurrentLimit;
924  data->s.parameter.chargeStopHighTemperatureStart                                                              = dataToStore->changedData.chargeStopHighTemperatureStart;
925  data->s.parameter.chargeStopHighTemperatureStop                                                               = dataToStore->changedData.chargeStopHighTemperatureStop;
926  data->s.parameter.chargeStopLowTemperatureStart                                                               = dataToStore->changedData.chargeStopLowTemperatureStart;
927  data->s.parameter.chargeStopLowTemperatureStop                                                                = dataToStore->changedData.chargeStopLowTemperatureStop;
928  data->s.parameter.dischargeStopHighTemperatureStart                                                   = dataToStore->changedData.dischargeStopHighTemperatureStart;
929  data->s.parameter.dischargeStopHighTemperatureStop                                                    = dataToStore->changedData.dischargeStopHighTemperatureStop;
930  data->s.parameter.dischargeStopLowTemperatureStart                                                    = dataToStore->changedData.dischargeStopLowTemperatureStart;
931  data->s.parameter.dischargeStopLowTemperatureStop                                                             = dataToStore->changedData.dischargeStopLowTemperatureStop;
932
933  data->s.parameter.uBatEmptyCompStartTemp                                                                              = dataToStore->changedData.uBatEmptyCompStartTemp;
934  data->s.parameter.uBatEmptyCompStopTemp                                                                               = dataToStore->changedData.uBatEmptyCompStopTemp;
935  data->s.parameter.uBatEmptyCompStopVolt                                                                               = dataToStore->changedData.uBatEmptyCompStopVolt;
936
937  data->s.parameter.extraDischargeStrom_mA                                                                              = dataToStore->changedData.extraDischargeStrom_mA;
938  data->s.values.dischargeTotalAh                                                                                               = dataToStore->changedData.dischargeTotalAh;
939  data->s.values.chargeTotalAh                                                                                                  = dataToStore->changedData.chargeTotalAh;
940  data->s.values.dischargeTotalWh                                                                                               = dataToStore->changedData.dischargeTotalWh;
941  data->s.values.chargeTotalWh                                                                                                  = dataToStore->changedData.chargeTotalWh;
942  data->s.parameter.cefW                                                                                                                = dataToStore ->changedData.cefW;
943  data->s.values.onTime                                                                                                                 = dataToStore->changedData.onTime;
944
945  data->s.values.mAsCounter                                                                                                             = dataToStore->changedData.mAsCounter;
946  data->s.values.detectedCapacity                                                                                               = dataToStore->changedData.detectedCapacity;
947  data->s.values.detectedEnergy                                                                                                 = dataToStore->changedData.detectedEnergy;
948  data->s.values.mAs_AutoMode                                                                                                   = dataToStore->changedData.mAs_AutoMode;
949  data->s.values.mWs_AutoMode                                                                                                   = dataToStore->changedData.mWs_AutoMode;
950
951  //  Geräteinformation
952  data->s.parameter.sn                                                                                                                  = dataToStore->deviceInfo.SN;
953
954  // prüfe Eeprom Status Infos
955  //dataToStore->eepromState.writeCounter ++ ;
956  if (dataToStore->eepromState.structureSize != sizeof(eeprom_stored_data_t)) return HAL_ERROR;
957  if (dataToStore->eepromState.revisionInfo != 0) return HAL_ERROR;
958  if (dataToStore->eepromState.firstStartId != CONFIG_ID) return HAL_ERROR;
959
960  return HAL_OK;
961}
Note: See TracBrowser for help on using the repository browser.