#include "stm32c0xx_hal.h" #include #include /** * @file eeprom_emulation.h * @brief Einfache EEPROM-Emulation für STM32C031 (Double-Word Schreibzugriff) * @note Nutzt die HAL-Library für Flash-Operationen. */ #ifndef EEPROM_EMULATION_H #define EEPROM_EMULATION_H #ifdef __cplusplus extern "C" { #endif #include "stm32c0xx_hal.h" #include /* --- KONFIGURATION --- */ /** * @brief Flash-Adresse für die Emulation. * Für STM32C031 mit 32KB Flash ist 0x08007800 der Start der letzten Page (Page 15). * WICHTIG: Sicherstellen, dass der Programmcode diese Adresse nicht erreicht! */ #define MY_EEPROM_FLASH_ADDR ((uint32_t)0x08007800) /** @brief Die entsprechende Page-Nummer zur Adresse (für das Löschen benötigt) */ #define MY_EEPROM_PAGE 15 #define FLASH_PAGE_SIZE_C0 2048 // 2 KB Page Size für STM32C0 #define FIRST_START_ID 2 /* --- FUNKTIONEN --- */ /** * @brief Liest eine Datenstruktur direkt aus dem Flash-Speicher. * * @param data_ptr Zeiger auf die Ziel-Struktur im RAM (z.B. &myConfig). * @param size Größe der Struktur in Bytes (sizeof(myConfig)). */ void EEPROM_Read(void* data_ptr, size_t size); /** * @brief Speichert eine Datenstruktur im Flash-Speicher. * * Diese Funktion prüft zuerst, ob sich die Daten im Vergleich zum Flash * geändert haben. Falls ja, wird die gesamte Flash-Page gelöscht und * die Struktur neu geschrieben (Double-Word Alignment wird automatisch gehandhabt). * * @param data_ptr Zeiger auf die zu speichernde Struktur im RAM. * @param size Größe der Struktur in Bytes. * @return HAL_StatusTypeDef HAL_OK bei Erfolg, ansonsten Fehlercode. */ HAL_StatusTypeDef EEPROM_Write(void* data_ptr, size_t size); void EEPROM_WriteDefaults(void); void EEPROM_ReadDeviceParameter(void); uint16_t EEPROM_ReadFirstStart(void); void EEPROM_StoreConfig(bool writeSN); typedef struct __attribute__((packed)) { uint32_t sn; uint32_t baudrate; // 8-9 Die Modbus Baudrate (default 19200 Bit/s). Gltig im Bereich von 50 Bit/s bis 1000 000 Bit/s uint16_t parityMode; // 10 UART Parity Mode (default EVEN) mgliche Werte 0=EVEN, 1=ODD, 2=NONE 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 uint16_t slave_address; // 12 Modbus Slave Adresse (default 1) mgliche Werte von 1 bis 247 uint16_t first_start_id; } flash_device_parameter_t ; #ifdef __cplusplus } #endif #endif /* EEPROM_EMULATION_H */