ST意法半导体
直播中

刘波

8年用户 1039经验值
私信 关注
[问答]

STM32F723ZET6配置内部USB PHY的高速模式,初始化的时候usb init无法通过怎么解决?

Keil单步调试显示在USBPHYC状态校验中计数超时导致进入异常。要如何解决这个问题呢?
https://bbs.elecfans.com/file:///C:/Users/lixuan.fu/Documents/WXWork/1688855983425275/Cache/Image/2025-04/2de15750-67eb-4159-a705-fcf2fda22ab8.jpg

回帖(2)

李渝辉

2025-6-11 16:01:36
估计是硬件方面的原因。


先检查下硬件连接,可以参考F723官方开发板的原理图;


再就是通过cubeMx检查下配置,要给USB模块提供48MHz的时钟,时钟源建议是晶振来的;


保证PHY的供电正确可靠; 
举报

胖子的逆袭

2025-6-18 17:50:43

要解决STM32F723ZET6配置内部USB PHY高速模式时USBPHYC状态校验超时的问题,请按照以下步骤排查和修复:




1. 检查时钟配置



  • 核心问题:USB需要精确的48MHz时钟。

  • 验证步骤

    • 确认PLL配置正确生成48MHz时钟(通过PLLQ分频)。

    • 检查RCC时钟配置:
      // 确保USB时钟源选择PLL
      RCC_PeriphCLKInitTypeDef periph_clk = {0};
      periph_clk.PeriphClockSelection = RCC_PERIPHCLK_USB;
      periph_clk.UsbClockSelection = RCC_USBCLKSOURCE_PLL; // 使用PLL的48MHz输出
      HAL_RCCEx_PeriphCLKConfig(&periph_clk);

    • 检查HSE/HSI频率是否匹配PLL输入(如HSE=25MHz时,PLLN需合理配置)。





2. 确认USBPHYC初始化顺序


STM32F7的USB HS需要严格初始化顺序:


// 步骤1:使能USBPHYC时钟
__HAL_RCC_USBPHYC_CLK_ENABLE();

// 步骤2:释放USBPHYC复位
__HAL_RCC_USB_OTG_HS_FORCE_RESET();   // 先强制复位
__HAL_RCC_USB_OTG_HS_RELEASE_RESET(); // 再释放

// 步骤3:配置内部PHY
USB_OTG_GlobalTypeDef *USBx = USB_OTG_HS;
USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN;  // 内部PHY上电



3. 检查电源配置



  • USB专用电源:确保VDDUSB引脚连接3.3V(关键!)。

  • 电源稳压器
    PWR->CR3 |= PWR_CR3_USB33DEN;       // 使能USB 3.3V稳压器
    while (!(PWR->CR3 & PWR_CR3_USB33RDY)); // 等待稳压器就绪




4. 调试寄存器状态


在调试器中检查关键寄存器:



  • USBPHYC状态
    if (!(USBPHYC->USBPHYC_STATUS & USBPHYC_STATUS_READY)) {
    // 超时原因:时钟未就绪/PLL未锁定/电源异常
    }

  • RCC寄存器:确认RCC->APB1ENRUSBPHYCEN位已置位。




5. 代码修正示例


完整初始化片段:


void USB_HS_Init(void) {
  // 1. 使能时钟和电源
  __HAL_RCC_USBPHYC_CLK_ENABLE();
  HAL_PWREx_EnableUSBVoltageDetector();

  // 2. 复位USB PHY
  __HAL_RCC_USB_OTG_HS_FORCE_RESET();
  __HAL_RCC_USB_OTG_HS_RELEASE_RESET();

  // 3. 配置内部PHY
  USB_OTG_HS->GCCFG |= USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS;

  // 4. 设置高速模式
  USB_OTG_HS->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD;

  // 5. 延时等待稳定
  HAL_Delay(10);
}



6. 其他可能原因



  • 硬件问题:检查PCB上USB_DP/DM是否短路,VBUS是否稳定。

  • 软件冲突:确保无其他代码意外修改时钟或复位寄存器。

  • 固件库版本:更新至最新STM32CubeF7库,修复已知BUG。




解决路径总结



  1. 优先检查VDDUSB电压(用万用表测量引脚电压)。

  2. 在调试器中检查RCC/USBPHYC寄存器,确认时钟和电源标志位。

  3. 严格遵循初始化顺序:时钟→电源→复位释放→PHY配置。

  4. 若仍失败,尝试降低时钟配置复杂度(先用HSI测试)。


通过以上步骤,超时问题通常可定位并解决。重点集中在电源、时钟和USBPHYC复位顺序上。



注意:STM32CubeMX生成的USB代码可能需手动调整PHY初始化顺序,切勿完全依赖默认配置。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分