| [41] | 1 | #include "eeprom.h"
|
|---|
| 2 | #include <string.h>
|
|---|
| 3 | #include "modbus.h"
|
|---|
| 4 | HAL_StatusTypeDef EEPROM_ErasePage(void);
|
|---|
| 5 | flash_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 | */
|
|---|
| 13 | void 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 | */
|
|---|
| 35 | HAL_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 |
|
|---|
| 77 | void 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 |
|
|---|
| 92 | uint16_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 |
|
|---|
| 104 | void 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 |
|
|---|
| 118 | void 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 | }
|
|---|