资讯详情

STM32H7 固件库版本导致的USB虚拟串口问题

固件版本:

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虚拟串口时均无①问题和此问题)。

标签: 475v1100uf电容器代475v1100uf电容器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台