Получать сообщения USB на STM32 MCU зависает
Я создаю драйвер USB на микроконтроллере ARM Cortex серии M, а именно на STM32F107VCT. Мой код основан на коде библиотеки USB CDC, сгенерированном собственным программным обеспечением для генерации кода STM под названием CubeMX. В CubeMX MCU настроен для поддержки 64-байтовых сообщений USB.
Отправка сообщений с главного компьютера и их анализ на MCU работает нормально, когда полезная нагрузка USB составляет 8 символов (т.е. 8 байт) или меньше. В Wireshark я вижу, что такие сообщения дополняются до 64 байтов в проводе.
Когда отправляются 9 символов, MCU останавливает выполнение (не обращаясь к аппаратному обработчику ошибок) и не нажимая ни на одну из точек останова, которые я вставил в функцию CDC_Receive_FS, как видно из сегмента кода ниже.
Я вижу, что сообщение USB (дополненное до 64 байтов, точно так же, как при использовании 8 символов в качестве полезной нагрузки) выходит с ПК с помощью Wireshark, и аппаратное обеспечение 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 */
}