使用stm32cubeMX工具生成驱动及相关代码:
Pinout配置USB_OTG_FS为Device_only模式:
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 *u***_handle)
{
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) u***_handle->pClassData;
if(hcdc->RxLength != 0)
{
CMD_Dealwith(rcv_buffer, hcdc->RxLength);
hcdc->RxLength = 0;
}
USBD_CDC_SetRxBuffer(u***_handle, buffer);
USBD_CDC_ReceivePacket(u***_handle);
}
发送函数(函数里的buffer必须是static的,否则在setTxBuffer后,函数被释放,buffer的内存也被释放,发送的内容就保证不了了):
void send_used_vcp(RingBuffer *packet_buffer, USBD_HandleTypeDef *u***_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(u***_handle, buffer, send_len);
//发送成功,释放buffer
if(USBD_CDC_TransmitPacket(u***_handle) == USBD_OK)
user_buffer_release_items(packet_buffer, send_len);
}
使用stm32cubeMX工具生成驱动及相关代码:
Pinout配置USB_OTG_FS为Device_only模式:
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 *u***_handle)
{
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) u***_handle->pClassData;
if(hcdc->RxLength != 0)
{
CMD_Dealwith(rcv_buffer, hcdc->RxLength);
hcdc->RxLength = 0;
}
USBD_CDC_SetRxBuffer(u***_handle, buffer);
USBD_CDC_ReceivePacket(u***_handle);
}
发送函数(函数里的buffer必须是static的,否则在setTxBuffer后,函数被释放,buffer的内存也被释放,发送的内容就保证不了了):
void send_used_vcp(RingBuffer *packet_buffer, USBD_HandleTypeDef *u***_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(u***_handle, buffer, send_len);
//发送成功,释放buffer
if(USBD_CDC_TransmitPacket(u***_handle) == USBD_OK)
user_buffer_release_items(packet_buffer, send_len);
}
举报