固件版本:
STM32Cube_FW_H7_V1.7.0
主要问题:
使用STM32Cube配置USB全速Device,配置虚拟串口后,出现①计算机可以成功举串口设备,但不能用串口助手打开串口;②在解决问题①之后(用串口助手成功通信),拔插USB无法列举设备,重启STM32后第一次插入可以,第二次就会无法识别。
解决办法:
①原因是虚拟串口的波特率、停止位、奇偶校验等信息在打开串口时无法获得。
在usbd_cdc_if.c结构体在文件中定义
USBD_CDC_LineCodingTypeDef linecoding = {
115200, /* baud rate*/ 0x01, /* stop bits-1*/ 0x00, /* parity - none*/ 0x08 /* nb. of bits 8*/ };
修改CDC_Control_FS
实现函数可以解决问题①。波特率停止位等信息不是真实的,只是为了满足驱动要求。真实传输速率位USB这里的传输速率Mbit/s。
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length) {
/* USER CODE BEGIN 5 */ switch(cmd) {
case CDC_SEND_ENCAPSULATED_COMMAND: break; case CDC_GET_ENCAPSULATED_RESPONSE: break; case CDC_SET_COMM_FEATURE: break; case CDC_GET_COMM_FEATURE: break; case CDC_CLEAR_COMM_FEATURE: break; /*******************************************************************************/ /* Line Coding Structure */ /*-----------------------------------------------------------------------------*/ /* Offset | Field | Size | Value | Description */ /* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/ /* 4 | bCharFormat | 1 | Number | Stop bits */ /* 0 - 1 Stop bit */ /* 1 - 1.5 Stop bits */ /* 2 - 2 Stop bits */ /* 5 | bParityType | 1 | Number | Parity */ /* 0 - None */ /* 1 - Odd */ /* 2 - Even */ /* 3 - Mark */ /* 4 - Space */ /* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */ /*******************************************************************************/ case CDC_SET_LINE_CODING: linecoding.bitrate = (uint32_t)(pbuf[0] | (pbuf[1] << 8) |\
(pbuf[2] << 16) | (pbuf[3] << 24));
linecoding.format = pbuf[4];
linecoding.paritytype = pbuf[5];
linecoding.datatype = pbuf[6];
break;
case CDC_GET_LINE_CODING:
pbuf[0] = (uint8_t)(linecoding.bitrate);
pbuf[1] = (uint8_t)(linecoding.bitrate >> 8);
pbuf[2] = (uint8_t)(linecoding.bitrate >> 16);
pbuf[3] = (uint8_t)(linecoding.bitrate >> 24);
pbuf[4] = linecoding.format;
pbuf[5] = linecoding.paritytype;
pbuf[6] = linecoding.datatype;
break;
case CDC_SET_CONTROL_LINE_STATE:
break;
case CDC_SEND_BREAK:
break;
default:
break;
}
return (USBD_OK);
/* USER CODE END 5 */
}
②原因不明
在跟踪固件库的USB中断处理后,没有找到明确的异常,怀疑是固件库有问题(因为使用STM32F0与F1的USB虚拟串口时均无①问题和此问题)。