板子和电脑联调的时候发现,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库自带的初始化代码不能驱动硬件我也遇到过,平常心,问题解决就好