电脑不识别STM32的USB虚拟串口

电脑不识别STM32的USB虚拟串口

现象

板子和电脑联调的时候发现,USB线插入板子以后电脑不识别虚拟串口,通过禁用设备再启用,可以正常工作。也可以按一下复位键才能识别。
以前似乎没有这个问题,但记不清具体情况了。

电路

D+通过1.5K电阻上拉, 调试时整个板子通过与电脑连接的USB口供电, 即插上USB线才开始供电。

查找

由于通过禁用,启用能正常工作,于是有了上一篇文章
python–禁用、启用串口设备。
后来发现,如上操作之后,有时候仍然不能正常工作,表现为设备管理器中该设备为未识别的设备,于是判断是板子上出了问题。
换板子发现,故障重复,所以排除硬件问题。
初始化代码如下
电脑不识别STM32的USB虚拟串口_第1张图片
将124行的USB初始化代码移到最前面,故障消除。

  MX_USB_DEVICE_Init();
  MX_GPIO_Init();
  MX_CRC_Init();
  MX_I2C2_Init();
  MX_I2C3_Init();
  MX_QUADSPI_Init();
  MX_USART1_UART_Init();
  MX_SPI1_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_ADC1_Init();
  MX_TIM15_Init();
  MX_TIM16_Init();
  MX_TIM17_Init();
  MX_RNG_Init();
  MX_TIM3_Init();
  MX_TIM4_Init();
//  MX_USB_DEVICE_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_TIM5_Init();

由于这是CubeMX生成的代码,现在运行没问题,可一旦重新运行CubeMX,我移到前面的部分又会回复如初。
于是代码变成这样

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

  /* USER CODE BEGIN SysInit */
  MX_USB_DEVICE_Init();					//增加的USB初始化代码
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_CRC_Init();
  MX_I2C2_Init();
  MX_I2C3_Init();
  MX_QUADSPI_Init();
  MX_USART1_UART_Init();
  MX_SPI1_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_ADC1_Init();
  MX_TIM15_Init();
  MX_TIM16_Init();
  MX_TIM17_Init();
  MX_RNG_Init();
  MX_TIM3_Init();
  MX_TIM4_Init();
  MX_USB_DEVICE_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_TIM5_Init();
  /* USER CODE BEGIN 2 */

在USER CODE BEGIN SysInit代码段,增加USB的初始化部分,其他不变。
即整个初始化阶段USB被初始化了2次,但不会影响正常工作。

分析

在USB设备连上主机以后, 主机检测到D+或D-上的电平变化, 识别出有设备接入。于是开始与从设备的握手过程。
但是我板子上的片上外设比较多,CubeMX生成USB的初始化代码又放在比较靠后的位置,造成USB初始化还未完成,主机已经等待超时,造成握手失败。
将初始化代码前移以后,即可正常工作。
CubeMX生成的代码有坑,不是一次两次了,甚至HAL库自带的初始化代码不能驱动硬件我也遇到过,平常心,问题解决就好

你可能感兴趣的:(Python,嵌入式开发,单片机,stm32,嵌入式硬件)