STM32
直播中

乐骞添

7年用户 1002经验值
私信 关注
[问答]

如何使用stm32cubeMX工具生成驱动?

如何使用STM32cubeMX工具生成驱动?

回帖(1)

张琳

2021-12-6 15:19:45
使用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);
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分