STM32 USB 基础
介绍
USB(Universal Serial Bus,通用串行总线)是一种广泛使用的通信协议,用于连接计算机与外部设备。STM32 微控制器集成了 USB 外设,支持多种 USB 模式,如设备模式(Device Mode)、主机模式(Host Mode)和 OTG 模式(On-The-Go)。本文将重点介绍 STM32 的 USB 设备模式,帮助初学者理解 USB 通信的基本原理及其在 STM32 中的实现。
USB 协议基础
USB 协议是一种主从架构的通信协议,由主机(Host)和设备(Device)组成。主机负责管理通信过程,而设备则响应主机的请求。USB 通信基于端点(Endpoint),每个端点可以看作是一个数据缓冲区,用于存储发送或接收的数据。
USB 端点类型
- 控制端点(Control Endpoint):用于设备配置和状态查询。
- 中断端点(Interrupt Endpoint):用于传输小量、低延迟的数据。
- 批量端点(Bulk Endpoint):用于传输大量数据,如文件传输。
- 同步端点(Isochronous Endpoint):用于实时数据传输,如音频和视频。
STM32 的 USB 外设支持多种端点类型,开发者可以根据应用需求选择合适的端点类型。
STM32 USB 外设
STM32 微控制器集成了 USB 外设,支持全速(Full Speed,12 Mbps)和低速(Low Speed,1.5 Mbps)USB 通信。以下是 STM32 USB 外设的主要功能:
- USB 设备控制器:负责处理 USB 协议栈的底层通信。
- 端点缓冲区:用于存储发送和接收的数据。
- 中断机制:用于通知主程序 USB 事件的发生。
STM32 USB 初始化步骤
- 配置 USB 时钟。
- 初始化 USB 外设。
- 配置端点。
- 启用 USB 中断。
- 处理 USB 事件。
以下是一个简单的 STM32 USB 初始化代码示例:
#include "stm32f1xx_hal.h"
USB_HandleTypeDef husb;
void SystemClock_Config(void);
static void MX_USB_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_USB_Init();
while (1) {
// 主循环
}
}
void SystemClock_Config(void) {
// 配置系统时钟
}
static void MX_USB_Init(void) {
husb.Instance = USB;
husb.Init.dev_endpoints = 8;
husb.Init.speed = USB_SPEED_FULL;
husb.Init.ep0_mps = USB_MAX_EP0_SIZE;
if (HAL_USB_Init(&husb) != HAL_OK) {
// 初始化错误处理
}
}
实际应用案例
USB HID 设备
USB HID(Human Interface Device)是一种常见的 USB 设备类型,用于连接键盘、鼠标等输入设备。以下是一个简单的 USB HID 设备实现示例:
#include "stm32f1xx_hal.h"
#include "usbd_hid.h"
USB_HandleTypeDef husb;
USBD_HandleTypeDef hUsbDeviceFS;
int main(void) {
HAL_Init();
SystemClock_Config();
MX_USB_DEVICE_Init();
while (1) {
// 主循环
}
}
void SystemClock_Config(void) {
// 配置系统时钟
}
void MX_USB_DEVICE_Init(void) {
USBD_Init(&hUsbDeviceFS, &HID_Desc, DEVICE_FS);
USBD_RegisterClass(&hUsbDeviceFS, &USBD_HID);
USBD_Start(&hUsbDeviceFS);
}
在实际开发中,开发者需要根据具体需求配置 USB 描述符(Descriptor),如设备描述符、配置描述符和报告描述符。
总结
本文介绍了 STM32 微控制器中的 USB 通信基础知识,包括 USB 协议、STM32 USB 外设的使用方法以及实际应用案例。通过学习本文,初学者可以掌握 STM32 USB 的基本配置和使用方法,为进一步开发复杂的 USB 应用打下基础。
附加资源与练习
附加资源
练习
- 尝试修改 USB HID 设备的描述符,使其支持更多的输入报告。
- 使用 STM32 的 USB 批量端点实现一个简单的文件传输功能。
- 探索 STM32 的 USB OTG 模式,并尝试实现一个 USB 主机功能。
在开发过程中,务必注意 USB 协议的时序要求,避免因时序问题导致通信失败。