STM32 USB学习条记8

2018-09-14来源: eefocus 要害字:STM32   USB学习

主机情况:Windows 7 SP1

开发情况:MDK5.14

目标板:STM32F103C8T6

开发库:STM32F1Cube库和STM32_USB_Device_Library

现在分析USB器件库焦点文件的最后一个文件usbd_ctlreq,该文件提供了尺度请求的处置惩罚,跟USB2.0协议的第九章节紧密关联。在Setup阶段凭据bmRequest字段的内容分为:设备请求、接口请求、端点请求。并凭据差异的请求调用差异的函数体,USB2.0协议中界说的标清请求有以下几种

通过第一个竖栏可以看出同一个请求代码可以对应多个接收者,例如CLEAR_FEATURE请求可以是设备请求也可以是接口请求,同样也可以是端点请求。对应的各个请求代码,如下

在usbd_def.h文件中可以找到与之对应的界说,如下:



#define  USB_REQ_GET_STATUS                             0x00

#define  USB_REQ_CLEAR_FEATURE                          0x01

#define  USB_REQ_SET_FEATURE                            0x03

#define  USB_REQ_SET_ADDRESS                            0x05

#define  USB_REQ_GET_DESCRIPTOR                         0x06

#define  USB_REQ_SET_DESCRIPTOR                         0x07

#define  USB_REQ_GET_CONFIGURATION                      0x08

#define  USB_REQ_SET_CONFIGURATION                      0x09

#define  USB_REQ_GET_INTERFACE                          0x0A

#define  USB_REQ_SET_INTERFACE                          0x0B

#define  USB_REQ_SYNCH_FRAME                            0x0C

首先看一下尺度设备请求的处置惩罚,

/**

* @brief  USBD_StdDevReq

*         Handle standard usb device requests

* @param  pdev: device instance

* @param  req: usb request

* @retval status

*/

USBD_StatusTypeDef  USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef  *req)

{

  USBD_StatusTypeDef ret = USBD_OK;  

  

  switch (req->bRequest) 

  {

  case USB_REQ_GET_DESCRIPTOR: 

    

    USBD_GetDescriptor (pdev, req) ;

    break;

    

  case USB_REQ_SET_ADDRESS:                      

    USBD_SetAddress(pdev, req);

    break;

    

  case USB_REQ_SET_CONFIGURATION:                    

    USBD_SetConfig (pdev , req);

    break;

    

  case USB_REQ_GET_CONFIGURATION:                 

    USBD_GetConfig (pdev , req);

    break;

    

  case USB_REQ_GET_STATUS:                                  

    USBD_GetStatus (pdev , req);

    break;

    

    

  case USB_REQ_SET_FEATURE:   

    USBD_SetFeature (pdev , req);    

    break;

    

  case USB_REQ_CLEAR_FEATURE:                                   

    USBD_ClrFeature (pdev , req);

    break;

    

  default:  

    USBD_CtlError(pdev , req);

    break;

  }

  

  return ret;

}

切合尺度的设备请求通过Table 9-3可以看出一共有8种,这里只处置惩罚了7种,SET_DESCRIPTOR是没有处置惩罚的,当请求不是这7种请求的任何一种时通过USBD_CtlError()函数回应给USB主机一个STALL讲明请求错误发生。首先看第一个请求获取描述符请求的处置惩罚,如下:


/**

* @brief  USBD_GetDescriptor

*         Handle Get Descriptor requests

* @param  pdev: device instance

* @param  req: usb request

* @retval status

*/

static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , 

                               USBD_SetupReqTypedef *req)

{

  uint16_t len;

  uint8_t *pbuf;

  

    

  switch (req->wValue >> 8)

  { 

#if (USBD_LPM_ENABLED == 1)

  case USB_DESC_TYPE_BOS:

    pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len);

    break;

#endif    

  case USB_DESC_TYPE_DEVICE:

    pbuf = pdev->pDesc->GetDeviceDescriptor(pdev->dev_speed, &len);

    break;

    

  case USB_DESC_TYPE_CONFIGURATION:     

    if(pdev->dev_speed == USBD_SPEED_HIGH )   

    {

      pbuf   = (uint8_t *)pdev->pClass->GetHSConfigDescriptor(&len);

      pbuf[1] = USB_DESC_TYPE_CONFIGURATION;

    }

    else

    {

      pbuf   = (uint8_t *)pdev->pClass->GetFSConfigDescriptor(&len);

      pbuf[1] = USB_DESC_TYPE_CONFIGURATION;

    }

    break;

    

  case USB_DESC_TYPE_STRING:

    switch ((uint8_t)(req->wValue))

    {

    case USBD_IDX_LANGID_STR:

     pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len);        

      break;

      

    case USBD_IDX_MFC_STR:

      pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len);

      break;

      

    case USBD_IDX_PRODUCT_STR:

      pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len);

      break;

      

    case USBD_IDX_SERIAL_STR:

      pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len);

      break;

      

    case USBD_IDX_CONFIG_STR:

      pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len);

      break;

      

    case USBD_IDX_INTERFACE_STR:

      pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len);

      break;

      

    default:

#if (USBD_SUPPORT_USER_STRING == 1)

      pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue) , &len);

      break;

#else      

       USBD_CtlError(pdev , req);

      return;

#endif   

    }

    break;

  case USB_DESC_TYPE_DEVICE_QUALIFIER:                   

 

    if(pdev->dev_speed == USBD_SPEED_HIGH  )   

    {

      pbuf   = (uint8_t *)pdev->pClass->GetDeviceQualifierDescriptor(&len);

      break;

    }

    else

    {

      USBD_CtlError(pdev , req);

      return;

    } 

 

  case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION:

    if(pdev->dev_speed == USBD_SPEED_HIGH  )   

    {

      pbuf   = (uint8_t *)pdev->pClass->GetOtherSpeedConfigDescriptor(&len);

      pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION;

      break; 

    }

    else

    {

      USBD_CtlError(pdev , req);

      return;

    }

 

  default: 

     USBD_CtlError(pdev , req);

    return;

  }

  

  if((len != 0)&& (req->wLength != 0))

  {

    

    len = MIN(len , req->wLength);

    

    USBD_CtlSendData (pdev, 

                      pbuf,

                      len);

  }

  

}

也是一大串switch-case语句,这样的代码虽然多但容易分析,在GET_DESCRIPTOR请求中,凭据Table 9-3可知wValue字段的寄义是描述符类型和描述符索引,在USB2.0协议的9.4.3章节中可以看到wValue的高字节标志了描述符的类型,wValue的低字节标志了描述符的索引。在USBD_GetDescriptor()函数中首先是检测描述符类型,第一个分支是设备描述符,通过pdev句柄的pDesc指针下的GetDeviceDescriptor指针调用所需要的函数即我们之前分析过的usbd_desc.c文件中的对应函数。第二个分支是获取配置描述符,这个是通过设备类指针获取的,放在后面分析,且这里分出了高速和全速模式。接着一个大分支是获取字符串描述符,这里就需要用到wValue的低字节描述符索引来细分各个字符串描述符,获取字符串描述符的处置惩罚跟获取设备描述符类似,不再赘述,索引号错误返回请求错误状态。DEVI

[1] [2] [3] [4]

要害字:STM32   USB学习

编辑:什么鱼 引用地址:/mcu/2018/ic-news091441326.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站接纳的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜果真自由流传,或不应无偿使用,请实时通过电子邮件或电话通知我们,以迅速接纳适当措施,制止给双方造成不须要的经济损失。

上一篇:STM32 USB 之从0开始移植条记
下一篇:最后一页

关注亿博娱乐注册民众号 快捷获取更多信息
关注亿博娱乐注册民众号
快捷获取更多信息
关注亿博娱乐注册服务号 享受更多官方福利
关注亿博娱乐注册服务号
享受更多官方福利

推荐阅读

STM32F10X的USB固件库说明

。3)、usb_sil.c,本文件包罗精简接口的初始化或向端点读写的操作函数。上层1)、usb_pwr.c,该文件中包罗处置惩罚上电、掉电、挂起和恢复事件的函数。2)、usb_istr.c,该文件中只有一个函数,即USB中断的USB_Istr函数,该函数对种种引起USB中断的事件做轮询处置惩罚。3)、usb_desc.c,该文件包罗一些与USB相关的设备描述符、配置描述符等,以数组形式存储,在USB主机请求的时候这些信息将发送给主机。5)、usb_prop.c,该文件用于实现相关设备的USB协议,如初始化、SETUP包、IN包、OUT包等。6)、usb_endp.c,本文件包罗端点收、发送的处置惩罚函数,由用户凭据差异的USB设备进行差异的界说。 
发表于 2018-09-14

STM32 USB OTG官方库移植

口。确认硬件完毕后,需要确认所需使用的晶振,外部内部均可。STM32F2为例,HSI为16M。则可以直接用HSI来配置 配置出48M的晶振供应USB。此配置可接纳ST官方的配置工具来完成,操作轻便 ,将配置生成的system_stm32f2xx.c与工程中的替换即可。时钟确认完毕,接下来需要对USB库进行配置。USB库中有许多例程,此处我是做USB升级方案,则有两种,一种是DFU升级模式,需要配合官方给的DFU Demo上位机软件来使用,第二种是MSC模式,读取U盘。库做的很完善,FATFS已经写进例程。配置主要看是USB_HOST照旧USB_DEV抑或是OTG双向模式。目前没有用到双向模式。模式配置需要在usb_conf.h中修改
发表于 2018-09-14

STM8学习条记---串口uart1

使用uart1串口,需要用到stm8s_uart1.c和stm8s_uart1.h两个文件1、建设工程目录结构如下:2、编写uart.h文件如下:#ifndef __UART_H#define __UART_H#include "stm8s.h"#include "stm8s_clk.h"void USART_Configuration(void);   //串口配置函数void UART_send_string(uint8_t *Buffer);//发送一个字符串函数#endif /* __UART_H */3、编写uart.c文件如下:#include "
发表于 2018-09-13

STM32 GPIO——流水灯例程 学习总结

通过控制LED灯,熟悉STM32的存储器结构、地址映射、时钟树、库文件、利用库的要领及开发工程的步骤,建设STM32的开发思想。这是我建设的第一个工程,由于涉及面较广,知识点疏散,在此做一个总结。1)为控制LED灯,知道要使用GPIO外设。GPIO(General-Purpose I/O):I/O引脚可以被软件设置成种种差异的功效,如输入或输出。控制LED灯,即控制STM32芯片的I/O引脚电平的崎岖来实现。2)了解GPIO外设有什么功效,要如何使用。GPIO引脚又被分为GPIOA、GPIOB、...、GPIOG差异的组,每组端口分为0~15共16个差异的引脚,对于差异型号的芯片,端口的组和引脚的数量差异。功效检察参考手册3)获知
发表于 2018-09-13

STM32F103C8T6-LED点亮法式

#include <stm32f10x.h> //----------------------------------------------------------------------------- void mydelay_ms(int ms){    volatile int  i;    int k = ms * 2333 ;    for ( i=0; i<k; i++ ) {        ;   
发表于 2018-09-13

STM32F0在IAR新建工程

1、到官网下载固件库,类似"STM32F0xx_StdPeriph_Lib_V1.5.0",解压获得文件"_htmresc"  "Libraries"  "Projects"   "Utilities".     ①“Libraries\STM32F0xx_StdPeriph_Driver”下的inc与src是底层驱动。     ②“Libraries\CMSIS\Device\ST\STM32F0xx\Source\Templates\iar
发表于 2018-09-13
热门资源推荐
更多
  •  rar文件基于2148的usb例程
  •  pdf文件圈圈教你玩USB
  •  rar文件ARM STM32F103RBT6 循迹 小车 TCRT5000 三探头 C代码
  •  rar文件野火stm32-ST库的源码
  •  汽车电子嵌入式系统简介
  •  运算放大器应用技术手册
  •  CAN总线技术在设备故障诊断系统中的应用
  •  开关电源变换:设计和分析

小广播

热门运动
换一批
更多

【泰有聊】第二期:泰克CEO为你解读低噪声背后的科学

最新视频课程更多

 SimpleLink 系列产物的宁静性介绍
SimpleLink 系列产物的宁静性介绍
基于 TI MSP430 Scan Interface?技术的流量表解决方案
基于 TI MSP430 Scan Interface?技术的流量表解决方案
2018 TI SimpleLink? MCU 平台研讨会 - 回看
2018 TI SimpleLink? MCU 平台研讨会 - 回看
Simplelink 无线连接平台介绍
Simplelink 无线连接平台介绍
十天学会PIC单片机
十天学会PIC单片机

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广事情。

更多相关热搜器件

  •  DSC1001CI2-066.6660T
  •  TC-74250MDD-T
  •  8N4QV01KG-1036CDI8
  •  EC2725TS-32000M-TR
  •  SIT9001AC-13-25E1-1474560Y
  •  MC9S12P96CFT
  •  ASTMUPCD-33-3.6864MHz-EJ-E-T
  •  536BB150M000DG
  •  SIT9001AC-44-25E2-8.00000Y
  •  HC49US-49.152MABJB
亿博娱乐平台版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright ? 2005-2018 EEWORLD.com.cn, Inc. All rights reserved