STM32G441裸机USB驱动问题:无法接收SOF包及设备地址
STM32G441 裸机USB驱动排查建议(无HAL库)
时钟相关排查
- 确认PLLQ输出精确48MHz:STM32G4的USB外设要求严格48MHz时钟,用25MHz HSE计算PLL参数时,需保证PLLQ分频后为精准48MHz(例如PLLM=5、PLLN=96、PLLQ=5:25/5*96/5=48MHz),频率偏差过大会触发ERR信号导致通信失败。
- 检查USB时钟使能时机:必须在PLL稳定后再启用USB外设时钟(
RCC->APB1ENR1 |= RCC_APB1ENR1_USBEN),避免时钟不稳定引发外设初始化异常。 - 验证AHB/APB分频配置:确认
RCC->CFGR中HPRE(AHB分频)、PPRE1(APB1分频)设置后,APB1时钟不超过G4的最大限制105MHz,同时确保USB时钟路径无分频错误。
USB外设寄存器配置核查
- 确认中断掩码:检查
USB->CNTR寄存器的CTRM位是否置1(允许CTR中断),同时RESETM、SUSPM、WKUPM等必要中断掩码需正确开启,防止中断被屏蔽。 - 端点0状态检查:复位后端点0需配置为双向模式(
USB->EP0CR的EP_TYPE设为01),确保EP_KIND、STAT_TX、STAT_RX位配置与HAL一致,重点验证接收缓冲区地址是否指向USB SRAM的正确区域。 - BTable地址验证:链接器脚本中BTable需放在USB SRAM起始地址(0x40006000),且
USB->BTABLE寄存器写入的是偏移量(如BTable在0x40006000则写入0x0000),避免缓冲区地址错误导致CTR中断无法触发。
USB SRAM访问与对齐检查
- 确保缓冲区满足32位对齐:USB外设对SRAM访问有严格对齐要求,链接器脚本需指定缓冲区地址为4字节对齐,避免地址不对齐引发数据传输异常。
- 检查SRAM写保护:确认
USB->CNTR的FRES位已清除(不冻结SRAM),保证外设可正常读写USB SRAM中的缓冲区。
NVIC与中断优先级配置
- 确认USB中断优先级:STM32G4的USB_LP_IRQn中断优先级需高于其他低优先级中断,且已调用
__enable_irq()开启全局中断。 - 检查中断服务函数(ISR):USB_LP_IRQHandler中需先读取
USB->ISTR的CTR位,处理对应端点状态后再清除中断标志,避免中断被挂起无法触发。
复位与枚举流程细节
- 复位处理时序:USB复位信号(
USB->ISTR的RESET位)触发后,需先清除复位标志,再初始化BTable、端点0,最后清除USB->CNTR的PDWN位开启内部上拉,确保时序符合USB规范。 - 地址设置请求处理:确认SET_ADDRESS请求的回复流程正确,包括端点0发送ACK后,及时将地址写入
USB->DADDR寄存器,否则主机不会发送SOF包。
物理层与信号验证
- 检查内部上拉:确认
USB->BCDR的DPPU位已置1,启用D+线上拉,保证主机能正确识别设备。 - 分析ERR信号时机:通过逻辑分析仪确认ERR信号是在ACK回复后还是地址设置阶段触发,结合USB规范判断是CRC错误、时序错误还是握手错误,缩小排查范围。
内容的提问来源于stack exchange,提问作者CShark
相关产品推荐
相关产品推荐

