arm/PRINTF_OUTPUT_GUIDE.md

177 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
...
```
如果看不到输出,按照上述步骤逐一检查配置。