使用stm32cubeMX工具生成驅動及相關代碼:
Pinout配置USB_OTG_FS為Device_only模式:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX4lkaNRTVU1EeJpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zNzMjMyMDMyEDOyUDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
MiddleWares中選擇USB_DEVICE為VCP
clockconfig根據實際情況配置
後面配置預設就可以
接下來需要看一下工程的設定
這裡預設Heap Size是0x400,需要改大,否則連接配接電腦後會有問題
接收中斷調用USBD_CDC_DataOut()函數,Receive指向CDC_Receive_FS(),這裡更新接收長度,而且會将接收buffer重置,并開始下一次接收,是以pc一次下發超過64位元組時,超過部分會覆寫之前的值
我的接收和發送函數
void recive_from_vcp(uint8_t *buffer, uint8_t *rcv_buffer, USBD_HandleTypeDef *usb_handle)
{
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) usb_handle->pClassData;
if(hcdc->RxLength != 0)
{
CMD_Dealwith(rcv_buffer, hcdc->RxLength);
hcdc->RxLength = 0;
}
USBD_CDC_SetRxBuffer(usb_handle, buffer);
USBD_CDC_ReceivePacket(usb_handle);
}
發送函數(函數裡的buffer必須是static的,否則在setTxBuffer後,函數被釋放,buffer的記憶體也被釋放,發送的内容就保證不了了):
void send_used_vcp(RingBuffer *packet_buffer, USBD_HandleTypeDef *usb_handle)
{
static uint8_t buffer[VCP_MAX_LEN];
uint8_t send_len;
//取buffer不釋放
send_len = user_buffer_peek(packet_buffer, buffer, VCP_MAX_LEN);
if(send_len == 0)
return;
USBD_CDC_SetTxBuffer(usb_handle, buffer, send_len);
//發送成功,釋放buffer
if(USBD_CDC_TransmitPacket(usb_handle) == USBD_OK)
user_buffer_release_items(packet_buffer, send_len);
}