这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【EEPW-Let'sdesign】基于STM32WBA62CIU6的USBAC

共1条 1/1 1 跳转至页

【EEPW-Let'sdesign】基于STM32WBA62CIU6的USBACM一线通

菜鸟
2026-10-17 00:10:14     打赏

【EEPW-Let's design】基于STM32WBA62CIU6的USB ACM一线通

上一期我们完成了“电子吧唧”的硬件设计,由于板子尺寸限制,没有引出串口。这一期我们就来解决调试问题——用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配置

引脚配置:

图片.png

3.1 时钟配置

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

图片.png

3.2 USB Device配置

启动USB-HS Connectivity → USB_OTG_HS ;

image-20261016201854323图片.png

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

image-20261016201700805图片.png

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 */
}


四、测试与验证

  1. 用Type-C线连接开发板到电脑;

  2. 打开串口工具(PuTTY、MobaXterm等),选择对应COM口,波特率随意(USB CDC不关心波特率);

image-20261016232943872图片.png

五,踩坑记录:

  • 一般DEBUG配置是在SYS下,但是这个芯片却在Trace and Debug中,当时找了挺久的。

  • 如何使用MDK的话,需要版本大于5.38,我这里使用的是5.38a,不然会出现以下问题。

    图片.pngimage-20261016233927448

六、总结

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








共1条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]