static void
ao_intflash_unlock(void)
{
+ /* Disable backup write protection */
+ stm_pwr.cr |= (1 << STM_PWR_CR_DBP);
+
/* Unlock Data EEPROM and FLASH_PECR register */
stm_flash.pekeyr = STM_FLASH_PEKEYR_PEKEY1;
stm_flash.pekeyr = STM_FLASH_PEKEYR_PEKEY2;
+ if (stm_flash.pecr & (1 << STM_FLASH_PECR_PELOCK))
+ printf ("eeprom unlock failed\n");
+
/* Configure the FTDW bit (FLASH_PECR[8]) to execute
* word write, whatever the previous value of the word
* being written to
(0 << STM_FLASH_PECR_EOPIE) |
(0 << STM_FLASH_PECR_FPRG) |
(0 << STM_FLASH_PECR_ERASE) |
- (0 << STM_FLASH_PECR_FTDW) |
- (1 << STM_FLASH_PECR_DATA) |
+ (1 << STM_FLASH_PECR_FTDW) |
+ (0 << STM_FLASH_PECR_DATA) |
(0 << STM_FLASH_PECR_PROG) |
(0 << STM_FLASH_PECR_OPTLOCK) |
(0 << STM_FLASH_PECR_PRGLOCK) |
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;
-
- /* Wait for the flash unit to go idle */
- while (stm_flash.sr & (1 << STM_FLASH_SR_BSY))
- ;
+ ao_intflash_wait();
}
static void
void
ao_storage_device_info(void) __reentrant
{
+ uint8_t i;
printf ("Using internal flash\n");
}