STM32 之三 标准外设版USB驱动库详解(架构+文件+函数+使用说明+示例程序)

本文介绍了STM32的USB驱动库,包括Legacy库(如STSW-STM32046)和Cube库的区别,并详细阐述了Legacy库的结构和使用,涵盖USB OTG core的全速和高速核心,以及低层驱动的配置和使用。文中还提及了Host和Device库的源文件结构、函数调用关系、配置方法和使用步骤,适合STM32开发者了解和移植USB驱动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

  • 目前,ST的USB驱动有两套,一套是早期的独立版USB驱动,官方培训文档中称为Legacy library;一套为针对其Cube 系列的驱动,根据芯片不同可能有区别,具体见对应芯片的Cube驱动包,官方培训文档中称为Cube library。 本文使用的为Legacy library USB 驱动。更详细的各驱动库版本,请参考博文STM32 之 USB IP(USB模块) 详解
  • 本文多出自于ST的官方文档 及 2016~2017的培训文档,读者也可以直接去ST官网查阅相关文档。
  • 稍有涉及USB 2.0 规范的内容,关于USB规范去官网或自行Google。也可以参考:
GD32F407ZG是一款基于ARM Cortex-M4内核的微控制器,具有丰富的外设接口,其中包括USB_HS(高速USB)接口。配置USB_HS VCP(虚拟串口)需要以下几个步骤: ### 硬件连接 1. **连接USB接口**:将GD32F407ZG的USB_HS接口连接到电脑或其他USB主机设备。 2. **电源和地线**:确保微控制器的电源和地线正确连接。 ### 软件配置 1. **开发环境**:使用Keil MDK或其他支持GD32F407ZG的开发环境。 2. **下载固件库**:从GigaDevice官网下载GD32F4xx的标准固件库。 3. **配置时钟**:确保系统时钟配置正确,USB_HS接口需要48MHz的时钟。 ### 配置步骤 1. **初始化USB_HS接口**: - 启用USB_HS时钟。 - 配置USB_HS引脚为复用功能。 - 初始化USB_HS设备库。 2. **配置VCP**: - 初始化VCP相关的描述符(如设备描述符、配置描述符、接口描述符等)。 - 配置VCP的缓冲区。 3. **实现VCP功能**: - 实现USB发送和接收数据的功能。 - 处理USB中断。 ### 示例代码 以下是一个简单的示例代码,展示了如何初始化USB_HS并配置VCP: ```c #include "gd32f4xx.h" #include "usb_device.h" #include "usbd_cdc.h" void usb_hs_init(void) { // 启用USB_HS时钟 rcu_periph_clock_enable(RCU_USBHS); rcu_periph_clock_enable(RCU_USBHSULPI); // 配置USB_HS引脚 gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_11 | GPIO_PIN_12); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100MHZ, GPIO_PIN_11 | GPIO_PIN_12); gpio_af_set(GPIOA, GPIO_AF_10, GPIO_PIN_11 | GPIO_PIN_12); // 初始化USB_HS设备库 usbd_init(&usb_device_instance, &cdc_class, &cdc_desc, &cdc_usr_desc, &cdc_str_desc, &usb_device_descriptors, DEVICE_CLASS_CDC); usbd_cdc_init(&cdc_device_instance, &cdc_class, &cdc_desc, &cdc_usr_desc, &cdc_str_desc); // 配置VCP缓冲区 usbd_cdc_set_rx_buffer(&cdc_device_instance, cdc_rx_buffer, CDC_DATA_FS_MAX_PACKET_SIZE); usbd_cdc_set_tx_buffer(&cdc_device_instance, cdc_tx_buffer, CDC_DATA_FS_MAX_PACKET_SIZE); // 启动USB设备 usbd_start(&usb_device_instance); } int main(void) { // 系统初始化 system_init(); // 初始化USB_HS usb_hs_init(); while (1) { // 主循环 if (cdc_device_instance.connection_state == CDC_CONNECTED) { // 处理接收数据 if (cdc_device_instance.rx_buffer_available) { // 处理接收到的数据 usbd_cdc_receive(&cdc_device_instance); } // 发送数据 if (cdc_device_instance.tx_buffer_available) { // 发送数据 usbd_cdc_transmit(&cdc_device_instance); } } } } ``` ### 注意事项 1. **时钟配置**:确保USB_HS接口的时钟配置正确,否则无法正常工作。 2. **电源管理**:USB设备需要稳定的电源供应,避免电源噪声。 3. **调试**:使用示波器或逻辑分析仪调试USB信号,确保信号完整性。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZC·Shou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值