完整總結:STM32H7 項目編譯與燒錄流程(macOS + OpenOCD/GDB)
1?? 編譯工程
在項目目錄下執行 make
,生成 ELF 文件(如 Blink.elf
):
cd /Users/code/Stm32code/Blink/build
make clean # 可選:清理舊文件
make # 編譯生成 Blink.elf
2?? 啟動 OpenOCD 調試服務
終端1:啟動 OpenOCD 連接 STM32H7(ST-Link V2):
openocd -f interface/stlink.cfg -f target/stm32h7x.cfg
關鍵輸出:
Info : STLINK V2J17S4 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.226333
Info : Device: STM32H74x/75x
Info : flash size probed value 2048k
Info : Bank (0) size is 1024 kb, base address is 0x08000000
注意:
- 如果出現
Error: erase time-out or operation error sector 0
,可能是 Flash 保護或時序問題(后續需處理)。
3?? 使用 GDB 燒錄程序
終端2:啟動 GDB 并連接 OpenOCD:
arm-none-eabi-gdb -q /Users/code/Stm32code/Blink/build/Blink.elf
(gdb) target remote localhost:3333 # 連接OpenOCD
(gdb) monitor reset halt # 復位并暫停CPU
(gdb) load
若燒錄失敗:
(gdb) load
Error erasing flash with vFlashErase packet
解決方法:
- 手動擦除 Flash:
(gdb) monitor flash erase_sector 0 0 7 # 擦除所有扇區
- 降低 ST-Link 時鐘速度:
(gdb) monitor adapter speed 1000 # 1MHz
- 重新燒錄:
成功輸出:(gdb) load # 成功輸出如下
Loading section .isr_vector, size 0x298 lma 0x8000000 Loading section .text, size 0x1468 lma 0x8000298... Start address 0x08001638, load size 5928 Transfer rate: 5 KB/sec, 988 bytes/write.
4?? 運行與調試
(gdb) monitor reset halt # 確保復位
(gdb) continue # 啟動程序
驗證:
- 檢查硬件行為(如 LED 閃爍)。
- 如需調試,可設置斷點:
(gdb) break main (gdb) continue
5?? 關鍵問題與解決
-
Flash 擦除失敗:
- 原因:STM32H7 的 Flash 接口時序敏感或保護位未解除。
- 解決:
- 手動擦除扇區:
monitor flash erase_sector 0 0 7
- 降低 ST-Link 速度:
monitor adapter speed 1000
- 手動擦除扇區:
-
HardFault 異常:
- 如果復位后卡在
HardFault
,檢查:- 向量表地址是否正確(應為
0x08000000
)。 - 時鐘配置是否匹配硬件(H7 需設置正確的 Flash 等待周期)。
- 向量表地址是否正確(應為
- 如果復位后卡在
-
OpenOCD 警告:
Warn : Prefer GDB command "target extended-remote :3333"
- 可忽略,或改用
target extended-remote :3333
(功能相同)。
- 可忽略,或改用
完整流程圖
最終建議
- 自動化腳本:將常用命令寫入腳本(如
flash.sh
):#!/bin/bash arm-none-eabi-gdb -ex "target remote :3333" -ex "monitor reset halt" -ex "load" -ex "monitor reset run" Blink.elf
- 備用燒錄方式:直接使用 OpenOCD 命令(避免 GDB 交互):
openocd -f interface/stlink.cfg -f target/stm32h7x.cfg -c "program Blink.elf verify reset exit"
通過此流程,可高效完成 STM32H7 的編譯、燒錄和調試。遇到問題時,優先檢查 硬件連接 和 Flash 擦除狀態。
附帶幾張圖片