USB¶
USB具体使用请参见USB使用指南。
FAQ1 关键注意事项¶
USB接入后检查是否有中断产生
打开debug log可能会影响USB连接
MCU降频和睡眠都会导致USB无法识别,需要中断脚处理
52系列灭屏后会降频,USB插入后需要配置不降频
USB只能用60MHz的频率
FAQ2 快速检查清单¶
USB引脚正确配置为模拟输入
系统未进入IDLE/睡眠模式
主频未降频(特别是52系列)
USB时钟为60MHz
正确配置了USB设备/主机模式
睡眠唤醒后能重新启用USB时钟
FAQ3 USB接入后无法识别¶
Debug Log影响
可能原因:Debug Log影响。
RT_DEBUG_USB宏打开后会影响USB连接(打印过多)解决方案:建议关闭该宏进行调试
#if (RT_DEBUG_USB==1)
void HAL_DBG_printf(const char *fmt, ...)
{
va_list args;
static char rt_log_buf[RT_CONSOLEBUF_SIZE];
extern void rt_kputs(const char *str);
va_start(args, fmt);
rt_vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);
rt_kputs(rt_log_buf);
va_end(args);
}
#endif
系统进入IDLE状态
可能原因:进入IDLE后主控端USB设备被挂起,PC端无法识别
解决方案:检测到USB插入后,需禁止IDLE和睡眠;USB拔出后,需恢复
USB插入时:
rt_pm_hw_device_start(); // 禁止进入IDLE
rt_pm_request(PM_SLEEP_MODE_IDLE); // 禁止睡眠
pm_scenario_start(PM_SCENARIO_AUDIO); // 禁止变频(特别是52系列灭屏后)
USB拔出时:
rt_pm_hw_device_stop();
rt_pm_release(PM_SLEEP_MODE_IDLE);
pm_scenario_stop(PM_SCENARIO_AUDIO); // 允许变频
时钟频率问题
可能原因: USB需要稳定的60MHz频率。主频降频会导致USB频率变化,从而无法识别
解决方案:
52系列灭屏后会降频,需通过
「2. 系统进入IDLE状态」的方法保持频率52X的检查下bsp_init.c下的USB 分频系数是否匹配
#ifdef BSP_USING_USBD
// Make sure USB clock is 60M = 120M/2
hwp_hpsys_rcc->USBCR = 4; // 4分频
hwp_hpsys_rcc->CSR &= ~HPSYS_RCC_CSR_SEL_USBC; // Use DLL2 (0 is SYSCLK, 1 is DLL2) 这里用的SYSCLK,SYSCLK 52X是跑的240M
#endif
IO口配置检查
可能原因: IO口配置错误
解决方案: 重新配置IO。不同芯片型号USB IO口不同,具体看芯片手册/规格书
#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH)
HAL_PIN_Set_Analog(PAD_PA35, 1); // 配置为模拟输入
HAL_PIN_Set_Analog(PAD_PA36, 1); // 不需要特殊功能配置
#endif
USB配置检查
可能原因: USB配置错误
解决方案:
确认USB设备/主机模式配置正确
参考文档正确配置相关参数
检查menuconfig配置是否正确
具体参见USB使用指南。
FAQ4 睡眠唤醒后USB无法识别¶
检查USB插入后,是否有硬件中断触发(充电中断,有专用的USB插入中断脚),主动调用enable打开USB时钟,并且注意是否有禁止系统睡眠,变频。
使能USB函数:
static void enabled_usb(void)
{
struct rt_device *usb_device = rt_device_find("usb_reg");
if (usb_device)
rt_device_control(usb_device, RT_DEVICE_OFLAG_OPEN, RT_NULL);
}
禁用USB函数:
static void disabled_usb(void)
{
struct rt_device *usb_device = rt_device_find("usb_reg");
if (usb_device)
rt_device_control(usb_device, RT_DEVICE_OFLAG_CLOSE, RT_NULL);
}
FAQ5 插着USB开机后识别失败¶
可能原因:
是一开机USB的dp引脚被上拉了,导致PC认为有USB设备进来,从而就发起了reset中断,但是这个时候系统正在执行更高优先级的任务,导致没有相应USB的中断。
解决方案:
查看dp引脚是否有外部上拉存在,有就去掉。
检查再开机的时候pinmux是否将dp引脚配置为上拉。
FAQ6 调试建议¶
分步调试:先关闭调试log,验证硬件连接
中断检查:确保USB插入中断能正常触发
功耗管理:特别注意睡眠和降频对USB的影响
时钟验证:确保USB时钟稳定在60MHz
芯片差异:不同系列芯片(52x/55x/56x)可能有特殊配置需求