Последние две недели я работаю над проектом, и отладка этого вопроса заняла всю эту неделю. Хотите знать, если кто-нибудь может помочь, я постараюсь быть максимально четким и ясным.
Я пытаюсь реализовать виртуальный порт USB на микроконтроллере на базе STM32F302K8 (Cortex M4). Я использовал STM32CubMX для генерации кода, необходимого для настройки устройства USB Full Speed, реализующего класс CDC. Мое устройство отображается как в Windows (диспетчер устройств), так и в Linux. Я могу реализовать простую функцию эха на основе примера кода, но когда я сейчас пытаюсь использовать функцию USBD_CDC_SetTxBuffer для отправки данных на ПК, это отключает Hard Fault Handler. Я сузил это до того факта, что поле UsbDeviceFS.pClass (которое требуется USBD_CDC_SetTxBuffer) никогда не инициализируется, потому что USBD_CDC_Init () никогда не вызывается при инициализации USB-устройства.
Я внес исправления в несколько ошибок (включая изменение размера кучи, исправление флага передачи в USBD_CDC_TransmitPacket и изменение размера CDC_DATA_HS_MAX_PACKET_SIZE на 256 из 512) в примере кода, как описано на форуме ST, но все еще получаю ту же ошибку.
Код настройки моего устройства
* USB Device Core handle declaration */
USBD_HandleTypeDef hUsbDeviceFS;
/* init function */
void MX_USB_DEVICE_Init(void)
{
/* 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);
}
Ответы:
Чтобы ответить на мой собственный вопрос, проблема в том, что мой код не дождался завершения инициализации USB и сразу начал отправлять данные. Вставка активного ожидания в логическое значение или добавление задержки (как указано @ramez) решает проблему.
ОБНОВЛЕНИЕ Эта ошибка была исправлена в последующих версиях драйвера USB CDC от ST. Теперь в настройках есть HAL_Delay. Предостережение заключается в том, что если по какой-либо причине Sys_Tick не работает / деактивирован / еще не инициализирован, ваш код зависнет.
источник
Я использовал CubeMX для генерации кода для обнаружения STM32F4. Я использовал его как виртуальный COM-порт, как вы. Я не использовал функцию USBD_CDC_SetTxBuffer () напрямую. В файле usbd_cdc_if.c есть функция с именем CDC_Transmit_FS () . Произошла ошибка в сгенерированном коде, функция взяла в качестве параметра буфер и ничего с этим не сделала. Исправленный код функции следующий:
На самом деле мне пришлось добавить memcpy в код. После этой коррекции я мог отправить данные с микроконтроллера на ПК с этой функцией передачи. Например:
Инициализация в MX_USB_DEVICE_Init () у меня такая же, как и у вас.
источник
Во-первых, проверьте, является ли hUsbDevice_0 нулевым (отсутствует элемент в вашем решении):
Это предотвратит зависание вашего ОК и не потребует много времени на ожидание.
Вы можете разместить его где-нибудь в CDC_Transmit_FS:
источник
У меня была та же проблема, но оказалось, что единственное, что мне нужно сделать, это снова подключить USB-соединение к компьютеру. В большинстве случаев вы прошиваете код и перезагружаете микроконтроллер, но на стороне ПК перечисление не обновляется. USBD_CDC_Init вызывается, когда хост начинает проверять ваше устройство, и поэтому pClassData имеет значение NULL.
источник