source: trunk/firmware_v3/SES/src/eeprom.c

Last change on this file was 41, checked in by f.jahn, 8 days ago

V3 Version soweit fertig. Relais ansteuerung, modbus, temperatursensor ist implementiert
Commit vor Änderung auf neuen Controller mit mehr Speicher

File size: 3.6 KB
RevLine 
[41]1#include "eeprom.h"
2#include <string.h>
3#include "modbus.h"
4HAL_StatusTypeDef EEPROM_ErasePage(void);
5flash_device_parameter_t flash_device_parameter_default;
6
7
8/**
9 * @brief Liest die Struktur aus dem Flash in den RAM
10 * @param data_ptr Zeiger auf die Ziel-Struktur im RAM
11 * @param size Größe der Struktur (sizeof)
12 */
13void EEPROM_Read(void* data_ptr, size_t size) {
14 // Flash ist Memory-Mapped, wir können direkt mit memcpy lesen
15 memcpy(data_ptr, (void*)MY_EEPROM_FLASH_ADDR, size);
16}
17
18/**
19 * @brief Hilfsfunktion zum Löschen der Flash-Page
20 */
21 HAL_StatusTypeDef EEPROM_ErasePage(void) {
22 FLASH_EraseInitTypeDef eraseInit;
23 uint32_t pageError = 0;
24
25 eraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
26 eraseInit.Page = MY_EEPROM_PAGE;
27 eraseInit.NbPages = 1;
28 return HAL_FLASHEx_Erase(&eraseInit, &pageError);
29}
30
31/**
32 * @brief Speichert die Struktur im Flash (Löschen -> Schreiben)
33 * @return HAL_OK oder Fehlercode
34 */
35HAL_StatusTypeDef EEPROM_Write(void* data_ptr, size_t size) {
36 // 1. Check: Haben sich die Daten überhaupt geändert? (Flash-Schonung)
37 if (memcmp(data_ptr, (void*)MY_EEPROM_FLASH_ADDR, size) == 0) {
38 return HAL_OK; // Keine Änderung, kein Schreibvorgang nötig
39 }
40
41 HAL_StatusTypeDef status;
42 uint8_t *byte_ptr = (uint8_t*)data_ptr;
43 uint32_t current_addr = MY_EEPROM_FLASH_ADDR;
44
45 // 2. Flash entsperren
46 HAL_FLASH_Unlock();
47
48 // 3. Page löschen (Flash muss vor dem Schreiben 0xFF sein)
49 status = EEPROM_ErasePage();
50 if (status != HAL_OK) {
51 HAL_FLASH_Lock();
52 return status;
53 }
54
55 // 4. In 8-Byte Blöcken schreiben (Double Word)
56 for (size_t i = 0; i < size; i += 8) {
57 uint64_t double_word = 0xFFFFFFFFFFFFFFFF;
58 size_t remaining = size - i;
59
60 if (remaining >= 8) {
61 memcpy(&double_word, &byte_ptr[i], 8);
62 } else {
63 memcpy(&double_word, &byte_ptr[i], remaining);
64 }
65
66 status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, current_addr, double_word);
67 if (status != HAL_OK) break;
68
69 current_addr += 8;
70 }
71
72 // 5. Flash wieder sperren
73 HAL_FLASH_Lock();
74 return status;
75}
76
77void EEPROM_WriteDefaults(void)
78{
79
80 flash_device_parameter_default.baudrate = 19200;
81 flash_device_parameter_default.parityMode = MODBUS_UART_PARITY_EVEN;
82 flash_device_parameter_default.stopBit = 1;
83 flash_device_parameter_default.slave_address = 1;
84 flash_device_parameter_default.first_start_id = FIRST_START_ID;
85
86 EEPROM_Write( (void*) &flash_device_parameter_default, sizeof(flash_device_parameter_default));
87
88}
89
90
91
92uint16_t EEPROM_ReadFirstStart(void)
93{
94
95 flash_device_parameter_t dp;
96
97 EEPROM_Read( (void*) &dp, sizeof(dp));
98
99 return dp.first_start_id;
100
101
102}
103
104void EEPROM_ReadDeviceParameter(void)
105{
106
107 flash_device_parameter_t dp;
108
109 EEPROM_Read( (void*) &dp, sizeof(dp));
110 sys_data.s.parameter.sn = dp.sn;
111 sys_data.s.parameter.baudrate = dp.baudrate;
112 sys_data.s.parameter.parityMode = dp.parityMode;
113 sys_data.s.parameter.stopBit = dp.stopBit;
114 sys_data.s.parameter.slave_address = dp.slave_address;
115
116}
117
118void EEPROM_StoreConfig(bool writeSN)
119{
120 flash_device_parameter_t dp;
121
122 EEPROM_Read( (void*) &dp, sizeof(dp));
123
124
125
126 dp.baudrate = sys_data.s.parameter.baudrate;
127 dp.parityMode = sys_data.s.parameter.parityMode;
128 dp.stopBit = sys_data.s.parameter.stopBit;
129 dp.slave_address = sys_data.s.parameter.slave_address;
130
131 if (writeSN == true)
132 {
133 dp.sn = sys_data.s.parameter.sn;
134 }
135
136
137 EEPROM_Write( (void*) &dp, sizeof(dp));
138}
Note: See TracBrowser for help on using the repository browser.