上一期我们完成了“电子吧唧”的硬件设计,由于板子尺寸限制,没有引出串口。这一期我们就来解决调试问题——用USB ACM实现“一线通”,顺便为后续的USB Bootloader铺路。
一、为什么选择USB ACM?
上一期PCB完成后,最头疼的问题除了0402手工焊接,就是没有串口。板子太小,连个排针都塞不下,更别说UART调试口了。但STM32WBA62CIU6自带USB 2.0-HS,而我们的Type-C接口本来就用于供电和充电,何不顺便把它变成调试口?
USB ACM(Abstract Control Model)是USB CDC类的一个子类,能让设备在电脑上模拟成一个串口(COM口)。好处显而易见:
一根Type-C线搞定供电、调试、后续烧录;
电脑自动识别为虚拟串口,无需额外USB转串口芯片;
不占用任何GPIO,对紧凑设计极其友好。
二、硬件回顾:USB接口连接
在上一期的原理图中,STM32WBA62CIU6的USB_DP(PD6)和USB_DM(PD7)直接连到Type-C座子的D+/D-,VBUS则接入NPM1300进行电源路径管理。这里注意:
USB差分线尽量等长,阻抗控制90Ω;
三、软件实现:STM32CubeMX配置
引脚配置:

3.1 时钟配置
配置USB HS 所需的 60 MHz 时钟。

3.2 USB Device配置
启动USB-HS Connectivity → USB_OTG_HS ;


添加软件包Middleware and Software Packs → USBX → Core System 选择 Device Class HS CDC ACM;


3.3 关键代码:重定向printf
#include "ux_api.h"
#include "ux_device_class_cdc_acm.h"
UX_SLAVE_CLASS_CDC_ACM *g_cdc_acm = UX_NULL;
int fputc(int ch, FILE *f)
{
if (g_cdc_acm == UX_NULL) return ch;
static UCHAR buf[64];
static int idx = 0;
buf[idx++] = (UCHAR)ch;
if (idx >= sizeof(buf) || ch == '\n') {
ux_device_class_cdc_acm_write_with_callback(g_cdc_acm, buf, idx);
idx = 0;
}
return ch;
}3.4 主函数初始化顺序
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* Configure the peripherals common clocks */
PeriphCommonClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_I2C2_Init();
MX_SPI1_Init();
MX_SPI2_Init();
MX_SPI3_Init();
MX_USBX_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_Delay(500); // 等 USB 枚举完成
printf("HELLO World!rn");
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}四、测试与验证
用Type-C线连接开发板到电脑;
打开串口工具(PuTTY、MobaXterm等),选择对应COM口,波特率随意(USB CDC不关心波特率);


五,踩坑记录:
一般DEBUG配置是在SYS下,但是这个芯片却在Trace and Debug中,当时找了挺久的。
如何使用MDK的话,需要版本大于5.38,我这里使用的是5.38a,不然会出现以下问题。


六、总结
本期我们利用STM32WBA62CIU6的USB外设,成功实现了USB ACM虚拟串口,解决了无串口调试的痛点。代码简单、占用资源少,而且为后续的USB Bootloader打下了基础。下一期我们将继续完善“电子吧唧”的软件功能,包括AMOLED显示、NFC读卡和低功耗管理。
我要赚赏金
