wip
This commit is contained in:
88
workspace/AUTOM10/Core/Src/eeprom.h
Normal file
88
workspace/AUTOM10/Core/Src/eeprom.h
Normal file
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* eeprom.h
|
||||
*
|
||||
* Created on: Dec 7, 2025
|
||||
* Author: user
|
||||
*/
|
||||
|
||||
#ifndef __EEPROM_H
|
||||
#define __EEPROM_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "stm32f1xx_hal.h"
|
||||
|
||||
/*
|
||||
* Simple EEPROM emulation for STM32F103C8T6 (medium density).
|
||||
* - Uses 2 Flash pages (1 kB each) at the end of Flash.
|
||||
* - Stores variables as 16-bit values identified by 16-bit "virtual addresses".
|
||||
*
|
||||
* You must define the list of virtual addresses in eeprom.c: EE_VirtAddrs[].
|
||||
*/
|
||||
|
||||
typedef enum
|
||||
{
|
||||
EE_OK = 0,
|
||||
EE_ERROR,
|
||||
EE_NOT_FOUND,
|
||||
EE_NO_SPACE
|
||||
} EE_Status;
|
||||
|
||||
/* Flash parameters for STM32F103C8T6 */
|
||||
#define EE_FLASH_BASE_ADDR 0x08000000U
|
||||
#define EE_PAGE_SIZE 0x400U /* 1 kB pages */
|
||||
|
||||
/*
|
||||
* Here we assume a 64 kB Flash device (STM32F103C8T6):
|
||||
* Flash range: 0x0800 0000 - 0x0800 FFFF
|
||||
* Pages: 0..63 (64 pages)
|
||||
* We use the last 2 pages for EEPROM:
|
||||
* - Page 62: 0x0800 F800
|
||||
* - Page 63: 0x0800 FC00
|
||||
*/
|
||||
#define EE_PAGE0_BASE (EE_FLASH_BASE_ADDR + (62U * EE_PAGE_SIZE))
|
||||
#define EE_PAGE1_BASE (EE_FLASH_BASE_ADDR + (63U * EE_PAGE_SIZE))
|
||||
|
||||
/* Page status markers (stored in the first halfword of each page) */
|
||||
#define EE_PAGE_STATUS_ERASED 0xFFFFU
|
||||
#define EE_PAGE_STATUS_VALID 0xAAAAU
|
||||
#define EE_PAGE_STATUS_RECEIVE 0x5555U
|
||||
|
||||
/*
|
||||
* Configure how many virtual variables you have.
|
||||
* Example: bytes, words, and array elements mapped to 16-bit variables.
|
||||
* Set EE_NUM_VIRTUAL_ADDR and define EE_VirtAddrs[] in eeprom.c.
|
||||
*/
|
||||
/* 32 virtual variables, sequential addresses */
|
||||
#define EE_NUM_VIRTUAL_ADDR 32U
|
||||
#define EEW_ADDR(i) (uint16_t)(0x0001 + (i)) // i = 0..31
|
||||
|
||||
|
||||
|
||||
|
||||
/* Virtual address table (defined in eeprom.c, can be customized) */
|
||||
extern const uint16_t EE_VirtAddrs[EE_NUM_VIRTUAL_ADDR];
|
||||
|
||||
/* Public API */
|
||||
EE_Status EE_Init(void);
|
||||
EE_Status EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data);
|
||||
EE_Status EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
|
||||
|
||||
/* Pseudo-array accessor */
|
||||
static inline EE_Status EEW_Read(uint8_t idx, uint16_t *value)
|
||||
{
|
||||
return EE_ReadVariable(EEW_ADDR(idx), value);
|
||||
}
|
||||
|
||||
static inline EE_Status EEW_Write(uint8_t idx, uint16_t value)
|
||||
{
|
||||
return EE_WriteVariable(EEW_ADDR(idx), value);
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __EEPROM_H */
|
||||
|
||||
Reference in New Issue
Block a user