天天看點

stm32f405 usb虛拟序列槽

使用stm32cubeMX工具生成驅動及相關代碼:

Pinout配置USB_OTG_FS為Device_only模式:

stm32f405 usb虛拟序列槽

MiddleWares中選擇USB_DEVICE為VCP

stm32f405 usb虛拟序列槽

clockconfig根據實際情況配置

stm32f405 usb虛拟序列槽

後面配置預設就可以

stm32f405 usb虛拟序列槽
stm32f405 usb虛拟序列槽

接下來需要看一下工程的設定

stm32f405 usb虛拟序列槽

這裡預設Heap Size是0x400,需要改大,否則連接配接電腦後會有問題

接收中斷調用USBD_CDC_DataOut()函數,Receive指向CDC_Receive_FS(),這裡更新接收長度,而且會将接收buffer重置,并開始下一次接收,是以pc一次下發超過64位元組時,超過部分會覆寫之前的值

stm32f405 usb虛拟序列槽
stm32f405 usb虛拟序列槽

我的接收和發送函數

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);
}
           

繼續閱讀