目录
链接快速定位
源码下载请参考链接:USB -- STM32-FS-USB-Device驱动代码简述(二)
USB -- STM32F103虚拟串口bulk传输讲解(三)
USB -- STM32F103自定义HID设备及HID上位机中断传输讲解(四)
USB -- STM32F103 U盘(MassStorage)SDIO接口SCSI协议Bulk传输讲解(五)
前沿
前面两节主要是对USB的基本概念做了简单讲解,学习USB的最本质目的还是要回到USB的应用方向,接下来的几章主要讲解USB的各类应用,包括:
- 虚拟串口(环回测试)-- bulk传输(USB -- STM32F103虚拟串口bulk传输讲解(三))
- 自定义HID -- 中断传输(USB -- STM32F103自定义HID设备及HID上位机中断传输讲解(四))
- U盘 -- bulk传输(USB -- STM32F103 U盘(MassStorage)SDIO接口SCSI协议Bulk传输讲解(五))
- 在线固件升级(DFU)-- 控制传输(本章讲解)
- 语音录制及播放 -- 同步传输
- 照相机 -- 同步传输
- 复合设备 -- 中断+bulk传输
主要还是带领大家找相关的资料及相关的工具和代码。
1 描述符讲解
描述符是USB能够正常通信的前提,没有描述符,USB就不知道当前是什么样的设备,所以描述符在USB整个通信过程中占有十分重要的地位,所以这里重点讲解一下USB的各类描述符。
ST的例程为我们配置好了应用的描述符,我们不需要关注也能正常运行程序,但是我们这里讲解一下怎么通过查找资料来知道具体描述符的含义。
1.1 设备描述符
以下是STM32F103系列的DFU的设备描述符代码(每个字节对应的含义可以在USB -- 初识USB协议(一)中查看):
uint8_t DFU_DeviceDescriptor[DFU_SIZ_DEVICE_DESC] =
{
0x12, /* bLength */
0x01, /* bDescriptorType */
0x00, /* bcdUSB, version 1.00 */
0x01,
0x00, /* bDeviceClass : See interface */
0x00, /* bDeviceSubClass : See interface*/
0x00, /* bDeviceProtocol : See interface */
bMaxPacketSize0, /* bMaxPacketSize0 0x40 = 64 */
0x83, /* idVendor (0483) */
0x04,
0x11, /* idProduct (0xDF11) DFU PiD*/
0xDF,
0x00, /* bcdDevice*/
0x02,
0x01, /* iManufacturer : index of string Manufacturer */
0x02, /* iProduct : index of string descriptor of product*/
0x03, /* iSerialNumber : index of string serial number*/
0x01 /*bNumConfigurations */
};
设备描述符顾名思义就是描述USB设备的基本信息,主要包括以下信息:
- USB版本号
- USB设备类型
- USB设备协议
- 端点0最大传输大小(最大64byte)
- 厂商向USBIF申请的VID(需付费,由芯片厂商提供)
- 设备PID(厂商自定义)
- 制造商的字符串描述符索引(描述生产这个产品的厂商)
- 产品的字符串描述符索引(描述是什么产品)
- 设备序号的字符串描述符索引(主要是芯片的UID)
- 配置的数量(一般为1)
设备类型可以通过USB官网Class查询,我们这里是DFU设备,所以bDeviceClass=0xEF,bDeviceSubClass=0x01,bDeviceProtocol=0x01。
但实际这里的bDeviceClass=0x00,是因为0x00表示class可以在接口与描述符中定义。

制造商的字符串描述符索引、产品的字符串描述符索引和设备序号的字符串描述符索引主要是制造商、产品和设备序列号在字符串描述符的索引位置。
比如这里举个例子,以下三个是字符串描述符,分别是制造商描述符、产品描述符和序列号描述符:
uint8_t DFU_StringVendor[DFU_SIZ_STRING_VENDOR] =
{
DFU_SIZ_STRING_VENDOR,
0x03,
/* Manufacturer: "STMicroelectronics" */
'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,
'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,
'c', 0, 's', 0
};
uint8_t DFU_StringProduct[DFU_SIZ_STRING_PRODUCT] =
{
DFU_SIZ_STRING_PRODUCT,
0x03,
/* Product name: "STM32 DFU" */
'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0, 'D', 0, 'F', 0, 'U', 0
};
uint8_t DFU_StringSerial[DFU_SIZ_STRING_SERIAL] =
{
DFU_SIZ_STRING_SERIAL,
0x03,
/* Serial number */
'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0
};
由下面代码可知,他们的位置也是根据索引号排列的,所以主机请求index为1的描述符,那么设备就发送制造商描述符给主机,告诉主机USB的制造商是什么。
#ifdef USE_STM3210E_EVAL
ONE_DESCRIPTOR DFU_String_Descriptor[7] =
#elif defined(USE_STM3210B_EVAL)
ONE_DESCRIPTOR DFU_String_Descriptor[6] =
#elif defined(USE_STM32L152_EVAL) || defined(USE_STM32L152D_EVAL) ||defined(USE_STM32373C_EVAL) ||defined(USE_STM32303C_EVAL) ||defined(USE_NUCLEO)
ONE_DESCRIPTOR DFU_String_Descriptor[5] =
#endif /* USE_STM3210E_EVAL */
{
{ (uint8_t*)DFU_StringLangId, DFU_SIZ_STRING_LANGID },
{ (uint8_t*)DFU_StringVendor, DFU_SIZ_STRING_VENDOR },
{ (uint8_t*)DFU_StringProduct, DFU_SIZ_STRING_PRODUCT },
{ (uint8_t*)DFU_StringSerial, DFU_SIZ_STRING_SERIAL },
{ (uint8_t*)DFU_StringInterface0, DFU_SIZ_STRING_INTERFACE0 }
#ifdef USE_STM3210B_EVAL
,
{ (uint8_t*)DFU_StringInterface1, DFU_SIZ_STRING_INTERFACE1 }
#endif /* USE_STM3210B_EVAL */
#ifdef USE_STM3210E_EVAL
,
{ (uint8_t*)DFU_StringInterface1, DFU_SIZ_STR

本文围绕STM32的USB DFU应用展开,先介绍USB各类描述符,如设备、配置等描述符;接着讲解DFU基本命令及解析;然后对关键函数,像接口、GPIO配置等函数进行说明;最后给出代码演示,包括修改按键IO口、准备APP工程文件等步骤。
控制传输讲解(六)&spm=1001.2101.3001.5002&articleId=135139801&d=1&t=3&u=bdc8509355ab45c29c1d650a04cf4d02)
4811

被折叠的 条评论
为什么被折叠?



