一、调试前基础配置(必做)
1. 硬件接线(JTAG/SWD通用)
1)调试器(J-Link/ST-Link)USB插电脑,安装官方驱动;
2)接线:GND共地、SWCLK、SWDIO(SW两线);JTAG则接TMS/TCK/TDI/TDO/RST;
3)开发板独立供电,不要共用调试器3.3V,避免短路。
2. Keil工程参数设置
1. 点击工具栏魔术棒(Options for Target)
2. Debug选项卡(核心)
- 硬件调试(J-Link/ST-Link):右侧Use选择对应调试器
- J-Link: J-LINK/J-TRACE Cortex
- ST-Link: ST-Link Debugger
- 点击【Settings】:
- Port选择SW(推荐,引脚少),不要默认JTAG;
- 点击Auto Clk自动匹配通信速度;下方能读出芯片ID即接线正常;
- 勾选 Run to main() ,进入调试自动停在main函数;
3. Flash Download标签:勾选 Program 、 Erase Full Chip ,烧录程序到Flash。
4. Target标签:晶振Xtal(MHz)填写开发板实际晶振(如8.0、12.0)。
3. 编译工程
快捷键 F7 Build,确保0错误0警告,代码无语法问题。
二、进入/退出调试模式
- 启动调试: Ctrl+F5 或 Debug → Start/Stop Debug Session
- 退出调试:再次按 Ctrl+F5
进入后代码出现黄色箭头,代表下一条要执行的代码。
三、核心调试操作(快捷键)
1. 运行/暂停
- F5 Run:全速运行,遇到断点自动停下
- Stop:暂停程序
- RST(Reset CPU):芯片复位,程序回到main从头执行
2. 单步调试(排查逻辑BUG最常用)
- F10 Step Over:单步跳过,不进入子函数(日常首选)
- F11 Step Into:单步进入,进入自定义/库函数内部
- Ctrl+F11 Step Out:直接跳出当前函数,回到调用处
- Ctrl+F10 Run to Cursor:直接运行到鼠标光标所在行
3. 断点控制(定点暂停)
- F9:点击代码行左侧灰色区域,添加/取消普通断点(红点)
- 右键断点 → Breakpoint Properties:条件断点(如i==50时暂停,循环调试必备)
- Ctrl+Shift+F9:清除全部断点
四、查看数据(定位变量、内存、寄存器异常)
顶部菜单 View 调出窗口:
1. Watch窗口(监控变量)
打开Watch1,输入变量名(如 adc_val 、 GPIOA->ODR )实时查看;右键可切换十进制/十六进制显示。
2. Registers寄存器窗口
查看内核寄存器R0~R15、SP、PC,排查底层硬件异常。
3. Memory内存窗口
输入地址(0x20000000)查看整片RAM数据,适合串口缓存、数组排查。
4. Call Stack调用栈
查看函数调用层级,程序卡死、死循环时快速定位卡死函数。
5. Peripherals外设寄存器
可直接查看GPIO、USART、ADC等外设寄存器实时值,硬件调试神器。
五、软件仿真(无开发板,纯电脑模拟)
1. 魔术棒 → Debug选项卡,勾选 Use Simulator ;
2. Dialog DLL填 DARMSTM.DLL ,Parameter填芯片型号 -pSTM32F103C8 ;
3. Ctrl+F5进入仿真,支持逻辑分析仪观测IO电平、串口打印,适合纯逻辑验证,无法操作真实硬件。
六、常见调试报错排查
1. 找不到芯片、连接失败:
- 检查GND共地、SWDIO/SWCLK接线;
- Settings里切换SW模式,降低通信速度;
- 重启调试器、重装驱动。
2. 能识别芯片但下载失败:
- Flash Download勾选擦除整片;关闭芯片读保护。
3. 断点失效、程序跑飞:
- 关闭代码优化(魔术棒C/C++ → Optimization选Level 0);
- 不要在中断函数断点全速运行。
七、实用调试小技巧
1. 鼠标悬停变量,直接弹出当前数值;
2. 数组/指针直接在Watch输入数组名,查看全部元素;
3. 调试串口打印:添加ITM_SendChar代码,在调试窗口输出日志;
4. 逻辑分析仪(Logic Analyzer):观测GPIO电平时序,排查时序问题。