利用vscode对STM32调试的通常流程是,GDB->OpenOCD->stlink驱动->stlink->芯片
CCM是F407系列的一块高速私有内存,只通过D-BUS与CPU直接相连。
GDB(即GNU Debugger),GDB原生为 Unix/Linux 桌面程序设计。在启动调试前,扫描可执行文件(.axf/.elf),并尝试将所有“已初始化数据段(RW Data)”同步到芯片的物理内存中,而这一步在单片机中通常是由于CPU上电自行完成。
如果你在程序里使用了CCM,照着传统的GDB的运行过程,GDB在调试开始时强行向CCM区域搬运数据,但是由于CCM只能由CPU访问,这就会触发HardFault(硬件死锁)。

解决方法是,不用GDB加载程序,只用GDB来调试,让CPU在上电后自己将数据从Flahs搬运。
只需要在.vscode目录下的launch.json文件添加
"loadFiles": [], // 阻止 GDB 自动下载
改用keil assistant或者其它方式进行下载即可成功绕过这个问题。
以下为launch.json的设置的全部参考
{
"version": "0.2.0",
"configurations": [
{
"name": "OpenOCD Debug (No Load)",
"type": "cortex-debug",
"request": "launch",
"cwd": "${workspaceFolder}",
"executable": "${workspaceFolder}/MDK-ARM/SigGen_Meas_System/SigGen_Meas_System.axf", // 指向 Keil 编译出的可执行文件
"servertype": "openocd",
"device": "STM32F407ZGT6", // 芯片型号
"rtos": "", // 裸机填空,系统填上
"liveWatch": {
"enabled": true, // 开启实时监控 (Live Watch)
"samplesPerSecond": 4 // 实时刷新频率(次/秒)
},
"loadFiles": [], // 阻止 GDB 自动下载(用其它工具下载)
"preLaunchCommands": [
"monitor reset halt" // 强制复位芯片,确保单片机从头开始运行 Keil 的启动代码
],
"interface": "swd",
"configFiles": [
"interface/stlink.cfg", // ST-LINK (原版失败可尝试 stlink-v2.cfg)
"target/stm32f4x.cfg" // F4 系列配置文件
],
//"runToEntryPoint": "main",
"svdFile": "D:/Keil/ARM/PACK/Keil/STM32F4xx_DFP/2.17.0/CMSIS/SVD/STM32F407.svd", //引用Keil Pack里的SVD文件
"postLaunchCommands": [
//模糊映射
"set substitute-path C:/GitHub/ARM-software_CMSIS_5.DSPnew/CMSIS/DSP D:/Keil/ARM/PACK/ARM/CMSIS/5.0.1/CMSIS/DSP_Lib"
],
"searchDir": [], // 若 OpenOCD 未加环境变量,填入 scripts 文件夹绝对路径
"showDevDebugOutput": "none" // 调试报错时改 "raw" 以查看详细日志,平常none
}
]
}
插件参考:Keil Assistant+Cortex-Debug+debug-tracker-vscode+MemoryView+Peripheral Viewer+RTOS Views

1万+

被折叠的 条评论
为什么被折叠?



