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

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

现象

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

电路

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

查找

由于通过禁用,启用能正常工作,于是有了上一篇文章
python–禁用、启用串口设备。
后来发现,如上操作之后,有时候仍然不能正常工作,表现为设备管理器中该设备为未识别的设备,于是判断是板子上出了问题。
换板子发现,故障重复,所以排除硬件问题。
初始化代码如下
在这里插入图片描述
将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库自带的初始化代码不能驱动硬件我也遇到过,平常心,问题解决就好

版权声明:本文为CSDN博主「老李的森林」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/13011803189/article/details/122727343

生成海报
点赞 0

老李的森林

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

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

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

从os-cli看串口操作

cli,主要是实现输出命令行,控制设备。再就是查询设备状态的作用。实现过程分析 实现串口初始化 这块是由cube自动生成的。 cli任务初始化 在cli_task.c中执行module_init("cli", cli_ta

串口通信小试牛刀

串口通信小试牛刀 目录 串口通信小试牛刀一、串口通信协议:RS-232 1.串口通信协议2. RS-2323.RS232电平与TTL电平的区别4.USB/TTL转232模块(以CH340芯片模块为例&#xff09

STM32F103寄存器方式点亮LED流水灯

STM32F103寄存器方式点亮LED流水灯 1、学习和理解STM32F103系列芯片的地址映射和寄存器映射原理;了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。 2、