我正在 ARM Cortex M 系列 MCU 上构建 USB 驱动程序,即 STM32F107VCT。我的代码是基于STM自己的代码生成软件CubeMX生成的USB CDC库代码。在 CubeMX 中,MCU 配置为支持 64 字节 USB 消息。
当 USB 有效负载为 8 个字符(即 8 个字节)或更小时,从主机发送消息并在 MCU 上解析它们可以正常工作。我可以在 Wireshark 中看到此类消息在网络上被填充为 64 字节。
当发送 9 个字符时,MCU 停止执行(不进入硬件故障处理程序)并且没有遇到我在 CDC_Receive_FS 函数中插入的任何断点,如下面的代码段所示。
我可以看到使用 Wireshark 从 PC 发出的 USB 消息(填充到 64 个字节,就像使用 8 个字符作为有效负载时一样),并且 MCU 硬件确认了该消息,但 MCU 在没有到达任何断点的情况下停止。
我的主要问题:
有谁知道为什么这会停止?也许我缺少一些简单的设置?是否有任何较低级别的代码可以放置断点以真正尝试找出发生了什么?对我来说,不清楚实际调用 CDC_Receive_FS 的函数是什么
我对 CDC_Receive_FS 的实现:
static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
// Test breakpoint 1 set here
//My custom parser
USBDRIVER_receive(&(project.usbDriver), Buf, Len);
// Test breakpoint 2 set here
//CubeMX Generated functions
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
// Test breakpoint 3 set here
return (USBD_OK);
/* USER CODE END 6 */
}
如果需要一些其他信息来解决问题,请告诉我。
USB 驱动程序由以下 CubeMX 自动生成的代码初始化:
void MX_USB_DEVICE_Init(void)
{
/* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */
/* USER CODE END USB_DEVICE_Init_PreTreatment */
/* Init Device Library, add supported class and start the library. */
USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);
USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);
USBD_Start(&hUsbDeviceFS);
/* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */
/* USER CODE END USB_DEVICE_Init_PostTreatment */
}