
举报
要解决STM32F723ZET6配置内部USB PHY高速模式时USBPHYC状态校验超时的问题,请按照以下步骤排查和修复:
// 确保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);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上电VDDUSB引脚连接3.3V(关键!)。PWR->CR3 |= PWR_CR3_USB33DEN; // 使能USB 3.3V稳压器
while (!(PWR->CR3 & PWR_CR3_USB33RDY)); // 等待稳压器就绪在调试器中检查关键寄存器:
if (!(USBPHYC->USBPHYC_STATUS & USBPHYC_STATUS_READY)) {
// 超时原因:时钟未就绪/PLL未锁定/电源异常
}RCC->APB1ENR中USBPHYCEN位已置位。完整初始化片段:
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);
}通过以上步骤,超时问题通常可定位并解决。重点集中在电源、时钟和USBPHYC复位顺序上。
注意:STM32CubeMX生成的USB代码可能需手动调整PHY初始化顺序,切勿完全依赖默认配置。
举报
更多回帖