This commit is contained in:
andrea
2025-12-08 13:48:52 +01:00
parent 792e63b21c
commit 3db6a38a2b
59 changed files with 73522 additions and 48789 deletions

View File

@@ -12,6 +12,7 @@ extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim4;
extern const uint16_t EE_VirtAddrs[];
bool toHex(char c1,char c2,char c3,char c4,uint16_t* retval){
if((c1>='0')&&(c1<='9')){
@@ -39,11 +40,11 @@ bool toHex(char c1,char c2,char c3,char c4,uint16_t* retval){
}else return false;
*retval=c1;
*retval*=10;
*retval*=16;
*retval+=c2;
*retval*=10;
*retval*=16;
*retval+=c3;
*retval*=10;
*retval*=16;
*retval+=c4;
return true;
@@ -55,7 +56,9 @@ void manageCDC(void){
unsigned char s[100];
uint8_t mot,dir,dm,m,c,d,u;
uint16_t val;
uint16_t st;
uint16_t eeadd;
uint8_t i;
if (CDC_Available()) {
int rx = CDC_ReadByte();
@@ -124,9 +127,14 @@ void manageCDC(void){
if(rxbuf[1]=='r'){
if(rxidx==4){
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
EEW_Read(eeadd, &val);
sprintf((char*)s,"\nee 0x%02x=%04x",eeadd,val);
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
st=EEW_Read(eeadd, &val);
if (st == EE_OK){
sprintf((char*)s,"\nee 0x%02x=0x%04x",eeadd,val);
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
}else{
sprintf((char*)s,"\nee read error %d",st);
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
}
}else{
sprintf((char*)s,"\n?eraa hex values");
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
@@ -139,23 +147,35 @@ void manageCDC(void){
if(rxidx==8){
if(toHex('0','0',rxbuf[2],rxbuf[3],&eeadd)){
if(toHex(rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],&val)){
EEW_Write(eeadd, val);
sprintf((char*)s,"\ndone");
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
}else{
sprintf((char*)s,"\n?ewaavvvv hex values");
st=EEW_Write(eeadd, val);
if (st == EE_OK)sprintf((char*)s,"\ndone 0x%02x=0x%04x",eeadd,val);
else sprintf((char*)s,"\nee write error %d", st);
}else sprintf((char*)s,"\n?ewaavvvv hex values");
}else sprintf((char*)s,"\n?ewaa hex values");
}else sprintf((char*)s,"\n?ewaavvvv");
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
}else if(rxbuf[1]=='d'){
if(rxidx==2){
for(i=0;i<32;i++){
if((i%4)==0){
sprintf((char*)s,"\n");
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
}
st=EEW_Read(i, &val);
if (st == EE_OK){
sprintf((char*)s,"0x%02x=0x%04x ",i,val);
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
}else{
sprintf((char*)s,"rderr %d ",st);
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
}
}else{
sprintf((char*)s,"\n?ewaa hex values");
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
}
}else{
sprintf((char*)s,"\n?ewaavvvv");
sprintf((char*)s,"\n?ed");
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
}
}else{
sprintf((char*)s,"\n?er|w");
sprintf((char*)s,"\n?er|w|d");
while (CDC_Transmit_FS(s, strlen((char*)s)) == USBD_BUSY);
}
}else{

View File

@@ -31,7 +31,6 @@ const uint16_t EE_VirtAddrs[EE_NUM_VIRTUAL_ADDR] =
0x0019, 0x001A, 0x001B, 0x001C,
0x001D, 0x001E, 0x001F, 0x0020
};
/* ========================================================================= */
/* --- Internal helpers ---------------------------------------------------- */
@@ -91,53 +90,63 @@ static uint32_t EE_FindFreeAddress(uint32_t pageBase)
return 0U; /* No space */
}
/* Find latest value of VirtAddress in a specific page */
/* Find latest value of VirtAddress in a specific page (internal, uses EE_Status) */
/* Find latest value of VirtAddress in a specific page (scan forward) */
static EE_Status EE_FindInPage(uint32_t pageBase, uint16_t VirtAddress, uint16_t *Data)
{
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
uint32_t addr;
uint32_t addr = pageBase + 2U; // skip status halfword
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
EE_Status result = EE_NOT_FOUND;
uint16_t lastVal = 0;
if (Data == NULL)
return EE_ERROR;
/* Start from last possible record and go backwards */
for (addr = pageEnd - sizeof(EE_Record_t); addr > pageBase + 1U; addr -= sizeof(EE_Record_t))
while (addr <= (pageEnd - sizeof(EE_Record_t)))
{
uint16_t vaddr = *(__IO uint16_t *)addr;
uint16_t value = *(__IO uint16_t *)(addr + 2U);
if (vaddr == 0xFFFFU)
{
/* Empty slot, skip */
continue;
// First empty slot => no more records in this page
break;
}
uint16_t value = *(__IO uint16_t *)(addr + 2U);
if (vaddr == VirtAddress)
{
*Data = value;
return EE_OK;
lastVal = value; // keep most recent
result = EE_OK;
}
addr += sizeof(EE_Record_t); // move 4 bytes forward
}
return EE_NOT_FOUND;
if (result == EE_OK)
*Data = lastVal;
return result;
}
/* Format both pages: erase and set PAGE0 as VALID */
static EE_Status EE_Format(void)
{
if (EE_FlashErasePage(EE_PAGE0_BASE) != HAL_OK)
return EE_ERROR;
return EE_STATUS_ERROR;
if (EE_FlashErasePage(EE_PAGE1_BASE) != HAL_OK)
return EE_ERROR;
return EE_STATUS_ERROR;
if (EE_FlashProgramHalfWord(EE_PAGE0_BASE, EE_PAGE_STATUS_VALID) != HAL_OK)
return EE_ERROR;
return EE_STATUS_ERROR;
/* PAGE1 will remain erased (status = 0xFFFF) */
EE_ActivePageBase = EE_PAGE0_BASE;
return EE_OK;
return EE_STATUS_OK;
}
/* Get the base of the other page */
@@ -157,11 +166,11 @@ static EE_Status EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
/* Erase new page */
if (EE_FlashErasePage(newBase) != HAL_OK)
return EE_ERROR;
return EE_STATUS_ERROR;
/* Mark new page as RECEIVE */
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_RECEIVE) != HAL_OK)
return EE_ERROR;
return EE_STATUS_ERROR;
/* Start writing records just after status */
addr = newBase + 2U;
@@ -180,7 +189,7 @@ static EE_Status EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
{
/* Read latest value from old active page */
st = EE_FindInPage(oldBase, vaddr, &value);
if (st != EE_OK)
if (st != EE_STATUS_OK)
{
/* Variable never written -> skip */
continue;
@@ -189,27 +198,27 @@ static EE_Status EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
/* Write record to new page */
if (EE_FlashProgramHalfWord(addr, vaddr) != HAL_OK)
return EE_ERROR;
return EE_STATUS_ERROR;
if (EE_FlashProgramHalfWord(addr + 2U, value) != HAL_OK)
return EE_ERROR;
return EE_STATUS_ERROR;
addr += sizeof(EE_Record_t);
if (addr >= (newBase + EE_PAGE_SIZE))
return EE_NO_SPACE;
return EE_STATUS_NO_SPACE;
}
/* Erase old page */
if (EE_FlashErasePage(oldBase) != HAL_OK)
return EE_ERROR;
return EE_STATUS_ERROR;
/* Mark new page as VALID */
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_VALID) != HAL_OK)
return EE_ERROR;
return EE_STATUS_ERROR;
/* Update active page */
EE_ActivePageBase = newBase;
return EE_OK;
return EE_STATUS_OK;
}
/* --- Public API ----------------------------------------------------------- */
@@ -218,8 +227,9 @@ static EE_Status EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
* Initialize the EEPROM emulation.
* - Checks page statuses and chooses the active page.
* - If inconsistent or blank, formats pages.
* PUBLIC RETURN TYPE: uint16_t (EE_OK / EE_ERROR / ...)
*/
EE_Status EE_Init(void)
uint16_t EE_Init(void)
{
uint16_t status0 = EE_GetPageStatus(EE_PAGE0_BASE);
uint16_t status1 = EE_GetPageStatus(EE_PAGE1_BASE);
@@ -227,7 +237,7 @@ EE_Status EE_Init(void)
if ((status0 == EE_PAGE_STATUS_ERASED) && (status1 == EE_PAGE_STATUS_ERASED))
{
/* Fresh device -> format */
return EE_Format();
return (uint16_t)EE_Format();
}
else if ((status0 == EE_PAGE_STATUS_VALID) && (status1 == EE_PAGE_STATUS_ERASED))
{
@@ -242,27 +252,32 @@ EE_Status EE_Init(void)
else
{
/* Any weird or inconsistent state -> reformat */
return EE_Format();
return (uint16_t)EE_Format();
}
}
/*
* Read a 16-bit variable by its virtual address.
* PUBLIC RETURN: EE_OK / EE_NOT_FOUND / EE_ERROR (as uint16_t)
*/
EE_Status EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data)
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data)
{
EE_Status st;
if (Data == NULL)
return EE_ERROR;
return EE_FindInPage(EE_ActivePageBase, VirtAddress, Data);
st = EE_FindInPage(EE_ActivePageBase, VirtAddress, Data);
return (uint16_t)st;
}
/*
* Write (append) a 16-bit variable.
* - Writes a new record in the active page.
* - If the page is full, triggers a page transfer (GC).
* PUBLIC RETURN: EE_OK / EE_ERROR / EE_NO_SPACE (as uint16_t)
*/
EE_Status EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
{
uint32_t freeAddr;
EE_Status st;
@@ -282,6 +297,5 @@ EE_Status EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
/* No space -> page transfer */
st = EE_PageTransfer(VirtAddress, Data);
return st;
return (uint16_t)st;
}

View File

@@ -24,12 +24,18 @@ extern "C" {
typedef enum
{
EE_OK = 0,
EE_ERROR,
EE_NOT_FOUND,
EE_NO_SPACE
EE_STATUS_OK = 0,
EE_STATUS_ERROR,
EE_STATUS_NOT_FOUND,
EE_STATUS_NO_SPACE
} EE_Status;
/* For compatibility with ST style uint16_t return codes */
#define EE_OK ((uint16_t)EE_STATUS_OK)
#define EE_ERROR ((uint16_t)EE_STATUS_ERROR)
#define EE_NOT_FOUND ((uint16_t)EE_STATUS_NOT_FOUND)
#define EE_NO_SPACE ((uint16_t)EE_STATUS_NO_SPACE)
/* Flash parameters for STM32F103C8T6 */
#define EE_FLASH_BASE_ADDR 0x08000000U
#define EE_PAGE_SIZE 0x400U /* 1 kB pages */
@@ -59,30 +65,27 @@ typedef enum
#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);
/* Public API now using uint16_t like ST examples */
uint16_t EE_Init(void);
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data);
uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
/* Pseudo-array accessor */
static inline EE_Status EEW_Read(uint8_t idx, uint16_t *value)
/* Pseudo-array accessor EEW[idx] */
static inline uint16_t 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)
static inline uint16_t EEW_Write(uint8_t idx, uint16_t value)
{
return EE_WriteVariable(EEW_ADDR(idx), value);
}
#ifdef __cplusplus
}
#endif
#endif /* __EEPROM_H */

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
../Core/Src/eeprom.h:74:25:EEW_Read 1
../Core/Src/eeprom.h:79:25:EEW_Write 1
../Core/Src/cdc_int.c:16:6:toHex 17
../Core/Src/cdc_int.c:52:6:manageCDC 51
../Core/Src/eeprom.h:77:24:EEW_Read 1
../Core/Src/eeprom.h:82:24:EEW_Write 1
../Core/Src/cdc_int.c:17:6:toHex 17
../Core/Src/cdc_int.c:53:6:manageCDC 60

View File

@@ -1,4 +1,4 @@
../Core/Src/eeprom.h:74:25:EEW_Read 16 static
../Core/Src/eeprom.h:79:25:EEW_Write 16 static
../Core/Src/cdc_int.c:16:6:toHex 16 static
../Core/Src/cdc_int.c:52:6:manageCDC 184 static
../Core/Src/eeprom.h:77:24:EEW_Read 16 static
../Core/Src/eeprom.h:82:24:EEW_Write 16 static
../Core/Src/cdc_int.c:17:6:toHex 16 static
../Core/Src/cdc_int.c:53:6:manageCDC 184 static

View File

@@ -1,11 +1,11 @@
../Core/Src/eeprom.c:39:17:EE_GetPageStatus 1
../Core/Src/eeprom.c:44:26:EE_FlashProgramHalfWord 1
../Core/Src/eeprom.c:55:26:EE_FlashErasePage 1
../Core/Src/eeprom.c:74:17:EE_FindFreeAddress 3
../Core/Src/eeprom.c:95:18:EE_FindInPage 5
../Core/Src/eeprom.c:126:18:EE_Format 4
../Core/Src/eeprom.c:144:17:EE_GetOtherPageBase 2
../Core/Src/eeprom.c:150:18:EE_PageTransfer 11
../Core/Src/eeprom.c:222:11:EE_Init 7
../Core/Src/eeprom.c:252:11:EE_ReadVariable 2
../Core/Src/eeprom.c:265:11:EE_WriteVariable 4
../Core/Src/eeprom.c:38:17:EE_GetPageStatus 1
../Core/Src/eeprom.c:43:26:EE_FlashProgramHalfWord 1
../Core/Src/eeprom.c:54:26:EE_FlashErasePage 1
../Core/Src/eeprom.c:73:17:EE_FindFreeAddress 3
../Core/Src/eeprom.c:95:18:EE_FindInPage 6
../Core/Src/eeprom.c:135:18:EE_Format 4
../Core/Src/eeprom.c:153:17:EE_GetOtherPageBase 2
../Core/Src/eeprom.c:159:18:EE_PageTransfer 11
../Core/Src/eeprom.c:232:10:EE_Init 7
../Core/Src/eeprom.c:263:10:EE_ReadVariable 2
../Core/Src/eeprom.c:280:10:EE_WriteVariable 4

View File

@@ -1,11 +1,11 @@
../Core/Src/eeprom.c:39:17:EE_GetPageStatus 16 static
../Core/Src/eeprom.c:44:26:EE_FlashProgramHalfWord 32 static
../Core/Src/eeprom.c:55:26:EE_FlashErasePage 40 static
../Core/Src/eeprom.c:74:17:EE_FindFreeAddress 32 static
../Core/Src/eeprom.c:38:17:EE_GetPageStatus 16 static
../Core/Src/eeprom.c:43:26:EE_FlashProgramHalfWord 32 static
../Core/Src/eeprom.c:54:26:EE_FlashErasePage 40 static
../Core/Src/eeprom.c:73:17:EE_FindFreeAddress 32 static
../Core/Src/eeprom.c:95:18:EE_FindInPage 40 static
../Core/Src/eeprom.c:126:18:EE_Format 8 static
../Core/Src/eeprom.c:144:17:EE_GetOtherPageBase 16 static
../Core/Src/eeprom.c:150:18:EE_PageTransfer 40 static
../Core/Src/eeprom.c:222:11:EE_Init 16 static
../Core/Src/eeprom.c:252:11:EE_ReadVariable 16 static
../Core/Src/eeprom.c:265:11:EE_WriteVariable 24 static
../Core/Src/eeprom.c:135:18:EE_Format 8 static
../Core/Src/eeprom.c:153:17:EE_GetOtherPageBase 16 static
../Core/Src/eeprom.c:159:18:EE_PageTransfer 40 static
../Core/Src/eeprom.c:232:10:EE_Init 16 static
../Core/Src/eeprom.c:263:10:EE_ReadVariable 24 static
../Core/Src/eeprom.c:280:10:EE_WriteVariable 24 static