USB -- STM32F103 USB DFU设备固件升级(IAP)控制传输讲解(六)

本文围绕STM32的USB DFU应用展开,先介绍USB各类描述符,如设备、配置等描述符;接着讲解DFU基本命令及解析;然后对关键函数,像接口、GPIO配置等函数进行说明;最后给出代码演示,包括修改按键IO口、准备APP工程文件等步骤。

目录

链接快速定位

前沿

1 描述符讲解

1.1 设备描述符

1.2 配置描述符

1.3 接口描述符

1.4 功能描述符

1.5 端点描述符

1.6 字符串描述符

2 基本命令简介

2.1 DFU基本命令

2.2 命令解析

3 关键函数讲解

3.1 接口函数讲解

3.1.1 初始化函数讲解

3.1.2 擦除函数讲解

3.1.3 读函数讲解

3.1.4 写函数讲解

3.1.5 获取状态函数讲解

3.2 GPIO配置讲解

3.3 中断函数讲解--USB复位函数讲解

3.4 主函数讲解

4 代码演示

4.1 修改按键IO口

4.2 准备APP工程文件

4.3 下载DFU上位机软件

4.4 运行演示


链接快速定位

USB -- 初识USB协议(一)

源码下载请参考链接:USB -- STM32-FS-USB-Device驱动代码简述(二)

USB -- STM32F103虚拟串口bulk传输讲解(三)

USB -- STM32F103自定义HID设备及HID上位机中断传输讲解(四)

USB -- STM32F103 U盘(MassStorage)SDIO接口SCSI协议Bulk传输讲解(五)

DFU数据手册

DFU工具下载

前沿

        前面两节主要是对USB的基本概念做了简单讲解,学习USB的最本质目的还是要回到USB的应用方向,接下来的几章主要讲解USB的各类应用,包括:

        主要还是带领大家找相关的资料及相关的工具和代码。

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
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冰糖葫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值