作者
QQ群:852283276
微信:arm80x86
微信公众号:青儿创客基地
B站:主页 https://space.bilibili.com/208826118
参考
STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发
STM32CubeMX | 基于STM32使用HAL库实现USB组合设备CDC+MSC
STM32 USB相关知识扫盲
STM32CubeIDE生成、调试USB虚拟串口工程
硬件
单片机USB接口使用下面的方式连接Type-C,
Type-C连接器定义,
STM32F103 USB插入检测上拉电阻接在DP线上,STM32F4和STM32L1集成了DP/DM的上下拉电阻,所以外部不再需要额外的上下拉电阻。
CubeMX配置
USB配置,使用默认设置,在Project Manager中把堆栈改大点,防止程序跑飞,
USB描述符
在usbd_desc.c
中修改厂商信息,
/** @defgroup USBD_DESC_Private_Defines USBD_DESC_Private_Defines
* @brief Private defines.
* @{
*/
#define USBD_VID 1155
#define USBD_LANGID_STRING 1033
#define USBD_MANUFACTURER_STRING "STMicroelectronics"
#define USBD_PID_FS 22336
#define USBD_PRODUCT_STRING_FS "STM32 Virtual ComPort"
#define USBD_CONFIGURATION_STRING_FS "CDC Config"
#define USBD_INTERFACE_STRING_FS "CDC Interface"
CDC HAL库
USBD_CDC_DataOut
函数回调了(USBD_CDC_ItfTypeDef *)pdev->pUserData)->Receive
,这个函数正是CDC_Receive_FS
,
/**
* @brief USBD_CDC_DataOut
* Data received on non-control Out endpoint
* @param pdev: device instance
* @param epnum: endpoint number
* @retval status
*/
static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum)
{
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *) pdev->pClassData;
/* Get the received data length */
hcdc->RxLength = USBD_LL_GetRxDataSize(pdev, epnum);
/* USB data will be immediately processed, this allow next USB traffic being
NAKed till the end of the application Xfer */
if (pdev->pClassData != NULL)
{
((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Receive(hcdc->RxBuffer, &hcdc->RxLength);
return USBD_OK;
}
else
{
return USBD_FAIL;
}
}
CDC共初始化了4个回调函数,其中CDC_Receive_FS
是接收到PC发送的数据,
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
CDC_Init_FS,
CDC_DeInit_FS,
CDC_Control_FS,
CDC_Receive_FS
};
CDC的发送函数是CDC_Transmit_FS
,理论上只需关注这两个函数即可完成开发。
版权声明:本文为CSDN博主「三遍猪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Zhu_Zhu_2009/article/details/122602887
暂无评论