▼點(diǎn)擊下方名片,關(guān)注公眾號(hào),獲取更多精彩內(nèi)容▼
這里是《賀老師講嵌入式AI》,我是《嵌入式AI:讓單片機(jī)學(xué)會(huì)思考》課程主理人,專注AI在MCU上的落地實(shí)踐。
關(guān)注公眾號(hào)后,回復(fù)【嵌入式AI】,可以免費(fèi)獲取更多賀老師準(zhǔn)備的專業(yè)資料。
第一次接觸STM32N647的應(yīng)該會(huì)很迷惑:開發(fā)模式、BootROM、FSBL、外部 Flash 啟動(dòng)經(jīng)常被放在同一張流程圖里。上面四個(gè)名詞所屬層級(jí)不同:
開發(fā)模式是一種啟動(dòng)條件
BootROM 是芯片內(nèi)部固化代碼
FSBL 是用戶可以修改的一級(jí)引導(dǎo)程序
外部 Flash 是保存啟動(dòng)鏡像的存儲(chǔ)器。
STM32N647/657 沒有用于保存用戶程序的片內(nèi) Flash。上電以后,Cortex-M55 一定先執(zhí)行 BootROM。開發(fā)階段可以讓調(diào)試器把 FSBL 直接裝入內(nèi)部 SRAM;產(chǎn)品獨(dú)立啟動(dòng)時(shí),BootROM 從外部 Flash 取得 FSBL。FSBL 完成時(shí)鐘、XSPI、存儲(chǔ)映射和安全分區(qū)配置,再把執(zhí)行權(quán)交給 Secure、NonSecure 應(yīng)用。
說明:本文使用官方 STM32N6570-DK 演示。該板搭載 STM32N657,BootROM、FSBL、外部 Flash 和 TrustZone 啟動(dòng)方法同樣適用于 STM32N647/657 系列;自研板需要按實(shí)際外部存儲(chǔ)器和引腳配置調(diào)整 External Loader 與 FSBL。
BootROM 位于片內(nèi) ROM,復(fù)位后首先運(yùn)行,負(fù)責(zé)讀取啟動(dòng)條件、開放調(diào)試端口、識(shí)別啟動(dòng)存儲(chǔ)器、檢查 FSBL 鏡像頭并建立第一段執(zhí)行鏈。項(xiàng)目無法替換 BootROM,也不需要為它創(chuàng)建 CubeIDE 工程。
FSBL 是 First Stage Bootloader。它由項(xiàng)目生成,可以修改。BootROM 只能完成最小初始化,F(xiàn)SBL 接著配置系統(tǒng)時(shí)鐘、XSPI、外部存儲(chǔ)器映射、緩存和安全邊界,再跳到應(yīng)用。自研板更換 Flash 型號(hào)、接口或供電配置后,修改位置通常在 FSBL。
外部 Flash 用來長期保存 FSBL、Secure、NonSecure 和模型權(quán)重。DEV Boot 與 Flash Boot 決定 BootROM 后續(xù)從調(diào)試器等待代碼,還是主動(dòng)從外部存儲(chǔ)器讀取 FSBL。
BOOT0、BOOT1 的電平在系統(tǒng)復(fù)位時(shí)被鎖存。BOOT1 優(yōu)先級(jí)更高:BOOT1 為高電平時(shí)進(jìn)入 Development boot;BOOT1 為低電平后,BOOT0 再?zèng)Q定進(jìn)入 Flash boot 或 Serial boot。開關(guān)撥動(dòng)以后必須按一次 NRST 或重新上電,新位置才會(huì)生效。
BOOT0 任意 | ||
BOOT0=0 | ||
BOOT0=1 |
![]() |
圖 1:STM32N6570-DK 用戶手冊(cè)中的啟動(dòng)模式表
在 STM32N6570-DK 上,SW1 對(duì)應(yīng) BOOT1,SW2 對(duì)應(yīng) BOOT0。開關(guān)向右為高電平,向左為低電平。因此,開發(fā)調(diào)試時(shí)把 SW1 撥到右側(cè);獨(dú)立啟動(dòng)時(shí)把 SW1、SW2 都撥到左側(cè)。不要只記“1-2”或“1-3”,不同資料對(duì)開關(guān)觸點(diǎn)的表述容易造成誤讀,直接核對(duì) BOOT 引腳電平更可靠。
![]() |
圖 2:DEV Boot 進(jìn)入后,BootROM 開放調(diào)試訪問并等待 IDE 裝載代碼
DEV Boot 讓調(diào)試器直接把 ELF 中的 FSBL 段寫入 AXI SRAM2,并把 PC 設(shè)置到入口地址。它適合單步執(zhí)行 FSBL、檢查 XSPI 初始化、配置外部 Flash 和反復(fù)修改應(yīng)用。該模式繞過了 BootROM 從外部 Flash 讀取 FSBL 的過程,因此調(diào)試成功以后還要單獨(dú)驗(yàn)證 Flash Boot。
BootROM 和 FSBL 屬于前后相接的兩級(jí)程序。BootROM 固定執(zhí)行,項(xiàng)目需要選擇 FSBL 的配置方式與應(yīng)用裝載方式。下面使用本系列第 3 篇構(gòu)建的 SNS NPU 參考工程。三個(gè)鏡像分別承擔(dān)一級(jí)啟動(dòng)、可信環(huán)境配置和 NPU 應(yīng)用。外部 Flash 中保存“鏡像頭 + 有效載荷”,鏈接腳本中的代碼起始地址比燒錄地址高 0x400,這 1 KB 留給 STM32 Header。
| 復(fù)位 鎖存 BOOT | BootROM 讀頭 / 校驗(yàn) | FSBL 時(shí)鐘 / XSPI2 | S → NS NPU 應(yīng)用 |
圖 3:Flash Boot 的四段接力,任何一段缺失都會(huì)讓后面的日志消失
BootROM 只負(fù)責(zé)建立第一段可信執(zhí)行環(huán)境。它從 0x70000000 讀取 FSBL,檢查鏡像頭參數(shù),并把 FSBL 裝入內(nèi)部 RAM。當(dāng)前 STM32 Header v2.3 的 FSBL 鏡像上限為 512 KB,簽名工具的 -align 選項(xiàng)會(huì)把有效載荷對(duì)齊到 0x400。
![]() |
圖 4:BootROM 在 AXI SRAM2 中預(yù)留 FSBL 下載區(qū)和鏡像頭信息區(qū)
FSBL 運(yùn)行后配置 XSPI2,并把外部 Flash 映射到 Cortex-M55 地址空間。Secure 應(yīng)用從 0x70100400 執(zhí)行,完成 SAU、RISAF、RIFSC 和 NPU 訪問權(quán)限配置;隨后跳到 0x70180400 的 NonSecure 向量表。NPU 推理通常位于 NonSecure 工程中。FSBL 能運(yùn)行而 NPU 沒有動(dòng)作時(shí),排查重點(diǎn)已經(jīng)從 BootROM 轉(zhuǎn)移到 XSPI 映射、安全分區(qū)和應(yīng)用入口。
把 SW1(BOOT1)撥到右側(cè)高電平,SW2 位置不影響 DEV Boot;連接板載 ST-LINK 的 CN6 USB-C,按一次 NRST。STM32N6570-DK 的紅色 LED2 由 PG10 指示 DEV Boot。CubeProgrammer 使用 SWD、AP1、Hot plug 連接,隨后選擇開發(fā)板對(duì)應(yīng)的外部加載器 MX66UW1G45G_STM32N6570-DK.stldr。
![]() |
圖 5:先在 DEV Boot 下連接 ST-LINK,再加載外部 Flash Loader
CubeIDE 依次構(gòu)建 FSBL、Secure、NonSecure。三個(gè)原始 .bin 不能直接交給 BootROM/FSBL。開發(fā)生命周期下可以使用空密鑰頭完成鏈路驗(yàn)證;進(jìn)入產(chǎn)品安全生命周期前,需要按密鑰管理方案完成簽名、版本和防回滾配置。
STM32_SigningTool_CLI.exe -bin AI_SNS_FSBL.bin
-nk -iv 0 -of 0x80000000
-la 0x34180000 -t fsbl
-o AI_SNS_FSBL-trusted.bin
-hv 2.3 -align
-dump AI_SNS_FSBL-trusted.bin
本機(jī) STM32 Signing Tool 2.21.0 支持 Header v2.3,并明確要求 STM32N6 的 v2.3 鏡像使用 -align。舊版 STM32CubeN6 示例仍可能使用 -hv 2.1 和舊工具名,應(yīng)以當(dāng)前軟件包 README 與簽名工具幫助為準(zhǔn),不要在同一套鏡像中混用兩種頭格式。
![]() |
圖 6:簽名工具的 dump 輸出用于核對(duì) Header version、payload size 和 option flags
繼續(xù)保持 DEV Boot,依次寫入 FSBL、Secure 和 NonSecure trusted 鏡像。GUI 中必須勾選對(duì)應(yīng)的 External Loader;CLI 中每次下載都顯式傳入 -el,可以減少“寫入成功但寫到了錯(cuò)誤存儲(chǔ)器”的誤判。
STM32_Programmer_CLI.exe -c port=SWD mode=hotplug ap=1
-el MX66UW1G45G_STM32N6570-DK.stldr
-w AI_SNS_FSBL-trusted.bin 0x70000000 -v
STM32_Programmer_CLI.exe -c port=SWD mode=hotplug ap=1
-el MX66UW1G45G_STM32N6570-DK.stldr
-w AI_SNS_AppliSecure-trusted.bin 0x70100000 -v
STM32_Programmer_CLI.exe -c port=SWD mode=hotplug ap=1
-el MX66UW1G45G_STM32N6570-DK.stldr
-w AI_SNS_AppliNonSecure-trusted.bin 0x70180000 -v
![]() |
圖 7:FSBL 固定寫到外部 Flash 起始地址 0x70000000,Secure/NonSecure 使用工程約定的后續(xù)分區(qū)
斷開 CubeIDE 調(diào)試會(huì)話,把 SW1(BOOT1)和 SW2(BOOT0)都撥到左側(cè)低電平,按 NRST。更嚴(yán)格的驗(yàn)收應(yīng)關(guān)閉 IDE、拔掉 ST-LINK 后重新供電。應(yīng)用仍能自動(dòng)啟動(dòng),才能證明 BootROM 已經(jīng)從外部 Flash 讀取 FSBL,并完成后續(xù) Secure、NonSecure 接力。
本步驟的驗(yàn)收口徑main() 可以停住斷點(diǎn),隨后能進(jìn)入 Secure 和 NonSecure。Flash Boot:IDE 關(guān)閉后重新上電,LED、串口或業(yè)務(wù)輸出按預(yù)期出現(xiàn);再次斷電重啟,結(jié)果可重復(fù)。 |
開發(fā)模式和外部 Flash 啟動(dòng)承擔(dān)不同任務(wù)。一個(gè)項(xiàng)目通常先使用 DEV Boot 建立可調(diào)試鏈路,隨后補(bǔ)齊簽名、燒錄和 Flash Boot 驗(yàn)收。BootROM 始終參與復(fù)位啟動(dòng);FSBL 始終負(fù)責(zé)把最小硬件狀態(tài)推進(jìn)到應(yīng)用可運(yùn)行狀態(tài)。
| 一個(gè)容易忽略的復(fù)位問題: |
STM32N647 項(xiàng)目的選擇順序可以固定下來:先用 DEV Boot 調(diào)試 FSBL 和應(yīng)用,再把帶鏡像頭的 FSBL、Secure、NonSecure 寫入外部 Flash,最后切換 Flash Boot 驗(yàn)證獨(dú)立運(yùn)行。BootROM 無需配置選項(xiàng),它負(fù)責(zé)執(zhí)行芯片規(guī)定的第一段啟動(dòng)流程;FSBL 承擔(dān)開發(fā)板與自研硬件之間的適配工作。
| 最后保留這張最小檢查單 0x70000000:FSBL trusted 鏡像頭是否可解析。 0x70100000 / 0x70180000:Secure、NonSecure 鏡像是否與鏈接地址匹配。 BOOT1=0、BOOT0=0:關(guān)閉 IDE 后能否連續(xù)兩次斷電自啟動(dòng)。 |
參考資料:ST UM3234:STM32N6 BootROM 用戶手冊(cè)
ST UM3300:STM32N6570-DK 用戶手冊(cè)
ST Community:STM32N6 boot ROM explained
ST Community:STM32N6570-DK AI application from scratch

END