3.7 KiB
3.7 KiB
Printf 输出配置指南(Ozone 调试)
📌 当前状态
你的项目 printf 通过 __io_putchar() 输出,但该函数是弱定义(未实现),导致:
- ❌ Ozone 调试时看不到任何 printf 输出
- ❌ 验证测试的结果无法查看
✅ 解决方案(3种方式)
🔹 方案1: SWO/ITM 输出(推荐)
优点:
- ✅ Ozone 原生支持,无需额外硬件
- ✅ 不占用任何外设(UART等)
- ✅ 实时性好,不影响程序执行
配置步骤:
1. 编译设置
已创建 Core/Src/retarget.c 文件,确保:
#define USE_ITM_SWO 1 // 启用 ITM
#define USE_UART 0
#define USE_SEMIHOSTING 0
2. Ozone 配置
在 Ozone 中:
- Tools → Terminal
- 勾选 "Enable SWO"
- 设置 SWO Speed(通常自动检测)
- 选择 ITM Port 0 用于 printf
3. 硬件连接
确保调试器的 SWO 引脚已连接:
- ST-Link V2: SWO 自动支持
- J-Link: 需要连接 SWO 线(PB3)
4. 验证
运行程序后,在 Ozone 的 Terminal 窗口应该能看到:
========================================
正逆运动学验证测试
========================================
...
🔹 方案2: UART 串口输出
优点:
- ✅ 可以同时用串口助手查看
- ✅ 脱离调试器也能输出
缺点:
- ❌ 占用一个 UART 外设
- ❌ 需要额外的 USB-TTL 模块
配置步骤:
1. CubeMX 配置 UART
在 arm.ioc 中:
- 启用 USART1(或其他)
- 波特率:115200
- 生成代码
2. 修改 retarget.c
#define USE_ITM_SWO 0
#define USE_UART 1 // 启用 UART
#define USE_SEMIHOSTING 0
并确保包含正确的头文件:
#include "usart.h" // 根据你的 UART 外设调整
3. 查看输出
- 使用串口助手(如 PuTTY、Tera Term)
- 波特率:115200
- 连接对应的 COM 口
🔹 方案3: 半主机模式(不推荐)
缺点:
- ❌ 严重降低程序运行速度
- ❌ 每个 printf 都会暂停 CPU
仅适用于简单调试,不推荐在实时控制系统中使用。
🎯 推荐配置(默认已配置)
使用 ITM/SWO 方式,因为:
- 不占用外设资源
- Ozone 原生支持,配置简单
- 实时性好,适合机器人控制
🔧 Ozone 具体操作步骤
1. 打开 SWO 配置
Tools → Terminal
2. 配置 SWO
☑ Enable SWO
SWO Speed: [Auto] (或手动设置为系统时钟/2)
Prescaler: 1
3. 选择 ITM 通道
☑ ITM Port 0 (用于 printf)
4. 运行程序
点击 Go 或 F5 运行程序
5. 查看输出
在 Ozone 底部的 Terminal 窗口查看 printf 输出
🐛 故障排查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| Terminal 窗口无输出 | SWO 未启用 | 检查 Tools→Terminal 配置 |
| 乱码 | SWO 速度设置错误 | 调整 SWO Speed |
| 仍然无输出 | retarget.c 未编译 | 检查 CMakeLists.txt 是否包含 |
| 硬件错误 | SWO 引脚未连接 | 检查调试器连接 |
📝 CMakeLists.txt 配置
确保 retarget.c 被编译:
# 在 CMakeLists.txt 中添加
set(SOURCES
# ... 其他文件 ...
Core/Src/retarget.c # 添加这一行
)
💡 验证是否工作
重新编译并运行后,应该在 Ozone Terminal 看到:
========================================
正逆运动学验证测试
========================================
测试1: 零位验证
原始关节角度: [0.000, 0.000, 0.000, 0.000, 0.000, 0.000] rad
正运动学位姿: x=0.00, y=0.00, z=530.00 mm
...
如果看不到输出,按照上述步骤逐一检查配置。