完整总结:STM32H7 项目编译与烧录流程(macOS + OpenOCD/GDB)
1️⃣ 编译工程
在项目目录下执行 make
,生成 ELF 文件 (如 Blink.elf
):
bash
cd /Users/code/Stm32code/Blink/build
make clean # 可选:清理旧文件
make # 编译生成 Blink.elf
2️⃣ 启动 OpenOCD 调试服务
终端1:启动 OpenOCD 连接 STM32H7(ST-Link V2):
bash
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:
bash
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
Error erasing flash with vFlashErase packet
解决方法:
-
手动擦除 Flash :
bash(gdb) monitor flash erase_sector 0 0 7 # 擦除所有扇区
-
降低 ST-Link 时钟速度 :
bash(gdb) monitor adapter speed 1000 # 1MHz
-
重新烧录 :
bash(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️⃣ 运行与调试
bash
(gdb) monitor reset halt # 确保复位
(gdb) continue # 启动程序
验证:
-
检查硬件行为(如 LED 闪烁)。
-
如需调试,可设置断点:
bash(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
(功能相同)。
- 可忽略,或改用
完整流程图
是 否 make编译 终端1:启动OpenOCD 终端2:GDB连接OpenOCD 首次load失败? 手动擦除Flash+降速 重新load 烧录成功 复位并运行
最终建议
-
自动化脚本 :将常用命令写入脚本(如
flash.sh
):bash#!/bin/bash arm-none-eabi-gdb -ex "target remote :3333" -ex "monitor reset halt" -ex "load" -ex "monitor reset run" Blink.elf
-
备用烧录方式 :直接使用 OpenOCD 命令(避免 GDB 交互):
bashopenocd -f interface/stlink.cfg -f target/stm32h7x.cfg -c "program Blink.elf verify reset exit"
通过此流程,可高效完成 STM32H7 的编译、烧录和调试。遇到问题时,优先检查 硬件连接 和 Flash 擦除状态 。
附带几张图片
