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

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