| 1 | #include "stm32c0xx_hal.h"
|
|---|
| 2 | #include <inttypes.h>
|
|---|
| 3 | #include <stdbool.h>
|
|---|
| 4 |
|
|---|
| 5 | /**
|
|---|
| 6 | * @file eeprom_emulation.h
|
|---|
| 7 | * @brief Einfache EEPROM-Emulation für STM32C031 (Double-Word Schreibzugriff)
|
|---|
| 8 | * @note Nutzt die HAL-Library für Flash-Operationen.
|
|---|
| 9 | */
|
|---|
| 10 |
|
|---|
| 11 | #ifndef EEPROM_EMULATION_H
|
|---|
| 12 | #define EEPROM_EMULATION_H
|
|---|
| 13 |
|
|---|
| 14 | #ifdef __cplusplus
|
|---|
| 15 | extern "C" {
|
|---|
| 16 | #endif
|
|---|
| 17 |
|
|---|
| 18 | #include "stm32c0xx_hal.h"
|
|---|
| 19 | #include <stddef.h>
|
|---|
| 20 |
|
|---|
| 21 | /* --- KONFIGURATION --- */
|
|---|
| 22 |
|
|---|
| 23 | /** * @brief Flash-Adresse für die Emulation.
|
|---|
| 24 | * Für STM32C031 mit 32KB Flash ist 0x08007800 der Start der letzten Page (Page 15).
|
|---|
| 25 | * WICHTIG: Sicherstellen, dass der Programmcode diese Adresse nicht erreicht!
|
|---|
| 26 | */
|
|---|
| 27 |
|
|---|
| 28 | #define MY_EEPROM_FLASH_ADDR ((uint32_t)0x08007800)
|
|---|
| 29 |
|
|---|
| 30 |
|
|---|
| 31 | /** @brief Die entsprechende Page-Nummer zur Adresse (für das Löschen benötigt) */
|
|---|
| 32 | #define MY_EEPROM_PAGE 15
|
|---|
| 33 |
|
|---|
| 34 | #define FLASH_PAGE_SIZE_C0 2048 // 2 KB Page Size für STM32C0
|
|---|
| 35 |
|
|---|
| 36 | #define FIRST_START_ID 2
|
|---|
| 37 |
|
|---|
| 38 | /* --- FUNKTIONEN --- */
|
|---|
| 39 |
|
|---|
| 40 | /**
|
|---|
| 41 | * @brief Liest eine Datenstruktur direkt aus dem Flash-Speicher.
|
|---|
| 42 | * * @param data_ptr Zeiger auf die Ziel-Struktur im RAM (z.B. &myConfig).
|
|---|
| 43 | * @param size Größe der Struktur in Bytes (sizeof(myConfig)).
|
|---|
| 44 | */
|
|---|
| 45 | void EEPROM_Read(void* data_ptr, size_t size);
|
|---|
| 46 |
|
|---|
| 47 | /**
|
|---|
| 48 | * @brief Speichert eine Datenstruktur im Flash-Speicher.
|
|---|
| 49 | * * Diese Funktion prüft zuerst, ob sich die Daten im Vergleich zum Flash
|
|---|
| 50 | * geändert haben. Falls ja, wird die gesamte Flash-Page gelöscht und
|
|---|
| 51 | * die Struktur neu geschrieben (Double-Word Alignment wird automatisch gehandhabt).
|
|---|
| 52 | * * @param data_ptr Zeiger auf die zu speichernde Struktur im RAM.
|
|---|
| 53 | * @param size Größe der Struktur in Bytes.
|
|---|
| 54 | * @return HAL_StatusTypeDef HAL_OK bei Erfolg, ansonsten Fehlercode.
|
|---|
| 55 | */
|
|---|
| 56 | HAL_StatusTypeDef EEPROM_Write(void* data_ptr, size_t size);
|
|---|
| 57 |
|
|---|
| 58 |
|
|---|
| 59 |
|
|---|
| 60 | void EEPROM_WriteDefaults(void);
|
|---|
| 61 | void EEPROM_ReadDeviceParameter(void);
|
|---|
| 62 | uint16_t EEPROM_ReadFirstStart(void);
|
|---|
| 63 | void EEPROM_StoreConfig(bool writeSN);
|
|---|
| 64 |
|
|---|
| 65 | typedef struct __attribute__((packed))
|
|---|
| 66 | {
|
|---|
| 67 | uint32_t sn;
|
|---|
| 68 | uint32_t baudrate; // 8-9 Die Modbus Baudrate (default 19200 Bit/s). Gltig im Bereich von 50 Bit/s bis 1000 000 Bit/s
|
|---|
| 69 | uint16_t parityMode; // 10 UART Parity Mode (default EVEN) mgliche Werte 0=EVEN, 1=ODD, 2=NONE
|
|---|
| 70 | uint16_t stopBit; // 11 UART Stop Bit Reserviert, Aktuell automatisch selektiert nach Modbus standart Bei Parity EVEN oder ODD 1, bei NONE werden 2 stopbits genutzt
|
|---|
| 71 | uint16_t slave_address; // 12 Modbus Slave Adresse (default 1) mgliche Werte von 1 bis 247
|
|---|
| 72 | uint16_t first_start_id;
|
|---|
| 73 |
|
|---|
| 74 | } flash_device_parameter_t ;
|
|---|
| 75 |
|
|---|
| 76 |
|
|---|
| 77 |
|
|---|
| 78 | #ifdef __cplusplus
|
|---|
| 79 | }
|
|---|
| 80 | #endif
|
|---|
| 81 |
|
|---|
| 82 | #endif /* EEPROM_EMULATION_H */
|
|---|