本文章基于 NUCLEO-G0B1RE开发板;
一、实验目的
实验CubeMX配置 USB 的 VPC 功能,实现虚拟串口数据的回传功能。
二、实验原理
实验使用 Micro USB。
Copy of USB 引脚说明
三、CubeMX 配置
使能 USB 的Device 模式,使能中断。可以看到PA11,PA12 引脚被配置。
选择 VPC 模式
四、程序配置
ST 的库存在问题,需要在 usbd_conf.c 中注释掉对于模式的判断。
定义串口参数
USBD_CDC_LineCodingTypeDef LineCoding = {
115200, /* baud rate */
0x00, /* stop bits-1 */
0x00, /* parity - none */
0x08 /* nb. of bits 8 */ };
uint32_t UserTxBufPtrIn = 0;
uint32_t UserTxBufPtrOut = 0;
在 CDC_Control_FS 函数中添加 串口参数配置。
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;
在 CDC_Receive_FS 函数中,修改接收函数
if(UserTxBufPtrIn+*Len<=APP_TX_DATA_SIZE)
{
memcpy((uint8_t*)(UserTxBufferFS+UserTxBufPtrIn),Buf,*Len);
UserTxBufPtrIn+=*Len;
}
else
{
memcpy((uint8_t*)(UserTxBufferFS),Buf,*Len);
UserTxBufPtrIn=*Len;
UserTxBufPtrOut=0;
}
return (USBD_OK);
添加回传函数
void Main_loop(void)
{
uint32_t buffsize;
if(UserTxBufPtrOut != UserTxBufPtrIn)
{
if(UserTxBufPtrOut > UserTxBufPtrIn) /* Rollback */
{
buffsize= UserTxBufPtrIn;
}
else
{
buffsize = UserTxBufPtrIn - UserTxBufPtrOut;
}
CDC_Transmit_FS((uint8_t*)(UserTxBufferFS+UserTxBufPtrOut),buffsize);
UserTxBufPtrOut += buffsize;
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
}
}
五、实验结果
可以成功回传数据