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

Last change on this file since 8 was 6, checked in by f.jahn, 8 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.