You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.2 KiB
50 lines
1.2 KiB
bool flash_is_locked(void) {
|
|
return (FLASH->CR & FLASH_CR_LOCK);
|
|
}
|
|
|
|
void flash_unlock(void) {
|
|
FLASH->KEYR = 0x45670123;
|
|
FLASH->KEYR = 0xCDEF89AB;
|
|
}
|
|
|
|
void flash_lock(void) {
|
|
FLASH->CR |= FLASH_CR_LOCK;
|
|
}
|
|
|
|
bool flash_erase_sector(uint16_t sector) {
|
|
#ifdef BOOTSTUB
|
|
// don't erase the bootloader(sector 0)
|
|
uint16_t min_sector = 1U;
|
|
uint16_t max_sector = 11U;
|
|
#else
|
|
uint16_t min_sector = LOGGING_FLASH_SECTOR_A;
|
|
uint16_t max_sector = LOGGING_FLASH_SECTOR_B;
|
|
#endif
|
|
|
|
bool ret = false;
|
|
if ((sector >= min_sector) && (sector <= max_sector) && (!flash_is_locked())) {
|
|
FLASH->CR = (sector << 3) | FLASH_CR_SER;
|
|
FLASH->CR |= FLASH_CR_STRT;
|
|
while ((FLASH->SR & FLASH_SR_BSY) != 0U);
|
|
ret = true;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void flash_write_word(uint32_t *prog_ptr, uint32_t data) {
|
|
#ifndef BOOTSTUB
|
|
// don't write to any region besides the logging region
|
|
if ((prog_ptr >= (uint32_t *)LOGGING_FLASH_BASE_A) && (prog_ptr < (uint32_t *)(LOGGING_FLASH_BASE_B + LOGGING_FLASH_SECTOR_SIZE))) {
|
|
#endif
|
|
|
|
uint32_t *pp = prog_ptr;
|
|
FLASH->CR = FLASH_CR_PSIZE_1 | FLASH_CR_PG;
|
|
*pp = data;
|
|
while ((FLASH->SR & FLASH_SR_BSY) != 0U);
|
|
|
|
#ifndef BOOTSTUB
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void flush_write_buffer(void) { }
|
|
|