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).

Другие вопросы по тегам