stm32 USB-CDC после аппаратного сброса
Я запрограммировал мою синюю таблетку stm32f103 с протоколом USB-CDC
Я могу читать и писать на этом порту
Но после сброса аппаратного обеспечения COM-порт недоступен. Я должен отключить USB-соединение и снова подключить его, после чего появится COM-порт.
Можно ли этого избежать?
-Спасибо
4 ответа
Если вы сбрасываете bluepill, вам нужно потянуть D+ линию на несколько миллисекунд, чтобы сообщить хосту, что он должен начать процесс перечисления.
Вариант использования: STM32F103C8T6, STM32CubeIDE
USB_DEVICE/App/usb_device.c
(в основном скопировано из
MX_GPIO_Init()
:
...
void MX_USB_DEVICE_Init(void)
{
/* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */
/* Rendering hardware reset harmless (no need to replug USB cable): */
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
/*Configure GPIO pin : PA12, a.k.a. USB_DP */
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_Delay(5);
/* Hardware reset rendered harmless! */
/* USER CODE END USB_DEVICE_Init_PreTreatment */
...
}
...
Навеяно сообщением в блоге о не совсем правильном (10k вместо 1.5k) R10 на неких noname Blue Pills.
Это решение работало на моем BluePill с USB-библиотекой hal. Вставьте это вUSB_DEVICE\App\usb_device.c
->MX_USB_DEVICE_Init()
скобки кода пользователя:
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
LL_GPIO_InitTypeDef GPIO_InitStruct = { 0 };
GPIO_InitStruct.Pin = USB_DM_Pin | USB_DP_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
LL_GPIO_Init(USB_DM_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = USB_DP_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pull = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(USB_DP_GPIO_Port, &GPIO_InitStruct);
LL_GPIO_ResetOutputPin(USB_DP_GPIO_Port, USB_DP_Pin);
LL_mDelay(5);
GPIO_InitStruct.Pin = USB_DP_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
LL_GPIO_Init(USB_DP_GPIO_Port, &GPIO_InitStruct);
Странно то, что hal вообще не настраивает GPIO. Отлаживал каждый вызов от запуска ЦП и не нашел. Но работает из коробки.
Но после выполнения аппаратного сброса, COM-порт недоступен, я должен отключить USB-соединение
Я вижу это точное поведение в Windows 7 - когда COM-порт открыт во время сброса. Та же история, когда пользователь отключает и повторно подключает USB-устройство, когда COM-порт остается открытым в приложении.
У вас есть 2 возможных обходных пути:
- Закройте COM-порт до аппаратного сброса
- Обновление до Windows 10
Обратите внимание, что вам все равно нужно закрыть и заново открыть COM-порт в Windows 10 при аппаратном сбросе (или при переподключении USB).