|
|
|
@ -68,15 +68,25 @@ static const flash_layout_t flash_layout[] = {
|
|
|
|
|
{ (uint32_t)FLASH_BASE, (uint32_t)FLASH_PAGE_SIZE, 512 },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#elif defined(STM32H7)
|
|
|
|
|
|
|
|
|
|
static const flash_layout_t flash_layout[] = {
|
|
|
|
|
{ 0x08000000, 0x20000, 8 },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
#error Unsupported processor
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if defined(MCU_SERIES_L4)
|
|
|
|
|
#if defined(MCU_SERIES_L4) || defined(STM32H7)
|
|
|
|
|
|
|
|
|
|
// get the bank of a given flash address
|
|
|
|
|
static uint32_t get_bank(uint32_t addr) {
|
|
|
|
|
#if defined(STM32H7)
|
|
|
|
|
if (READ_BIT(FLASH->OPTCR, FLASH_OPTCR_SWAP_BANK) == 0) {
|
|
|
|
|
#else
|
|
|
|
|
if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0) {
|
|
|
|
|
#endif
|
|
|
|
|
// no bank swap
|
|
|
|
|
if (addr < (FLASH_BASE + FLASH_BANK_SIZE)) {
|
|
|
|
|
return FLASH_BANK_1;
|
|
|
|
@ -93,6 +103,7 @@ static uint32_t get_bank(uint32_t addr) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if defined(MCU_SERIES_L4)
|
|
|
|
|
// get the page of a given flash address
|
|
|
|
|
static uint32_t get_page(uint32_t addr) {
|
|
|
|
|
if (addr < (FLASH_BASE + FLASH_BANK_SIZE)) {
|
|
|
|
@ -103,6 +114,7 @@ static uint32_t get_page(uint32_t addr) {
|
|
|
|
|
return (addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
@ -153,12 +165,19 @@ void flash_erase(uint32_t flash_dest, const uint32_t *src, uint32_t num_word32)
|
|
|
|
|
EraseInitStruct.NbPages = get_page(flash_dest + 4 * num_word32 - 1) - EraseInitStruct.Page + 1;;
|
|
|
|
|
#else
|
|
|
|
|
// Clear pending flags (if any)
|
|
|
|
|
#if defined(STM32H7)
|
|
|
|
|
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS_BANK1 | FLASH_FLAG_ALL_ERRORS_BANK2);
|
|
|
|
|
#else
|
|
|
|
|
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
|
|
|
|
|
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// erase the sector(s)
|
|
|
|
|
EraseInitStruct.TypeErase = TYPEERASE_SECTORS;
|
|
|
|
|
EraseInitStruct.VoltageRange = VOLTAGE_RANGE_3; // voltage range needs to be 2.7V to 3.6V
|
|
|
|
|
#if defined(STM32H7)
|
|
|
|
|
EraseInitStruct.Banks = get_bank(flash_dest);
|
|
|
|
|
#endif
|
|
|
|
|
EraseInitStruct.Sector = flash_get_sector_info(flash_dest, NULL, NULL);
|
|
|
|
|
EraseInitStruct.NbSectors = flash_get_sector_info(flash_dest + 4 * num_word32 - 1, NULL, NULL) - EraseInitStruct.Sector + 1;
|
|
|
|
|
#endif
|
|
|
|
@ -224,6 +243,19 @@ void flash_write(uint32_t flash_dest, const uint32_t *src, uint32_t num_word32)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#elif defined(STM32H7)
|
|
|
|
|
|
|
|
|
|
// program the flash 256 bits at a time
|
|
|
|
|
for (int i = 0; i < num_word32 / 8; i++) {
|
|
|
|
|
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, flash_dest, (uint64_t)(uint32_t)src) != HAL_OK) {
|
|
|
|
|
// error occurred during flash write
|
|
|
|
|
HAL_FLASH_Lock(); // lock the flash
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
flash_dest += 32;
|
|
|
|
|
src += 8;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
// program the flash word by word
|
|
|
|
|