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

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