From eb1a9a8c3f3d3993d5986925bc4ad112c2bbc119 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 28 Aug 2012 18:10:34 -0700 Subject: [PATCH] altos: Explicitly erase memory in STM eeprom driver. This seems to make the STM32L152 happier Signed-off-by: Keith Packard --- src/stm/ao_eeprom_stm.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/stm/ao_eeprom_stm.c b/src/stm/ao_eeprom_stm.c index 1e51b417..5a75a97d 100644 --- a/src/stm/ao_eeprom_stm.c +++ b/src/stm/ao_eeprom_stm.c @@ -82,19 +82,30 @@ ao_intflash_lock(void) stm_flash.pecr |= (1 << STM_FLASH_PECR_PELOCK); } +static void +ao_intflash_wait(void) +{ + /* Wait for the flash unit to go idle */ + while (stm_flash.sr & (1 << STM_FLASH_SR_BSY)) + ; +} + static void ao_intflash_write32(uint16_t pos, uint32_t w) { - uint32_t *addr; + volatile uint32_t *addr; addr = (uint32_t *) (stm_eeprom + pos); - /* Write a word to a valid address in the data EEPROM */ - *addr = w; + /* Erase previous word */ + *addr = 0; + ao_intflash_wait(); - /* Wait for the flash unit to go idle */ - while (stm_flash.sr & (1 << STM_FLASH_SR_BSY)) - ; + if (w) { + /* Write a word to a valid address in the data EEPROM */ + *addr = w; + ao_intflash_wait(); + } } static void @@ -182,6 +193,7 @@ ao_storage_setup(void) void ao_storage_device_info(void) __reentrant { + uint8_t i; printf ("Using internal flash\n"); } -- 2.30.2