void flashFirmware(uint8_t* source, uint32_t size){ __disable_irq(); // Disable ALL interrupts. Can only be executed in Privileged modes. setLed(RED); eeprom_unlock(); if(size > (16+16+64+128)*1024){ eeprom_erase_sector(FLASH_Sector_6); toggleLed(); // inline } if(size > (16+16+64)*1024){ eeprom_erase_sector(FLASH_Sector_5); toggleLed(); } if(size > (16+16)*1024){ eeprom_erase_sector(FLASH_Sector_4); toggleLed(); } if(size > 16*1024){ eeprom_erase_sector(FLASH_Sector_3); toggleLed(); } eeprom_erase_sector(FLASH_Sector_2); toggleLed(); eeprom_write_block(ADDR_FLASH_SECTOR_2, source, size); eeprom_lock(); eeprom_wait(); NVIC_SystemReset(); // (static inline) }
void ApplicationSettings::saveToFlash(){ eeprom_unlock(); // if(eeprom_erase(APPLICATION_SETTINGS_ADDR) == 0) eeprom_erase_sector(APPLICATION_SETTINGS_SECTOR); eeprom_write_block(APPLICATION_SETTINGS_ADDR, this, sizeof(*this)); eeprom_lock(); }
void ApplicationSettings::clearFlash(){ eeprom_unlock(); eeprom_erase_sector(APPLICATION_SETTINGS_SECTOR); // eeprom_erase(APPLICATION_SETTINGS_ADDR); eeprom_lock(); }
int eeprom_erase(uint32_t address){ int ret = -1; if(address < ADDR_FLASH_SECTOR_1) ret = -1; // protect boot sector /* eeprom_erase_sector(FLASH_Sector_0, VoltageRange_3); */ else if(address < ADDR_FLASH_SECTOR_2) ret = eeprom_erase_sector(FLASH_Sector_1); else if(address < ADDR_FLASH_SECTOR_3) ret = eeprom_erase_sector(FLASH_Sector_2); else if(address < ADDR_FLASH_SECTOR_4) ret = eeprom_erase_sector(FLASH_Sector_3); else if(address < ADDR_FLASH_SECTOR_5) ret = eeprom_erase_sector(FLASH_Sector_4); else if(address < ADDR_FLASH_SECTOR_6) ret = eeprom_erase_sector(FLASH_Sector_5); else if(address < ADDR_FLASH_SECTOR_7) ret = eeprom_erase_sector(FLASH_Sector_6); else if(address < ADDR_FLASH_SECTOR_8) ret = eeprom_erase_sector(FLASH_Sector_7); else if(address < ADDR_FLASH_SECTOR_9) ret = eeprom_erase_sector(FLASH_Sector_8); else if(address < ADDR_FLASH_SECTOR_10) ret = eeprom_erase_sector(FLASH_Sector_9); else if(address < ADDR_FLASH_SECTOR_11) ret = eeprom_erase_sector(FLASH_Sector_10); else if(address < 0x08100000) ret = eeprom_erase_sector(FLASH_Sector_11); else ret = -1; return ret; }