前言
学习stm32 USB接口使用,学会用CUBE工具快速创建USB设备工程及调试,关于usb的相关知道请读者提前准备并学习,当然如果不想深究其中原理的话,跟着本文来操作就可以实现基于USB的设备开发了。需要提示的是,stm32在使用usb接口功能是一般需要在DP引脚上上拉一个1.5K电阻到3.3V(部分MCU内部会上拉)。
示例详解
基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。
本示例所用的最小系统板原理图:
从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置:
系统时钟树
USB接口配置
USB设备配置(选择Human Interface Device Class(HID),参数可保持默认)
引脚配置
中断配置(保持默认)
工程代码
在usbd_hid.h中做如下更改:
在usbd_hid.c中做如下更改:
/* USB HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
#if 0
0x09, /* bLength: Configuration Descriptor size */
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
USB_HID_CONFIG_DESC_SIZ,
/* wTotalLength: Bytes returned */
0x00,
0x01, /*bNumInterfaces: 1 interface*/
0x01, /*bConfigurationValue: Configuration value*/
0x00, /*iConfiguration: Index of string descriptor describing
the configuration*/
0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */
0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/
/************** Descriptor of Joystick Mouse interface ****************/
/* 09 */
0x09, /*bLength: Interface Descriptor size*/
USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
0x00, /*bInterfaceNumber: Number of Interface*/
0x00, /*bAlternateSetting: Alternate setting*/
0x01, /*bNumEndpoints*/
0x03, /*bInterfaceClass: HID*/
0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
0, /*iInterface: Index of string descriptor*/
/******************** Descriptor of Joystick Mouse HID ********************/
/* 18 */
0x09, /*bLength: HID Descriptor size*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
0x11, /*bcdHID: HID Class Spec release number*/
0x01,
0x00, /*bCountryCode: Hardware target country*/
0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/
0x22, /*bDescriptorType*/
HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
0x00,
/******************** Descriptor of Mouse endpoint ********************/
/* 27 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/
0x03, /*bmAttributes: Interrupt endpoint*/
HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */
0x00,
HID_FS_BINTERVAL, /*bInterval: Polling Interval (10 ms)*/
/* 34 */
#else
/************** Descriptor of Configuation ****************/
0x09, /* bLength: Configuation Descriptor size */
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
USB_HID_CONFIG_DESC_SIZ,
/* wTotalLength: Bytes returned */
0x00,
0x01, /* bNumInterfaces: 1 interface */
0x01, /* bConfigurationValue: Configuration value */
0x00, /* iConfiguration: Index of string descriptor describing the configuration*/
0xe0, /* bmAttributes: Bus powered */ //160911
/*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */
0xFA, /* MaxPower 500 mA: this current is used for detecting Vbus */ //160911 以2mA为单位
// 0x32, /* MaxPower 100 mA: this current is used for detecting Vbus */
// 0x96, /* MaxPower 300 mA: this current is used for detecting Vbus */
/************** Descriptor of Custom HID interface ****************/
/* 09 */
0x09, /* bLength: Interface Descriptor size */
USB_DESC_TYPE_INTERFACE,/* bDescriptorType: Interface descriptor type = 4*/
0x00, /* bInterfaceNumber: Number of Interface */
0x00, /* bAlternateSetting: Alternate setting */
0x02, /* bNumEndpoints */
0x03, /* bInterfaceClass: HID */
0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */
0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
0, /* iInterface: Index of string descriptor */
/******************** Descriptor of Custom HID ********************/
/* 18 */
0x09, /* bLength: HID Descriptor size */
HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
0x10,0x01, /* bcdHID: HID Class Spec release number */ //160911 设备版本号BCD码
0x00, /* bCountryCode: Hardware target country */
0x01, /* bNumDescriptors: Number of HID class descriptors to follow */
0x22, /* bDescriptorType */
CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
0x00,
/******************** Descriptor of Custom HID endpoints ******************/
/* 27 */
0x07, /* bLength: Endpoint Descriptor size */
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: = 5*/
0x82, /* bEndpointAddress: (IN) = 2*/
// bit 3...0 : the endpoint number
// bit 6...4 : reserved
// bit 7 : 0(OUT), 1(IN)
0x03, /* bmAttributes: Interrupt endpoint */ //160911 0-1bit定义了传输类型,00=控制,01=同步,10=批量,11=中断事务
//160911 00=Control, 01=Isochronous, 10=Bulk, 11=Interrupt Transaction
0x08, /* wMaxPacketSize: 64 40 Bytes max */
0x00, //High 8 bit of wMaxPacketSize
0x01, /* bInterval: Polling Interval (1 ms) */ //160911 Used in 01,03 Transaction
/* 34 */
0x07, /* bLength: Endpoint Descriptor size */
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: = 5*/
0x01, /* bEndpointAddress: (OUT) = 1*/
0x03, /* bmAttributes: Interrupt endpoint */ //160911 0-1bit定义了传输类型,00=控制,01=同步,10=批量,11=中断事务
//160911 00=Control, 01=Isochronous, 10=Bulk, 11=Interrupt Transaction
0x08, /* wMaxPacketSize: 64 40 Bytes max */
0x00, //High 8 bit of wMaxPacketSize
0x01, /* bInterval: Polling Interval (1 ms) */ //160911 Used in 01,03 Transaction
/* 41 */
#endif
} ;
加入
__ALIGN_BEGIN static uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
// 输入,第一个字节表示特殊功能键 LeftControl -- Right GUI
0x05, 0x07, // USAGE_PAGE (Keyboard/Keypad)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
// 输入,第二个字节是常值0,给OEM使用
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
// 输入,第三到8个字节,用来表示最多同时6个按键按下
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x25, 0xFF, // LOGICAL_MAXIMUM (255)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
// 输出,第一个字节前两位 分别表示两个LED灯状态
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x02, // REPORT_COUNT (2)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
上一篇:STM32 基础系列教程 25 - USB_HID_mouse
下一篇:STM32 基础系列教程 23 - USB_cdc
推荐阅读最新更新时间:2024-11-13 17:50
设计资源 培训 开发板 精华推荐
- 【RA】RA_MCU+677952A
- NCV7101 高端电流检测典型应用电路
- LTC2631 的典型应用 - 具有 10ppm/摄氏度基准的单个 12 位/10 位/8 位 I2C VOUT DAC
- powerbank_ip5306
- 使用 Analog Devices 的 LT1764ET-3.3 的参考设计
- SI1000DK,开发套件由主板和基于Si1004 8051 MCU的子卡组成
- EVAL-AD5668SDCZ,使用 AD5668 八进制、16 位、串行电压输出数模转换器的评估板
- 基于Z16F2811AL20SG MCU的Z16F2800100ZCOG、ZNEO Z16F系列开发套件
- LT1086CT-12 用于遥感的低压差正稳压器的典型应用
- LTC3615EUF 双通道 4MHz、3A 同步降压型 DC/DC 转换器的典型应用
- 吉时利DMM6500 6½ 位数字触摸屏万用表六大功能,满足工程师的切身需求,献给有梦想的你!
- 贸泽翻牌挑战赛—一键配齐的乐趣,它不香吗?快来参与贸泽翻牌挑战赛!
- 西门子电子书下载《PCB 制造流程 - 通过数字化转型进行优化》
- 【温故喝新之单片机版块】温2016年MCUs,喝2017年版块新篇章
- Intel有奖下载之七,礼品多多等你拿!
- 下载送好礼|人工智能物联网时代即将来临,您准备好了吗?
- ADI有奖下载活动之16 太阳能光伏逆变器解决方案
- 艾睿照明设计工具初体验:与LED设计的亲密接触!
- 点评下载资料,参加幸运抽奖,让我们迈开技术交流分享的步伐!!
- EEworld新春感恩回馈之ST新出道“高富帅”STM32F746G-DISCO 199元包邮