NXP MCU 技术论坛
直播中

李雪

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

使用keil编译下载usb_cdc_vcom freertos例程sdk2.15版本无法正常检测到串口,怎么解决?

使用keil编译下载usb_cdc_vcom freertos例程sdk2.15版本无法正常检测到串口但是sdk2.4.1的例程可以...怎么检查问题

回帖(1)

吕珠峰

2025-3-31 18:17:54

针对使用Keil编译SDK 2.15的USB_CDC_VCOM例程无法检测到串口的问题,以下是逐步排查和解决方案:




1. 对比SDK版本差异



  • 检查更新日志:查看SDK 2.15相对于2.4.1的更新内容,重点关注USB协议栈、时钟配置、引脚定义或FreeRTOS适配的改动。

  • 关键文件对比:用对比工具(如Beyond Compare)分析以下文件在两个版本中的差异:

    • usbd_cdc.c/h(USB CDC驱动)

    • usb_device.c(USB设备初始化)

    • clock_config.c(时钟配置)

    • PinSettings.h(引脚复用配置)

    • FreeRTOSConfig.h(任务堆栈/优先级配置)





2. 验证USB时钟配置



  • 确认USB时钟源:确保USB的时钟源(如HSI48、PLL等)已正确启用,且频率符合协议要求(例如全速USB需48MHz)。
    // 示例:检查RCC配置(STM32系列)
    RCC_PeriphCLKInitTypeDef clk_init;
    HAL_RCCEx_GetPeriphCLKConfig(&clk_init);
    if (clk_init.UsbClockSelection != RCC_USBCLKSOURCE_HSI48) {
      // 需配置为HSI48或PLL
    }

  • 使用示波器验证:测量开发板USB时钟引脚(如STM32的PA11/PA12)的波形,确认频率和信号完整性。




3. 检查USB描述符



  • 描述符一致性:对比两个版本的设备描述符、配置描述符、接口描述符,确保以下字段一致:

    • bDeviceClassbDeviceSubClassbDeviceProtocol

    • CDC接口的端点地址(bEndpointAddress)和包大小(wMaxPacketSize


  • 字符串描述符:确认字符串索引(如厂商名、产品名)未被错误修改,避免枚举失败。




4. 确认GPIO初始化



  • 引脚复用配置:确保USB的DP/DM引脚(如PA11/PA12)已正确映射到USB外设:
    // STM32示例:检查引脚复用函数调用
    GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF10_USB; // 确认Alternate值正确
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);




5. 调试中断和FreeRTOS任务



  • 中断优先级:确认USB中断(如OTG_FS_IRQn)的优先级是否与FreeRTOS兼容(需低于configMAX_SYSCALL_INTERRUPT_PRIORITY)。

  • 任务堆栈大小:增大USB相关任务(如CDC_ReceiveTask)的堆栈,避免溢出。

  • 添加调试输出:在USB初始化函数和中断服务程序(如USBD_CDC_InitHAL_PCD_IRQHandler)中添加日志,确认代码执行流程。




6. 验证电源和物理连接



  • 供电稳定性:使用万用表测量VBUS电压(5V±5%),并检查USB线是否支持数据传输。

  • 上拉电阻:确认DP引脚有1.5kΩ上拉到3.3V(部分芯片内部集成,需检查是否启用)。




7. 使用工具辅助分析



  • USB日志工具:通过Wireshark+USBPCap捕获USB枚举过程,观察设备是否响应主机请求。

  • 设备管理器:在Windows设备管理器中检查是否有未知设备或错误代码(如“设备描述符请求失败”)。




8. 尝试已知修复方案



  • 更新驱动:安装芯片厂商的最新USB驱动程序(如STM32的DFU驱动)。

  • 替换库文件:将SDK 2.15的USB库替换为2.4.1版本(需确保兼容性)。

  • 应用补丁:查阅厂商论坛或GitHub,确认是否有针对SDK 2.15的USB问题修复补丁。




9. 最小化测试



  • 新建工程:基于SDK 2.15重新创建USB CDC例程,避免旧工程配置残留。

  • 逐步添加功能:在无FreeRTOS的基础工程中测试USB CDC,确认问题是否由RTOS引起。




10. 联系技术支持



  • 提供复现步骤:向芯片厂商提交问题报告,附上工程配置、SDK版本、硬件型号和调试日志。




总结:问题可能源于SDK 2.15的USB配置或与FreeRTOS的兼容性调整。优先检查时钟、描述符和GPIO,再通过工具捕获USB通信,定位具体失败阶段。如果时间紧迫,可暂时使用已验证的SDK 2.4.1版本,同时向厂商反馈问题。

举报

更多回帖

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