摘要
本文是意法半导体(ST)分步指南:把 NUCLEO-U545RE-Q 配成双角色器件,用 **USBX 中间件独立模式**(不跑 ThreadX 或 FreeRTOS™)。从硬件连线到固件,最终板卡能在 HID 主机与 CDC 设备两种角色间切换。
技术术语
- 双角色器件(DRD):同一端口按当前连接与角色逻辑,既可当主机也可当设备
- 设备模式:STM32 作为 USB 外设,连接到 PC 等主机
- 主机模式:STM32 作为 USB 主机,控制已连接的 USB 设备
引言
STM32CubeMX 并不原生支持双角色。就算能选双角色选项,也不会把 USBX 中间件文件和双角色逻辑生成齐全。本文按步骤在独立模式下把 USB 双角色做起来;文末附工程。
本指南基于 STM32CubeIDE 2.1.0、STM32CubeMX 6.17.0、STM32CubeU5 1.8.0,在带 STM32U545RE 的 NUCLEO-U545RE-Q 上验证,可裁到其他支持 USBX 的板。
注意:
- 参考板:确认板卡同时支持设备与主机模式。某些情况需硬件改动(如 B-IoT-STM32U585、NUCLEO-H563ZI 等)。检查 VBUS 引脚与 Power VBUS。
- USB 控制器:部分产品为 USB OTG,部分为 USB DRD,固件中变量与实例命名不同。本例 STM32U545 为 USB DRD。本文通过按下 USER 按键在模式间简单切换。指南从基本硬件连接到固件实现。
1. 硬件与软件前置条件
- NUCLEO-U545RE-Q
- STM32CubeIDE V2.1.0
- STM32CubeMX V6.17.0
- STM32Cube firmware U5 v1.8.0
- 两根 USB 2.0 Type-C 公头转 Type-A 公头线缆
- 一根 Type-A 母头转 Type-C 公头转接器
2. 开发
对 NUCLEO-U545RE-Q,CubeMX 默认没有可用的双角色选项。所以要建 两个工程:一个主机、一个设备,把两种模式需要的文件和函数都拿齐。
3. 配置设备工程
STM32CubeIDE:[File → New → STM32 project] → Board selector 选 NUCLEO-U545RE-Q。弹出板级选项中取消全部 BSP,点 [OK]。打开 `.ioc` 后 [Pinout → Clear pinouts]。
Connectivity → USB-DRD-FS:Mode = device_Only_FS;NVIC 中激活 USB global interrupt。
Middleware → USBX:使能 Core system;UX device FS 下使能 Device CoreStack FS 与 DeviceControllers FS;在 device class FS 中使能 CDC ACM。
USBX 设置:UX device memory pool size 分配 10 KB;USBX device system stack size 分配 8 KB。
Platform settings:Found solutions 选 USB_DRD-FS。
时钟:确保 USB 得到 48 MHz(最简单用 HSI48)。命名并生成代码。
4. 配置 DRD 工程
做法:先建主机工程,再把设备工程里必要的文件与代码盖进去。
同样新建 NUCLEO-U545RE-Q 工程,取消 BSP,Clear pinouts。
USB-DRD-FS:Mode = Host_Only_FS;激活 USB global interrupt。
USBX:使能 Core system、host CoreStack FS、host controllers FS;Host class FS 下使能 core、keyboard、mouse(在 HID class 下)。
将 PB5 设为 GPIO output;Platform settings 的 Drive_VBUS_FS 窗口 Found Solutions 中选中它。**Drive_VBUS 引脚因产品而异,请查原理图。
USBX 设置:USBX host system stack size 分配 **28*1024**。
使能 PC13 为 GPIO EXTI;System core/GPIO 下使能 EXTI Line 13。使能 USART1 异步模式。RCC 中 CRS SYNC Source 选 USB。时钟保证 USB 干净 48 MHz。命名并 Generate Code。
5. 双角色工程目录配置
把设备侧必要文件/文件夹加入 DRD 工程。
从设备工程 `Drivers/STM32U5xx_HAL_Driver/Src` 复制 `stm32u5xx_hal_pcd.c` 与 `stm32u5xx_hal_pcd_ex.c` 到 DRD 工程同路径;头文件同理从 `Inc` 复制。
下表列出需转移的文件与路径。**路径为演示用,实际取决于工程命名与保存位置。
| 设备工程路径 | 需复制到 DRD 同路径的文件 |
| --- | --- |
| `Device_project\Drivers\STM32U5xx_HAL_Driver\Src` | `stm32u5xx_hal_pcd.c`;`stm32u5xx_hal_pcd_ex.c` |
| `Device_project\Drivers\STM32U5xx_HAL_Driver\Inc` | `stm32u5xx_hal_pcd.h`;`stm32u5xx_hal_pcd_ex.h` |
6. 代码实现
将附件工程中的代码片段加入指定 USER CODE 区域,按下表:
| 文件夹/文件 | 代码位置 |
| --- | --- |
| Main.c | USER CODE BEGIN includes / PV / PFP / BEGIN 2 / 3 / 4 |
| Main.h | USER CODE BEGIN EFP |
| stm32u5xx_hal_msp.c | USER CODE BEGIN 1 |
| stm32u5xx_it.c | USER CODE BEGIN PV;EXTI13_IRQn 1;USB_IRQn 1 |
| USBX/App · App_usbx_device.c/.h | USER CODE BEGIN EFP;USER CODE BEGIN 1 |
| Ux_device_cdc_acm.c/.h | (按附件工程) |
| Ux_host_keyboard.c/.h | (按附件工程) |
| ux_host_mouse.c/.h | 整文件内容 |
| Ux_system-tasks_run.c | `_ux_system_tasks_run` 函数 |
| Ux_host_stack_hnp_polling_thread_entry.c | 删除文件内容 |
在 `Ux_user.h` 中取消注释:
```c
#define UX_DEVICE_BIDIRECTIONAL_ENDPOINT_SUPPORT
#define UX_DEVICE_CLASS_CDC_ACM_TRANSMISSION_DISABLE
```
并注释:
```c
//#define UX_HOST_SIDE_ONLY
// #define UX_DEVICE_SIDE_ONLY
```
7. 结果
构建并烧录。应用初始为主机模式。用 Type-C 公头转 Type-A 母头转接器,将鼠标或键盘接到板卡 USB 连接器(CN3)。打开串口监视器,波特率 **115200 bit/s**,应能看到鼠标/键盘活动。
按下 USER 按键后切到设备模式。断开鼠标,将 CN3 接到 PC,应出现新的 USB 串口设备,并重复打印 “hello world”。
结论
到这里,建双角色工程所需信息已经齐了;其他 class 可按同样步骤配。
本应用 不是完整 USB OTG;支持的是 双角色数据(DRD):按 USB 线缆连接,在主机与设备间切换角色。
来源:https://community.st.com/stm32-mcus-60/how-to-configure-stm32-as-usb-dual-role-using-usbx-in-standalone-mode-168595
参数以意法半导体官方最新资料为准。
92
