177 lines
3.7 KiB
Markdown
177 lines
3.7 KiB
Markdown
# Printf 输出配置指南(Ozone 调试)
|
||
|
||
## 📌 当前状态
|
||
|
||
你的项目 `printf` 通过 `__io_putchar()` 输出,但该函数是弱定义(未实现),导致:
|
||
- ❌ **Ozone 调试时看不到任何 printf 输出**
|
||
- ❌ 验证测试的结果无法查看
|
||
|
||
---
|
||
|
||
## ✅ 解决方案(3种方式)
|
||
|
||
### 🔹 **方案1: SWO/ITM 输出(推荐)**
|
||
|
||
**优点:**
|
||
- ✅ Ozone 原生支持,无需额外硬件
|
||
- ✅ 不占用任何外设(UART等)
|
||
- ✅ 实时性好,不影响程序执行
|
||
|
||
**配置步骤:**
|
||
|
||
#### 1. 编译设置
|
||
已创建 `Core/Src/retarget.c` 文件,确保:
|
||
```c
|
||
#define USE_ITM_SWO 1 // 启用 ITM
|
||
#define USE_UART 0
|
||
#define USE_SEMIHOSTING 0
|
||
```
|
||
|
||
#### 2. Ozone 配置
|
||
在 Ozone 中:
|
||
1. **Tools** → **Terminal**
|
||
2. 勾选 **"Enable SWO"**
|
||
3. 设置 **SWO Speed**(通常自动检测)
|
||
4. 选择 **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
|
||
```c
|
||
#define USE_ITM_SWO 0
|
||
#define USE_UART 1 // 启用 UART
|
||
#define USE_SEMIHOSTING 0
|
||
```
|
||
|
||
并确保包含正确的头文件:
|
||
```c
|
||
#include "usart.h" // 根据你的 UART 外设调整
|
||
```
|
||
|
||
#### 3. 查看输出
|
||
- 使用串口助手(如 PuTTY、Tera Term)
|
||
- 波特率:115200
|
||
- 连接对应的 COM 口
|
||
|
||
---
|
||
|
||
### 🔹 **方案3: 半主机模式(不推荐)**
|
||
|
||
**缺点:**
|
||
- ❌ 严重降低程序运行速度
|
||
- ❌ 每个 printf 都会暂停 CPU
|
||
|
||
仅适用于简单调试,**不推荐**在实时控制系统中使用。
|
||
|
||
---
|
||
|
||
## 🎯 推荐配置(默认已配置)
|
||
|
||
**使用 ITM/SWO 方式**,因为:
|
||
1. 不占用外设资源
|
||
2. Ozone 原生支持,配置简单
|
||
3. 实时性好,适合机器人控制
|
||
|
||
---
|
||
|
||
## 🔧 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` 被编译:
|
||
|
||
```cmake
|
||
# 在 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
|
||
...
|
||
```
|
||
|
||
如果看不到输出,按照上述步骤逐一检查配置。
|