▼點擊下方名片,關注公眾號,獲取更多精彩內容▼
這里是《賀老師講嵌入式AI》,我是《嵌入式AI:讓單片機學會思考》課程主理人,專注AI在MCU上的落地實踐。
關注公眾號后,回復【嵌入式AI】,可以免費獲取更多賀老師準備的專業資料。
STM32N6 的 NPU 工程包含外部 Flash 映射、安全域配置、NPU 訪問授權、模型執行計劃和啟動鏡像。只把模型數組加入 main.c,程序無法形成完整啟動鏈路。
下面以 ST 官方 SNS 示例和 STM32N6570-DK 為基線,完成工程復制、CubeIDE 導入、FSBL/Secure/NonSecure 構建、鏡像簽名、外部 Flash 燒錄和 NPU 返回值驗證。STM32N647 與 STM32N657 同屬 STM32N6 平臺,自研 N647 板卡需要進一步適配外部 Flash、PSRAM、BSP 和鏈接地址。
本次驗收目標:LL_ATON_RT_RunEpochBlock(),每輪推理最終返回 LL_ATON_RT_DONE,開發板 LED 持續變化。 |
打開 STM32CubeMX,點擊首頁右側 INSTALL / REMOVE。在 MCU Packages 中確認已經安裝 STM32Cube FW_N6;隨后檢查 Embedded Software Packages 中的 X-CUBE-AI。本文現有工程基于 FW_N6 V1.3.0、X-CUBE-AI 10.2.0 和 STM32CubeIDE 1.19.0。升級工具時應讓 FW_N6、X-CUBE-AI 與示例工程保持同一時期的版本,減少生成代碼和中間件接口差異。

圖 1:本機 STM32CubeMX 真實首頁。右上區域的 INSTALL / REMOVE 用于安裝和核對 FW_N6 軟件包。
燒錄階段還要使用 STM32CubeProgrammer。連接硬件時準備 STM32N6570-DK、板載 ST-LINK USB 線和穩定供電;只連接用戶 USB 口無法完成 SWD 下載與調試。
SNS 示例已經包含 STM32N6 啟動 NPU 所需的三層軟件:FSBL 初始化外部存儲,Secure App 配置 TrustZone 和 NPU 總線權限,NonSecure App 調用 Neural-ART runtime 執行網絡。默認示例路徑如下:
%USERPROFILE%\STM32Cube\Repository\Packs\
STMicroelectronics\X-CUBE-AI\10.2.0\Projects\
STM32N6570-DK\Applications\SNS
把整個 SNS 目錄復制到純英文短路徑,例如 D:\STM32N6\SNS_NPU。STM32 Signing Tool 和部分自動生成的 Makefile 對中文路徑兼容性有限,路徑異常會導致工具報告二進制文件不存在。

圖 2:本機資源管理器中的完整 SNS 目錄。App_NonSecure、App_Secure、FSBL、cubeIDE、Drivers 和 Middlewares 均應保留。
cubeIDE 會丟失 Drivers、Middlewares、BSP 和模型生成文件,工程能夠導入,后續編譯會連續出現頭文件與庫文件缺失。 |
打開 STM32CubeIDE,依次選擇 File → Import → General → Existing Projects into Workspace,Root directory 指向 D:\STM32N6\SNS_NPU\cubeIDE。導入完成后,Project Explorer 應出現頂層工程 AI_SNS 以及 FSBL、Secure、NonSecure 三個子工程。

圖 3:本機 CubeIDE 導入后的真實工程樹。NonSecure 工程中可以看到 AI、atonn 和 Src。
依次右擊 AI_SNS_FSBL、AI_SNS_AppliSecure、AI_SNS_AppliNonSecure,執行 Build Project。NonSecure 工程引用 Secure 工程導出的 NSC 符號,兩個應用又依賴 FSBL 建立的外部 Flash 執行環境,因此構建順序必須固定。
cubeIDE\FSBL\Debug\AI_SNS_FSBL.elf
cubeIDE\AppliSecure\Debug\AI_SNS_AppliSecure.bin
cubeIDE\AppliNonSecure\Debug\AI_SNS_AppliNonSecure.bin

圖 4:本機 NonSecure 工程構建成功輸出。控制臺顯示 Build Finished、0 errors,并生成 ELF、BIN 和 LIST。
打開 AI_SNS_AppliNonSecure/Src/main.c。初始化函數創建網絡運行環境,循環調用函數逐個執行 ST Edge AI Core 生成的 epoch block:
LL_ATON_RT_Init();
LL_ATON_RT_Init_Network(&NN_Instance_Default);
do {
ll_aton_rt_ret =
LL_ATON_RT_RunEpochBlock(&NN_Instance_Default);
} while (ll_aton_rt_ret != LL_ATON_RT_DONE);
network.c 保存 NPU 執行計劃,其中包含卷積加速單元、Streaming Engine、緩沖區地址和 epoch 調度。LL_ATON_RT_RunEpochBlock() 按計劃配置 NPU。最終返回 LL_ATON_RT_DONE 才代表整張網絡執行完成。

圖 5:本機 CubeIDE 中的真實代碼位置,包含 NPU 初始化、輸入輸出緩沖區獲取和 epoch block 執行。
STM32N6 的 FSBL 按鏡像頭讀取加載地址、類型和有效載荷信息。Secure 與 NonSecure 的普通 BIN 需要經過 STM32 Signing Tool 處理。開發階段可以使用空密鑰頭:
STM32_SigningTool_CLI.exe ^
-bin AI_SNS_AppliSecure.bin -nk -of 0x80000000 ^
-t fsbl -hv 2.1 -o secure-trusted.bin
STM32_SigningTool_CLI.exe ^
-bin AI_SNS_AppliNonSecure.bin -nk -of 0x80000000 ^
-t fsbl -hv 2.1 -o nonsecure-trusted.bin
-nk 表示不寫入真實簽名密鑰,只適合開發調試;-t fsbl 生成 FSBL 可識別的鏡像類型;-hv 2.1 選擇該示例使用的 STM32 Header 格式。

圖 6:本機 STM32 Signing Tool 的真實輸出,顯示 header v2.1 信息和生成的兩個 trusted 鏡像。
斷電后把 STM32N6570-DK 的 BOOT1 設置到 1-3,連接板載 ST-LINK 并重新上電。使用 STM32CubeProgrammer 把兩個 trusted 鏡像寫入固定地址:
STM32_Programmer_CLI.exe ^
-c port=SWD mode=UR reset=HWrst ^
-d secure-trusted.bin 0x70100000
STM32_Programmer_CLI.exe ^
-c port=SWD mode=UR reset=HWrst ^
-d nonsecure-trusted.bin 0x70180000
| 地址檢查: |
在 CubeIDE 中右擊 AI_SNS_FSBL,選擇 Debug As → STM32 C/C++ Application。官方調試配置把 FSBL ELF 下載到內部 RAM 的 0x34180000。Resume 后,FSBL 初始化 XSPI2 并建立外部 Flash memory-mapped;隨后跳轉到 0x70100000 的 Secure App,完成權限配置后再跳轉到 0x70180000 的 NonSecure App。
| FSBL 內部 RAM | XSPI2 映射 Flash | Secure 授權 NPU | NonSecure 執行網絡 |
圖 7:FSBL、Secure App 和 NonSecure App 的啟動順序。
在 LL_ATON_RT_RunEpochBlock(&NN_Instance_Default) 處設置斷點。第一次命中表示程序已經進入 NPU runtime。繼續單步或運行,觀察 ll_aton_rt_ret;中間狀態對應尚未完成的 epoch block,最終狀態必須為 LL_ATON_RT_DONE。
隨后取消斷點并繼續運行。SNS 示例每輪推理前調用 blink_led(),LED1、LED2、LED3 會隨循環變化。斷點確認 NPU 調用和返回狀態,LED 確認推理循環可以持續運行。
| NPU 運行驗收 |
遷移到 STM32N647 自研板時,保留三工程結構和 NPU runtime 調用鏈,依次替換外部 Flash/PSRAM 驅動、BSP、鏈接腳本、SAU/RISAF 地址范圍和模型生成代碼。先驗證 FSBL 與安全域鏈路,再替換模型,可以把啟動故障、存儲故障和模型故障分開定位。
配套工程:project/STM32N6570_DK_SNS_NPU_reference

END