STM32 復位時採樣 BOOT0 (PB8/BOOT0) 與 BOOT1 (PB9/BOOT1) 電平,決定從哪個記憶體區域取向量表並開始執行:
| BOOT1 | BOOT0 | 啟動模式 | 存儲介質 | 典型用途 |
|---|---|---|---|---|
| X | 0 | 主閃存啟動 | 內部 Flash (用戶程式區) | 正常產品運行,用戶應用程式 |
| 0 | 1 | 系統存儲器啟動 | 內部 System Memory (ROM) | ISP/USB DFU/串口下載器 (廠商燒錄 Bootloader) |
| 1 | 1 | 內嵌 SRAM 啟動 | 內部 SRAM | RAM 運行、調試、加密應用、快速原型驗證 |
註: BOOT1 僅在 BOOT0=1 時生效;BOOT0=0 時無視 BOOT1。
0x0800 0000 起始 (大小視型號 64KB~2MB)。0x0800 0004 (Reset Handler 位址) → 跳轉執行。SCB->VTOR 重定向 (支援 Bootloader + App 架構)。0x1FFF 0000 起始 (大小 ~20-30KB,視系列)。0x1FFF 0004 取向量 → 執行 Bootloader → 等待主機連線下載。0x2000 0000 起始 (大小 10KB~640KB+)。0x2000 0004 取向量 → 執行 SRAM 程式。0x0000 0000 ┌─────────────────────┐
│ 別名區 (Boot 映射) │ ← 根據 BOOT 腳位映射到 Flash/System/SRAM
0x0000 0000 └─────────────────────┘
0x0800 0000 ┌─────────────────────┐
│ 主閃存 (Flash) │ 0x0800 0000 ~ 0x0801 FFFF (128KB)
0x0802 0000 └─────────────────────┘
0x1FFF 0000 ┌─────────────────────┐
│ 系統存儲器 (ROM) │ Bootloader
0x1FFF 7FFF └─────────────────────┘
0x2000 0000 ┌─────────────────────┐
│ SRAM │ 0x2000 0000 ~ 0x2000 4FFF (20KB)
0x2000 5000 └─────────────────────┘
0x4000 0000 ┌─────────────────────┐
│ 外設總線區 │ GPIO, USART, SPI, ADC...
└─────────────────────┘
// 應用程式中跳轉至 System Memory (模擬 BOOT0=1, BOOT1=0)
void jumpToBootloader(void) {
__disable_irq();
// 1. 關閉所有外設、SysTick
// 2. 設定 MSP 為 System Memory 區域的初始堆疊指標
uint32_t bootloader_sp = *(__IO uint32_t*)0x1FFF0000;
__set_MSP(bootloader_sp);
// 3. 取得 Reset Handler 位址並跳轉
void (*bootloader_reset)(void) = (void(*)(void))*(__IO uint32_t*)0x1FFF0004;
bootloader_reset();
}
| 誤區 | 正確說明 |
|---|---|
| System Memory 可寫入 | **不可寫/擦**,出廠固化 Bootloader,唯讀。 |
| SRAM 啟動需外部 RAM | **內嵌 SRAM** 即片上 SRAM,非外部 FSMC/SDRAM。 |
| BOOT 腳位復位後可改變啟動模式 | **僅復位瞬間採樣有效**,運行中改變 BOOT 腳位不影響當前啟動模式。 |
| 所有 STM32 映射相同 | Flash/SRAM/System Memory 起始位址**各系列不同** (F0/F1/F4/F7/H7/L4 等),必須查閱對應參考手冊。 |
STM32 三種啟動模式分別對應 **Flash (產品常態)、System Memory (廠商 Bootloader/ISP)、SRAM (特殊調試/加密運行)**。理解 BOOT0/BOOT1 採樣邏輯、記憶體映射位址、向量表重定向機制,是設計現場升級 (IAP)、安全啟動、生產燒錄流程的基礎。