Возможно ли использование USB на BluePill в качестве порта для обмена данными? Или он предназначен только как питание? Если первое возможно, то подскажите как установить драйвер для USB-интерфейса?
Приветствую, да можно, самый простой вариант - CDC - https://microtechnics.ru/stm32cube-i-usb-virtual-com-port/
Virtual COM драйвер - ссылка.
Благодарю за ответ. Пытался установить драйвера Virtual СОМ, но в процессе инсталляции выпадает ошибка: 1628 Failled to complete installation. Я думаю там версии предоставлены только для Win 7 и Win 8. А у меня Win 10. Есть информация по версиям для Win 10?
@mihayk честно не помню на 100 процентов, но по-моему на 10-ку его же ставил всегда...
Установился, все ОК. Но обнаружилась неприятная ситуация:
У меня 2 контроллера STM32F1093C8T6 (BluePill). Поработав с USB c первым контроллером (ввод вывод данных через USB), я поработал со вторым контроллером (задача похожая на первую, с отличиями). Закончив работать со вторым, я переключился на первый контроллер. Но тут меня ждал неприятный эффект, этот контроллер перестал обнаруживаться, как виртуальный COM-порт.
Поставил драйвера на 2-ой компьютер. На нем первый контроллер также не обнаруживается, а второй обнаруживается везде.
Есть мысль что надо создать новый проект на STMCubeMX и залить его по новой. Еще не проверял, контроллеры на работе.
Что за ошибка (неопределенный дескриптор устройства в диспетчере устройств) и как избегать таких ситуаций?
Приветствую!
Нашел причину сбоя!
Оказывается перед работой с USB-портом, если сразу идет работа с ним (в функции main()), надо делать задержку хотя бы 2 сек (HAL_Delay(2000)) , чтобы контроллер успел инициализировать устройство USB. Выяснил методом проб и ошибок!
@mihayk еще в идеале подтяжкой D+ через транзистор управлять, особенно если питание через этот же разъем - https://microtechnics.ru/community/elektronika/shema-usb-dlya-stm32/#post-500.
В BluePill D+ подтянута к питанию. Что бы нормально запускалась, нужно перед инициализацией USB нужно эту ногу дёрнуть к земле и через 2 мс инициализировать USB, тогда он виндой определяется с лёту.
У меня было так
/* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ MX_GPIO_Init(); ResetUSB(); // Прижимаем D+ USB к земле для запуска определения нашего устройства компьютером /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM1_Init(); MX_ADC1_Init(); // ResetUSB(); MX_USB_DEVICE_Init();
ResetUSB() !!!!
// Фунция сброса D+ к нулю для запуска определения нашей железяки компьютером void ResetUSB(void) { // reset USB DP (D+) GPIO_InitTypeDef GPIO_InitStruct = {0}; // инициализируем пин DP как выход GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); // прижимаем DP к "земле" HAL_Delay(1); }
Работало на ура.