STM32 USB通信学习指南
学习STM32的USB通信需要掌握的内容包括以下几个部分:USB基础知识、STM32 USB库的使用、USB设备工作模式的选择、USB设备描述符的配置、USB传输的实现。接下来将会详细介绍这些内容,并附上相关的示例代码。
一、USB基础知识
- USB是一种通用的串行总线标准,用于计算机与外设之间的连接和通信。它提供了高速、可靠、灵活的数据传输方式。
- USB的工作模式包括主机模式和设备模式,主机模式指的是计算机作为主控端,控制和管理外设,设备模式指的是外设作为被控端,接收主机的控制和指令。
- USB通信的基本单位是端点(Endpoint),每个USB设备都有若干个端点,用于数据的发送和接收。端点分为控制端点、批量传输端点和中断传输端点。
二、STM32 USB库的使用 ST公司提供了丰富的USB库,可在STM32微控制器上实现USB通信功能。使用前需要下载并安装对应的USB库文件。
示例代码:
#include "stm32f4xx.h"
#include "usb_device.h"
int main(void)
{
// 初始化USB设备
MX_USB_DEVICE_Init();
while (1)
{
// 主循环
}
}
三、USB设备工作模式的选择
- USB设备有两种工作模式:CDC模式(虚拟串口模式)和HID模式(人机接口设备模式)。选择合适的模式取决于实际需求。
- CDC模式适用于需要进行数据的发送和接收的应用,如串口调试、数据采集等。
- HID模式适用于需要与计算机进行人机交互的应用,如键盘、鼠标、游戏手柄等。
示例代码(CDC模式):
#include "usbd_cdc_if.h"
int main(void)
{
// 初始化USB设备
MX_USB_DEVICE_Init();
while (1)
{
// 接收数据
uint8_t rxBuffer[64];
uint8_t rxLength = CDC_Receive_FS(rxBuffer, sizeof(rxBuffer));
// 处理接收到的数据
// ...
// 发送数据
uint8_t txBuffer[] = "Hello, USB!";
CDC_Transmit_FS(txBuffer, sizeof(txBuffer));
}
}
四、USB设备描述符的配置
- USB设备描述符是用于描述USB设备的一种数据结构,包含了设备的基本信息和功能描述。
- 设备描述符、配置描述符、接口描述符、端点描述符是USB设备描述符的核心部分。
- 需要根据实际应用需求,配置USB设备描述符的信息。
示例代码:
// 设备描述符
__ALIGN_BEGIN static uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
0x12, // bLength
USB_DESC_TYPE_DEVICE, // bDescriptorType
0x00, // bcdUSB
0x02,
0x00, // bDeviceClass
0x00, // bDeviceSubClass
0x00, // bDeviceProtocol
USB_MAX_EP0_SIZE, // bMaxPacketSize
LOBYTE(USB_VID), // idVendor
HIBYTE(USB_VID), //
LOBYTE(USB_PID), // idProduct
HIBYTE(USB_PID), //
0x00, // bcdDevice rel. 2.00
0x02,
USBD_IDX_MFC_STR, // Index of manufacturer string
USBD_IDX_PRODUCT_STR, // Index of product string
USBD_IDX_SERIAL_STR, // Index of serial number string
USBD_MAX_NUM_CONFIGURATION // bNumConfigurations
};
// 配置描述符
__ALIGN_BEGIN static uint8_t USBD_CfgDesc[USB_LEN_CFG_DESC] __ALIGN_END =
{
0x09, // bLength: Configuration Descriptor size
USB_DESC_TYPE_CONFIGURATION, // bDescriptorType: Configuration
USB_LEN_CFG_DESC,
0x00,
0x01, // bNumInterfaces: 1 interface
0x01, // bConfigurationValue: Configuration value
0x00, // iConfiguration: Index of string descriptor describing the configuration
0xC0, // bmAttributes: bus powered and Support Remote Wake-up
0x32, // MaxPower 100 mA: this current is used for detecting Vbus
// 接口描述符
0x09, // bLength: Interface Descriptor size
USB_DESC_TYPE_INTERFACE, // bDescriptorType: Interface descriptor type
0x00, // bInterfaceNumber: Number of Interface
0x00, // bAlternateSetting: Alternate setting
0x02, // bNumEndpoints
0xFF, // bInterfaceClass: Vendor specific
0x00, // bInterfaceSubClass: Vendor specific
0x00, // bInterfaceProtocol: Vendor specific
0x00, // iInterface: Index of string descriptor
// 控制端点描述符
0x07, // bLength: Endpoint Descriptor size
USB_DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint
0x81, // bEndpointAddress: (IN1)
0x02, // bmAttributes: Bulk
LOBYTE(USB_FS_MAX_PACKET_SIZE), // wMaxPacketSize: 64 Bytes max
HIBYTE(USB_FS_MAX_PACKET_SIZE),
0x00, // bInterval: ignored for Bulk transfer
// 数据端点描述符
0x07, // bLength: Endpoint Descriptor size
USB_DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint
0x01, // bEndpointAddress: (OUT1)
0x02, // bmAttributes: Bulk
LOBYTE(USB_FS_MAX_PACKET_SIZE), // wMaxPacketSize: 64 Bytes max
HIBYTE(USB_FS_MAX_PACKET_SIZE),
0x00 // bInterval: ignored for Bulk transfer
};
// 其他描述符
uint8_t *USBD_FS_StringDesc[] =
{
USBD_FS_ManufacturerStr,
USBD_FS_ProductStr,
USBD_FS_SerialStr,
};
// USB设备配置
USBD_DescriptorsTypeDef USB_Desc =
{
USBD_DeviceDesc, // 设备描述符
USBD_CfgDesc, // 配置描述符
USBD_FS_StringDesc, // 字符串描述符
NULL // 回调函数
};
五、USB传输的实现
- USB传输分为控制传输、批量传输和中断传输。
- 控制传输是一种请求-应答模式,用于设备与主机之间的命令和数据交换。
- 批量传输是一种大数据块的传输方式,适用于大量数据的传输,如文件传输。
- 中断传输是一种实时性要求较高的传输方式,适用于需要快速响应的数据交互。
示例代码(使用控制传输):
#include "usbd_core.h"
#include "usbd_cdc.h"
#include "usbd_cdc_if_template.h"
USBD_HandleTypeDef hUsbDeviceFS;
static int8_t CDC_Init_FS(void)
{
// 初始化CDC设备
hUsbDeviceFS.pClassData = &hUsbDeviceFS;
USBD_CDC_Init(&hUsbDeviceFS, CDC_IncomingData, CDC_OutgoingData);
return (USBD_OK);
}
static int8_t CDC_DeInit_FS(void)
{
// 取消初始化CDC设备
return (USBD_OK);
}
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t *pBuf, uint16_t length)
{
// 控制传输处理
return (USBD_OK);
}
static int8_t CDC_Receive_FS(uint8_t *pBuf, uint32_t *Len)
{
// 接收数据处理
return (USBD_OK);
作者:大黄鸭duck.