2025-01-13 8:28 AM - last edited on 2025-04-14 7:15 AM by mƎALLEm
Flash Area | Memory start address | Size | Name |
BANK 1 | 0x0800 0000 | 2k | page 0 |
0x0800 0800 | 2k | page 1 | |
0x0800 1000 | 2k | page 2 | |
... | |||
0x0807 F800 | 2k | page 255 | |
BANK 2 | 0x0808 0000 | 2k | page 256 |
0x0808 0800 | 2k | page 257 | |
0x0808 1000 | 2k | page 258 | |
... | |||
0x080F F800 | 2k | page 511 |
uint32_t fb_mode = LL_SYSCFG_GetFlashBankMode();
if (fb_mode == 0)
{
/* Running from BANK 1 */
}
else
{
/* Running from BANK 2 */
}
HAL_StatusTypeDef status = HAL_OK;
uint64_t *ptr = buffer; /* Contiguous array of 256 bytes of binary image. */
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x08080000, *ptr++);
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x08080800, *ptr++);
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x08081000, *ptr++);
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x08000000, *ptr++);
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x08000800, *ptr++);
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x08001000, *ptr++);
/* Get the current configuration */
HAL_FLASHEx_OBGetConfig(&obConfig);
uint32_t fb_mode = LL_SYSCFG_GetFlashBankMode();
if (fb_mode == 0) {
/* Explicitly boot from Bank 2 following reset
* as we are running from Bank 1.
*/
obConfig.USERConfig = OB_BFB2_ENABLE;
}
else {
/* Explicitly boot from Bank 1 following reset
* as we are running from Bank 2.
*/
obConfig.USERConfig = OB_BFB2_DISABLE;
}
/* Initiating the modifications */
result = HAL_FLASH_Unlock();
/* program if unlock is successful */
if (result == HAL_OK) {
result = HAL_FLASH_OB_Unlock();
}
/* Program if unlock is successful. */
if ((READ_BIT(FLASH->CR, FLASH_CR_OPTLOCK) == RESET)) {
result = HAL_FLASHEx_OBProgram(&obConfig);
}
/* No return as the last call triggers a reset. */