www.z-linear.com
固件写完不等于能跑对。CubeIDE怎么设置断点?Debug As选哪个?Connect under reset为什么调试低功耗必须?仿真器固件怎么升级?本文详解STM32在线调试全流程。
一、CubeIDE调试准备
1.1 仿真器支持
CubeIDE只支持J-LINK和ST-LINK两种仿真器。仿真器需单独购买,通过USB连计算机,排线连板上20针插座。
1.2 仿真器固件升级
首次使用前检查仿真器固件版本是否符合CubeIDE要求:Help → ST-LINK Upgrade → Open update mode → 显示当前版本与可升级版本 → Upgrade升级。升级一次即可。
该对话框还能检测连接问题:若显示"ST-Link is not in the DFU mode. Please restart it",说明仿真器连接异常——拔掉USB重新插上即可。
二、启动调试
2.1 设置断点
下载程序之前先在源代码中设置断点:输入光标在某一有效代码行时,按快捷键Ctrl+Shift+B即可在当前行设置或取消断点。
2.2 Debug As启动
单击工具栏Debug按钮启动程序下载和调试。项目首次启动调试时出现Debug As对话框——因为程序需要连接硬件调试,选择STM32 Cortex-M C/C++ Application。
2.3 调试配置
随后出现Edit Configuration对话框设置调试参数(Debugger页面):
| 设置项 | 推荐值 | 说明 |
|---|---|---|
| Debug probe | ST-LINK GDB Server | 或J-LINK |
| 接口 | SWD | 与CubeMX设置自动一致 |
| Reset behaviour | Connect under reset | 默认且调试低功耗程序必须 |
| Flash下载 | 勾选自动 | Debug即下载 |
首次启动调试后,项目根目录会创建.launch文件(调试配置启动文件)。下次直接点Debug按钮即可下载+进入调试,无须重新配置;需要修改时通过Debug按钮下拉菜单的Debug Configurations。
三、断点类型与单步执行
3.1 断点家族
| 断点类型 | 用途 | D223场景 |
|---|---|---|
| 行断点 | 常规暂停 | 检查某函数执行 |
| 条件断点 | 满足条件才停 | adc_collectIndex==199 |
| 数据断点(观察点) | 变量被改写时停 | 追踪缓冲区越界 |
| 硬件断点 | Flash区执行(有限个数) | H7有6~8个 |
| 临时断点 | 停一次后自动删除 | 快速Run to line |
3.2 单步与继续
| 快捷键 | 功能 | 适用 |
|---|---|---|
| F5 | Step Into(进入函数) | 追进被调函数 |
| F6 | Step Over(单步跳过) | 逐行不进函数 |
| F7 | Step Return(跳出) | 从深调用栈返回 |
| F8 | Resume(继续) | 跑到下一断点 |
| Ctrl+R | Run to Line | 跑到光标行 |
3.3 调试D223实时中断的注意
D223的TIM13中断频率最高500kHz——断点停在中断里时定时器可能继续计数,恢复后状态已变化。调试采样链路建议:
- 先降采样率(如1kHz)调试
- 用SRAM记录模式离线分析
- 中断服务函数尽量短,逻辑放线程
四、变量查看
4.1 基本查看
| 视图 | 操作 | 内容 |
|---|---|---|
| Variables | 自动显示 | 当前栈帧局部变量 |
| Expressions | 手动添加 | 任意表达式/全局变量 |
| Memory | 输入地址 | 原始内存(看缓冲区) |
| Peripherals | SFR视图 | 外设寄存器实时值 |
| Live Expressions | 免暂停刷新 | 实时波形化变量 |
4.2 典型D223调试表达式
Expressions添加: _uadc.getAdcFilter24[0] // CH1的24位累加 _modbus._inputReg.adc_mV_Data16[0] tim13_irqCount // 采样中断计数 _adcFunctionParam.qspiDmaComplete _framDatas._adcParam // 整个参数结构体展开4.3 内存视图验证双缓冲
Memory添加 &adcBufA / &adcBufB → 采样时观察两个缓冲交替填充 → 验证recordAB_flag翻转逻辑五、RT-Thread线程级调试
5.1 调试视图中的线程
CubeIDE暂停时Threads视图列出所有RT-Thread线程——可切换线程上下文查看各线程栈。
5.2 与finsh配合
| 方式 | 特点 |
|---|---|
| 断点暂停 | 精确但停机影响时序 |
| finsh list_thread | 运行中查看栈水位 |
| finsh ps | 线程状态一览 |
组合策略:时序敏感问题用finsh在线查,逻辑错误用断点停机查。
六、调试低功耗程序的关键
6.1 为什么必须Connect under reset?
进入低功耗(Sleep/Stop)后,SWD引脚的时钟可能被关闭——仿真器无法附着到睡眠中的芯片。Connect under reset在复位瞬间抢在固件之前建立连接:
普通连接: 芯片已进入低功耗 → SWD无时钟 → 连接失败 ✗ Under reset: 复位脉冲期间连接 → 固件尚未睡 → 成功 ✓6.2 兜底方案
若固件已"睡死"连不上:BOOT0拉高进Bootloader(系统存储器不睡)→ 重刷固件救活。
七、SWV与CubeMonitor
7.1 SWO串口监视
SWD模式下SWO引脚(PB3)可输出ITM打印——比USB CDC更早可用(boot阶段即可打印)。ITM Data Console实时显示log。
7.2 STM32CubeMonitor
断点调试无法实现连续运行时的变量监测——CubeMonitor通过ST-LINK连续读取变量实现简单的"类示波器"功能。限制:单个变量监测频率不超过1000Hz,但对慢变量(温度/状态机)非常实用。
| 方案 | 侵入性 | 频率上限 |
|---|---|---|
| 断点 | 停机 | — |
| printf | 占CPU | 数kHz |
| SWV/ITM | 低 | 数百kHz |
| CubeMonitor | 零代码改动 | 1kHz |
| D223自带ADC上传 | 零 | 500kHz |
八、常见调试故障速查
| 症状 | 原因 | 解决 |
|---|---|---|
| 找不到.launch配置 | 首次未Debug As | 重新Debug As选Cortex-M |
| 连接立即失败 | 低功耗关闭SWD | Connect under reset |
| 断点打滑/失效 | 优化导致代码重排 | 加volatile; -O0调试 |
| 变量值"optimized out" | 优化删除变量 | 调试用-O0或volatile |
| 单步跳过断点 | Flash缓存/看门狗复位 | 检查IWDG在调试时的喂狗 |
| SWO无输出 | PB3被复用 | 检查引脚分配 |
九、总结
STM32CubeIDE调试体系实现了:
| 环节 | 要点 |
|---|---|
| 仿真器 | 仅ST-LINK/J-LINK;固件先升级 |
| 断点 | Ctrl+Shift+B;条件/数据/硬件断点 |
| 启动 | Debug As→STM32 Cortex-M C/C++ App |
| 复位方式 | Connect under reset(低功耗必须) |
| 变量 | Variables/Expressions/Memory/Live |
| 线程 | Threads视图+finsh配合 |
| 侵入最小 | CubeMonitor 1kHz免停机监测 |
| 救砖 | BOOT0=1进Bootloader |
从Ctrl+Shift+B打断点,到Debug As选择Cortex-M应用,到Connect under reset搞定低功耗连接,再到CubeMonitor的免停机监测——在线调试是固件开发中占比最大的一环。D223开源全部源码的意义正在于此:每个断点、每个变量都对你完全透明。
下篇预告:《D223开发环境从零搭建完整指南》