好的,我已经完整查看了论坛帖子内容,并结合 STC32G12K128 的手册资料,下面为您做一个全面的解答。
关于 STC32G12K128 使用 USB 口输出日志的解答
答案是:完全可以,而且有多种方案可选。
STC32G12K128 内置全速 USB 2.0-FS 控制器,支持 6 个双向端点,官方提供了完善的 USB 库函数,支持 CDC、HID、MSC 等多种协议,完全不占用串口资源。
方案一:USB-CDC 虚拟串口(最推荐,最简单)
这是最常用、最便捷的方案。单片机在 PC 端呈现为一个虚拟串口(COM 口),使用 printf_usb() 或 USB_SendData() 即可将日志数据发送到 PC。
优点:
- 实时性好,日志数据可以实时、连续地输出
- 开发门槛低,上位机编程与普通串口完全一致
- 双向通信,上位机可以随时下发命令
- 实测有效速率可达 ~800KB/s
操作步骤:
- 下载 USB 库函数:从 STC 官网下载
STC_USB_LIBRARY.zip,解压后找到 stc_usb_cdc_32g.LIB 库文件。
- 新建 Keil 项目(使用 C251 编译器),将库文件添加到项目中。
- 编写代码,参考以下示例(查询方式):
#include "stc32g.h"
#include "ai_usb.h"
void main()
{
EAXFR = 1; // 允许访问扩展的特殊寄存器
WTST = 0; // 设置程序代码等待时间为最快
CKCON = 0; // 设置访问片内 xdata 速度为最快
// 设置所有 I/O 口为准双向口
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
usb_init(); // USB 初始化
EA = 1; // 开启总中断
while (1)
{
// 使用 printf_usb 输出日志,完全不需要串口
printf_usb("系统运行中... 计数器: %d\r\n", counter++);
// 延时
for (unsigned long i = 0; i < 500000; i++);
// 查询方式处理 USB 接收(可选)
if (bUsbOutReady)
{
// 处理上位机发来的数据
usb_OUT_done();
}
}
}
- 在代码开头定义
PRINTF_USB(在 ai_usb.h 包含之前或在项目设置中定义),这样 printf 就会重定向到 USB-CDC 输出。
- 下载程序:使用 AiCube-ISP 软件下载,下载完成后 PC 端会识别出一个 USB-CDC 虚拟串口(COM 口),用任意串口助手即可查看日志。
方案二:USB-HID(免驱,适合小数据量)
如果需要在 Win7 等低版本系统上免驱运行,可以使用 HID 方案。
特点:
- 全版本 Windows 免驱
- 数据带宽较低(理论 64KB/s,每包最大 64 字节)
- 使用方式与 CDC 类似,库函数接口相同
方案三:USB MSC(模拟 U 盘,适合离线日志)
单片机模拟一个 U 盘设备,日志数据以文本文件形式存储在内部 EEPROM 或外部 SPI Flash 中。
优点:
- 无需开发上位机软件,直接插电脑拷贝 .txt 文件
- 可离线记录,事后批量导出
- 跨平台兼容
缺点:
- 存储容量有限(内部 EEPROM 最大 64KB)
- 不能实时查看日志
关于不停电下载
USB 库函数中已内置了不停电下载功能,默认下载命令为 "@STCISP#"。当 PC 端发送该字符串时,单片机自动软复位到系统 ISP 程序区,实现 USB 不停电下载。在 AiCube-ISP 软件的"收到用户命令后复位到 ISP 监控程序区"中设置即可。
总结
| 方案 |
实时性 |
开发难度 |
驱动要求 |
适用场景 |
| USB-CDC |
✅ 高 |
⭐ 低 |
Win10 1903+ 免驱 |
最推荐,通用日志调试 |
| USB-HID |
⭐ 中 |
⭐ 低 |
全版本免驱 |
低版本 Windows 系统 |
| USB MSC |
❌ 离线 |
⭐⭐ 中 |
全版本免驱 |
离线记录、现场部署 |
对于绝大多数用户,强烈推荐方案一(USB-CDC 虚拟串口),只需添加库文件、调用 usb_init() 和 printf_usb() 即可,完全不占用串口资源,且实测速率可达 ~800KB/s,完全满足日志输出需求。
详细例程请参考 STC 官网上的"STC32G实验箱演示程序"包中的 "70-CDC(Communication Device Class)协议范例"。
🔍 搜索 "https://www.stcaimcu.com/thread-24982-1-1.html"
⏱️ 查找用时 8.8s | 总回答用时 21.8s