Получать сообщения USB на STM32 MCU зависает - PullRequest
0 голосов
/ 11 сентября 2018

Я создаю драйвер 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 */
}
...