F407 内部 Flash 1 MB,分 4 个 16 KB + 1 个 64 KB + 7 个 128 KB 扇区。
| 扇区 | 大小 | 地址范围 |
|---|---|---|
| 扇区 0 | 16 KB | 0x08000000~0x08003FFF |
| 扇区 1 | 16 KB | 0x08004000~0x08007FFF |
| 扇区 2 | 16 KB | 0x08008000~0x0800BFFF |
| 扇区 3 | 16 KB | 0x0800C000~0x0800FFFF |
| 扇区 4 | 64 KB | 0x08010000~0x0801FFFF |
| 扇区 5~11 | 128 KB | 0x08020000~0x080FFFFF |

操作流程:
HAL_FLASH_Unlock();HAL_FLASHEx_Erase(&erase, &err);(必须按扇区擦)HAL_FLASH_Program(TYPEPROGRAM_BYTE, addr, data);HAL_FLASH_Lock();本实验使用 USART1 读写 FLASH → 串口显示。
#define FLASH_ADDR 0x080E0000 // 扇区 11
void flash_write(uint32_t addr, uint8_t *buf, uint32_t len) {
HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef e = {0};
e.TypeErase = FLASH_TYPEERASE_SECTORS;
e.Sector = FLASH_SECTOR_11;
e.NbSectors = 1;
uint32_t err;
HAL_FLASHEx_Erase(&e, &err);
for (uint32_t i = 0; i < len; i++) {
HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, addr + i, buf[i]);
}
HAL_FLASH_Lock();
}
void flash_read(uint32_t addr, uint8_t *buf, uint32_t len) {
for (uint32_t i = 0; i < len; i++) {
buf[i] = *(__IO uint8_t *)(addr + i);
}
}


写入字符串到扇区 11,重启开发板再读 → 一致。