STM32f205 基于HAL库 使用USB虚拟串口中的端口无法正常打开

最近学习STM32 ubs vpc 通过网上资料完成简单下位机发送数据到PC端,使用串口助手接受信息。
本人使用的是Hal+VS+GCC环境编译,
遇到问题是:
1.多数情况虚拟串口有感叹号,偶尔正常。(不正常发现通过卸载对应驱动重新加载能够消除感叹号,这个问题经实验和堆大小配置无关我配置0x600)
2.在烧录完成后,如果端口没有感叹号,可以正常用串口助手打开接受数据,如果有感叹号,通过1问题里叙述操作后,也可以通信,诡异的是我退出debug模式后,给板卡断电在上电端口就死活打不开了!即使端口没有感叹号!(我用stm32f103最小系统板卡烧录一样程序完全没有上述两个问题)
stm32CUBEmx配置

img

img

img

MAIN函数

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usb_device.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usbd_cdc_if.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
extern USBD_HandleTypeDef hUsbDeviceFS;
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/*USB 重新枚举函数*/
void USB_Reset(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  __HAL_RCC_GPIOA_CLK_ENABLE();
  // GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_11;
  // 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_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
  HAL_Delay(100);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);
}

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
  //发送数据包
  uint8_t UserTxBuffer[] = "i'm the best \r\n";
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  USB_Reset();
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */

  //HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, SET);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_Delay(1000);

    USBD_CDC_SetTxBuffer(&hUsbDeviceFS, (uint8_t *)&UserTxBuffer, sizeof(UserTxBuffer));
    USBD_CDC_TransmitPacket(&hUsbDeviceFS);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

实验结果

img

STM32F205有两个USB接口,一个是FSUSB,另外一个是HSUSB。
FSUSB——full speed USB ,HSUSB——high speed USB
FSUSB最高支持全速的USB,HSUSB不仅支持全速的USB还支持高速的USB,当然HSUSB要支持高速的USB必须要接外部PHY,才可以支持高速的USB,如果使用内部的PHY只支持全速的USB。