扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

STM32U599 Azure USBx USB_OTG_HS MSC 开发:两大核心问题解决方案

01/28 11:26
400
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在 STM32U599 基于 Azure USBx 开发 USB_OTG_HS MSC(存储类)应用时,常出现 “USB 初始化失败”“插 USB 无响应” 两大典型问题。本文基于 ST 官方 LAT1298 应用笔记,从问题根源、针对性解决步骤到实操验证,系统拆解解决方案,助力快速实现稳定的 USB 存储功能。

资料获取:【应用笔记】LAT1298 基于Azure USBx开发USB_OTG_HS MSC应用的几个问题

1. 核心问题背景

  • 开发场景:STM32U599 作为 USB_OTG_HS 从机,基于 Azure USBx 开发 MSC 应用,参考 STM32U575 的 Ux_Device_MSC 例程;
  • 关键问题:1. USB_OTG_HS 初始化失败(USB_CoreInit返回 HAL_ERROR);2. 初始化 “成功” 后,插入 USB 无任何系统提示,功能未生效。

2. 问题一:USB_OTG_HS 初始化失败 —— 时钟配置不匹配

2.1 根源分析

STM32U599 的 USB_OTG_HS 外设对时钟有严格要求(参考 DS13633 和 RM0456 手册):
  • 时钟源:必须使用外部晶振(HSE),确保频率精度(±400ppm);
  • 支持频率:OTG_HS PHY 时钟仅支持 16/19.2/20/24/26/32 MHz;
  • 客户问题:默认使用 MSIS 内部时钟,且频率未在支持范围内,导致初始化失败。

2.2 解决步骤:STM32CubeMX 时钟配置

  1. 选择时钟源:在 “RCC Configuration” 中,启用 HSE(外部晶振),示例选用 12MHz HSE;
  2. 配置 PLL:调整 PLL1 参数,使 OTG_HS PHY 时钟落在支持范围(示例:HSE→PLL1_P→输出 24MHz);
  3. 绑定时钟路径:在 “OTG HS Clock Mux” 中,选择 “HSE” 作为 USB_OTG_HS 的时钟源;
  4. 重新生成代码:下载后测试,USB_CoreInit可返回 HAL_OK,初始化成功。

3. 问题二:插 USB 无响应 ——TypeC-PD 依赖与代码框架不完整

3.1 根源分析

初始化成功后仍无响应,核心是两大隐性问题:
  • 代码框架不完整:STM32CubeMX 仅生成 USBx MSC 的基础框架,应用层接口需补充,但客户未完善;
  • TypeC-PD 检测依赖:ST 开发板例程默认启用 TypeC-PD 功能,通过 CC 引脚检测设备插入,而客户板子未使能 TypeC-PD,仅按 USB_OTG_HS Device Only 模式连接,导致 USB 服务无法触发启动。

3.2 解决步骤:代码修改(跳过 TypeC-PD 检测)

核心逻辑:绕开 TypeC-PD 的消息队列触发,直接在 USB 初始化后启动 USB 服务,修改app_ux_device_thread_entry函数(位于app_usbx_device.c):

原代码问题

默认等待ux_app_MsgQueue队列的START_USB_DEVICE消息(由 TypeC-PD 检测触发),客户板子无 TypeC-PD,队列无消息,USB 服务无法启动。

修改后代码

static VOID app_ux_device_thread_entry(ULONG thread_input)
{
  /* USER CODE BEGIN app_ux_device_thread_entry */
  /* 初始化USB设备 */
  USBX_APP_Device_Init();
  
  /* 直接启动USB_OTG_HS服务,无需等待TypeC-PD消息 */
  HAL_PCD_Start(&hpcd_USB_OTG_HS);
  
  /* 保留原有队列逻辑(可选,防止后续扩展冲突) */
  while(1)
  {
    if (tx_queue_receive(&ux_app_MsgQueue, &USB_Device_State_Msg, TX_WAIT_FOREVER) != TX_SUCCESS)
    {
      Error_Handler();
    }
    
    if (USB_Device_State_Msg == START_USB_DEVICE)
    {
      HAL_PCD_Start(&hpcd_USB_OTG_HS);
    }
    else if (USB_Device_State_Msg == STOP_USB_DEVICE)
    {
      HAL_PCD_Stop(&hpcd_USB_OTG_HS);
    }
  }
  /* USER CODE END app_ux_device_thread_entry */
}

3.3 补充说明

  • 例程参考:STM32Cube_FW_U5_V1.2.0 及以上版本提供完整 USBx MSC 例程,可跨开发板参考(如 STM32U575、STM32U599J_DK 的例程);
  • 硬件适配:客户板子需按 USB_OTG_HS Device Only 模式接线,确保 VBUS、D+、D - 引脚连接正确,无 TypeC-PD 相关引脚依赖。

4. 实操验证与效果

  1. 硬件连接:将 STM32U599 的 USB_OTG_HS 接口(D+、D-、VBUS)连接到 PC USB 口;
  2. 编译下载:按上述步骤配置时钟、修改代码后,编译下载到开发板;
  3. 功能验证:PC 端 Windows 系统自动识别 USB 存储设备,弹出可移动磁盘,MSC 功能正常生效。
STM32U599 Azure USBx USB_OTG_HS MSC 开发的核心痛点的是 “时钟配置” 和 “TypeC-PD 适配”,解决关键:
  1. 时钟必须满足:HSE 晶振 + PHY 时钟在 16/19.2/20/24/26/32 MHz 范围内;
  2. 代码需绕开 TypeC-PD 检测,直接启动 USB 服务,适配 Device Only 模式;
  3. 优先参考 STM32U5 系列高版本 SDK 例程,补充应用层接口(CubeMX 仅生成框架)。
该方案适用于智能手表、便携存储设备等需 USB_OTG_HS MSC 功能的场景,无需启用 TypeC-PD,简化硬件设计的同时保证功能稳定。

相关推荐