STM32 Write to internal EEPROM only work once
Hi people,
i have trouble with writing to the internal eeprom / flash. I can write values one time to the EEPROM and read it correct back from eeprom. When i write next time values to the eeprom and read them, the values changed but are incorrect. I tried many solutions, but know i am perplexed.
//EEPROM Funktionen
void EEPROM_Unlock(void)
{
while ((FLASH->SR & FLASH_SR_BSY) != 0) /* Wait for FLASH to be free */
{ /* insert timeout test */ }
if ((FLASH->PECR & FLASH_PECR_PELOCK) != 0) /* If PELOCK is locked */
{
FLASH->PEKEYR = FLASH_PEKEY1; /* Unlock PELOCK */
FLASH->PEKEYR = FLASH_PEKEY2;
}
//FLASH->PECR = FLASH->PECR | (FLASH_PECR_ERRIE | FLASH_PECR_EOPIE); /* enable flash interrupts */
}
// EEPROM lock
void EEPROM_Lock(void)
{
while ((FLASH->SR & FLASH_SR_BSY) != 0) /* Wait for FLASH to be free */
{ /* insert timeout test */
}
//FLASH->PECR = FLASH->PECR & ~(FLASH_PECR_ERRIE | FLASH_PECR_EOPIE); /* disable flash interrupts */
FLASH->PECR |= FLASH_PECR_PELOCK; /* Lock memory with PELOCK */
}
// -----------------------------
// 16-bit Array in EEPROM write
// -----------------------------
void WriteEEPROM32Array(uint32_t *src, size_t length)
{
uint32_t address = 0x08080000;
EEPROM_Unlock();
for(size_t i = 0; i < 64;i++)
{
*(uint32_t *)(address) = src[i];
__WFI();
address += 4;
}
EEPROM_Lock();
}
// -----------------------------
// 16-bit Array in EEPROM read
// -----------------------------
void ReadEEPROM32Array(uint32_t *dest, size_t length)
{
uint32_t address = 0x08080000;
for (size_t i = 0; i < 64; i++)
{
dest[i] = *(__IO uint32_t*)address;
address += 4;
}
}My write routine
void SetEEPROM()
{
uint8_t Rx[256];
Messung = 0; // Stopp Set EEprom
HAL_NVIC_DisableIRQ(USART1_IRQn);
HAL_UART_Abort(&huart1);
HAL_UART_Receive(&huart1,(uint8_t*) Rx, 256, 20000);
for(uint8_t i = 0;i<64;i++)
{
KalibWerte[i] |= Rx[(4*i)]<<24;
KalibWerte[i] |= Rx[(4*i)+1]<<16;
KalibWerte[i] |= Rx[(4*i)+2]<<8;
KalibWerte[i] |= Rx[(4*i)+3];
}
WriteEEPROM32Array(KalibWerte, 64);
HAL_UART_Transmit(&huart1, (uint8_t*)("s\r"), 2, 10);
HAL_NVIC_EnableIRQ(USART1_IRQn);
HAL_UART_Receive_IT(&huart1,rxByte, 1);
}Does anybody have an idea or solution?
KR
Stefan
