STM32-USB
+ -

STM32 USB Device Core函数总结

2022-07-11 786 2

包含三个文件:

  • usbd_core.c :初始化及设备状态请求回调
  • usbd_ioreq.c: API函数封装
  • usbd_req.c :USB标准请求(设备、接口、端点),是usbd_core中USBD_SetupStage函数的详细化

udbd_core.c

USB设备库的初始化函数以及相关的USB请求回调。

  • USBD_Init 初始化
  • USBD_DeInit 反初始化
  • USBD_RunTestMode 测试模式
  • USBD_SetCfg - 配置及接口
  • USBD_ClrCfg(Clear current configuration)
  • USBD_DevConnected 设备连接
  • USBD_DevDisconnected 设备断开
  • 回调函数
USBD_DCD_INT_cb_TypeDef USBD_DCD_INT_cb = 
{
  USBD_DataOutStage,//OUT
  USBD_DataInStage, //IN
  USBD_SetupStage,//SETUP
  USBD_SOF,
  USBD_Reset,
  USBD_Suspend,
  USBD_Resume,
  USBD_IsoINIncomplete,
  USBD_IsoOUTIncomplete,
#ifdef VBUS_SENSING_ENABLED
USBD_DevConnected, 
USBD_DevDisconnected,    
#endif  
};

USBD_DCD_INT_cb_TypeDef  *USBD_DCD_INT_fops = &USBD_DCD_INT_cb;

usbd_ioreq.c

IO requests APIs,封装API函数

  • USBD_CtlSendData
  • USBD_CtlContinueSendData
  • USBD_CtlPrepareRx 从控制端点接收数据
  • USBD_CtlContinueRx 继续 从控制端点接收数据
  • USBD_CtlSendStatus 控制端点0长度包
  • USBD_CtlReceiveStatus
  • USBD_GetRxCount 接收到的数据长度

usbd_req.c

USB标准请求的处理。

  • 发给设备的请求
USBD_Status  USBD_StdDevReq (USB_OTG_CORE_HANDLE  *pdev, USB_SETUP_REQ  *req)
{
  USBD_Status 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;
}
  • USBD_StdItfReq 处理发给接口的请求

    USBD_Status  USBD_StdItfReq (USB_OTG_CORE_HANDLE  *pdev, USB_SETUP_REQ  *req)
    {
    USBD_Status ret = USBD_OK; 
    
    switch (pdev->dev.device_status) 
    {
    case USB_OTG_CONFIGURED:
    
      if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM) 
      {
        pdev->dev.class_cb->Setup (pdev, req); 
    
        if((req->wLength == 0)&& (ret == USBD_OK))
        {
           USBD_CtlSendStatus(pdev);
        }
      } 
      else 
      {                                               
         USBD_CtlError(pdev , req);
      }
      break;
    
    default:
       USBD_CtlError(pdev , req);
      break;
    }
    return ret;
    }
    
  • 发给端点的请求

USBD_Status  USBD_StdEPReq (USB_OTG_CORE_HANDLE  *pdev, USB_SETUP_REQ  *req)
{

  uint8_t   ep_addr;
  USBD_Status ret = USBD_OK; 

  ep_addr  = LOBYTE(req->wIndex);   

  switch (req->bRequest) 
  {

  case USB_REQ_SET_FEATURE :

    switch (pdev->dev.device_status) 
    {
    case USB_OTG_ADDRESSED:          
      if ((ep_addr != 0x00) && (ep_addr != 0x80)) 
      {
        DCD_EP_Stall(pdev , ep_addr);
      }
      break;    

    case USB_OTG_CONFIGURED:   
      if (req->wValue == USB_FEATURE_EP_HALT)
      {
        if ((ep_addr != 0x00) && (ep_addr != 0x80)) 
        { 
          DCD_EP_Stall(pdev , ep_addr);

        }
      }
      pdev->dev.class_cb->Setup (pdev, req);   
      USBD_CtlSendStatus(pdev);

      break;

    default:                         
      USBD_CtlError(pdev , req);
      break;    
    }
    break;

  case USB_REQ_CLEAR_FEATURE :

    switch (pdev->dev.device_status) 
    {
    case USB_OTG_ADDRESSED:          
      if ((ep_addr != 0x00) && (ep_addr != 0x80)) 
      {
        DCD_EP_Stall(pdev , ep_addr);
      }
      break;    

    case USB_OTG_CONFIGURED:   
      if (req->wValue == USB_FEATURE_EP_HALT)
      {
        if ((ep_addr != 0x00) && (ep_addr != 0x80)) 
        {        
          DCD_EP_ClrStall(pdev , ep_addr);
          pdev->dev.class_cb->Setup (pdev, req);
        }
        USBD_CtlSendStatus(pdev);
      }
      break;

    default:                         
       USBD_CtlError(pdev , req);
      break;    
    }
    break;

  case USB_REQ_GET_STATUS:                  
    switch (pdev->dev.device_status) 
    {
    case USB_OTG_ADDRESSED:          
      if ((ep_addr != 0x00) && (ep_addr != 0x80)) 
      {
        DCD_EP_Stall(pdev , ep_addr);
      }
      break;    

    case USB_OTG_CONFIGURED:         


      if ((ep_addr & 0x80)== 0x80)
      {
        if(pdev->dev.in_ep[ep_addr & 0x7F].is_stall)
        {
          USBD_ep_status = 0x0001;     
        }
        else
        {
          USBD_ep_status = 0x0000;  
        }
      }
      else if ((ep_addr & 0x80)== 0x00)
      {
        if(pdev->dev.out_ep[ep_addr].is_stall)
        {
          USBD_ep_status = 0x0001;     
        }

        else 
        {
          USBD_ep_status = 0x0000;     
        }      
      }
      USBD_CtlSendData (pdev,
                        (uint8_t *)&USBD_ep_status,
                        2);
      break;

    default:                         
       USBD_CtlError(pdev , req);
      break;
    }
    break;

  default:
    break;
  }
  return ret;
}

函数关系调用图

点击图片放大
函数关系调用图

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

STM32F103 UVC设备源代码(模拟相机)
1.STM32F103 UVC设备源代码(模拟相机)https://pan.baidu.com/s/1treoRRxQndFoE0K8oRFndg 提取码:0jt3其它资料:1.各种工具1.USB协议分析工具https://pan.baidu.com/s/1DeXqRWsM7BOYTdrmIE8KB......
STM32 USB Audio 开发板
一、背景我个人从事音频行业有好几年的时间。后面慢慢的做起了声卡,也就是USB Audio。自己也走了不少的弯路。之前一起是拿开发板配套Demo去学习。但Demo离商用还是有点距离。要么就是不稳定要么就是功能不全面。我前面也写了篇文章关于stm32实现USB Audio的过程。因为是公司的代码。所以没......
STM32发送数据与接收到的数据长度不一致问题
群里一位同发提了一个问题,自己弄了一个USB HID游戏控制器,一次发送了7字节,不过通过BUSHOUND抓到只有5字节。还贴上了图。各位,请问一下我做的一个USBHID游戏控制器,一次发送的是7位数据,为什么BusHound上只接收到五位?由于没有显示长度,所以刚开始我还以为是BUSHOU......
USB全速STM32F407管脚初始化
STM32F407ZG的管脚PA11和PA12是一个复用功能引脚。其功能如下:管脚USBPA11OTG_FS_DM(D-)PA12OTG_FS_DP(D+)由于其内部D+有一个可配置上拉电阻,所以其硬件原图如下:故只需要分别将连接器P11的46管脚和35管脚短......
STM32F407 USB设备模块数据结构及初始化入口函数USBD_Init
本人以STM32F404自带的读卡器SLAVE代码为来解说。STM32F404支持OTG功能,其自带一个全速的USB功能。其USB初始化其实就是写相应的函数代码,这些函数代码却是通一个个的结构体整合起来成回调函数,这些函数是由我们自己写的。而STM32的库函数根据这些构体中的函数指针负责回调我们自......
STM32F407入口函数USBD_Init详解
从前面可知,USBD_Init是USB设备的初始化函数,这里USB后面的D是指DEVICE的意思。USBD_Init全代码为:void USBD_Init(USB_OTG_CORE_HANDLE *pdev, USB_OTG_CORE_ID_TypeDef core......
STM32F407的USB用户回调函数USBD_Usr_cb_TypeDef
前面了解过USBD_Usr_cb_TypeDef结构体中是用户的回调函数。用户的回调函数位于usbd_user.c文件中。typedef struct _USBD_USR_PROP{ void (*Init)(void); void (*DeviceReset)(uint8_t s......
STM32F407的USB获取描述符请求回调函数USBD_DEVICE
STM32F407的USB获取描述符请求回调函数使用结构体USBD_DEVICE来整合。typedef struct _Device_TypeDef{ uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length); ......
STM32F407的USB类请求回调函数USBD_Class_cb_TypeDef
前面介绍了获取描述会和USB设备状态的回调函数,这里界绍USB在实际使用过程中的USB请求通讯。这里还是以STM32F407的U盘为示例来说明。STM32F407的USB类请求使用结构体USBD_Class_cb_TypeDef来整合回调函数。typedef struct _Device_cb......
嵌入式STM32常用USB术语
术语解释AHBAMBA High-performance BusAMBAAdvanced Microcontroller Bus ArchitectureCDCCommunication Device ClassDCDDevice Core Driver......
STM32 USB Device Core函数总结
包含三个文件:usbd_core.c :初始化及设备状态请求回调usbd_ioreq.c: API函数封装usbd_req.c :USB标准请求(设备、接口、端点),是usbd_core中USBD_SetupStage函数的详细化udbd_core.cUSB设备库的初始化函数以及相关的USB请......
STM32 USB_OTG_Driver函数总结
USB_OTG_Driver目录下的文件有:usb_bsp_template.c :与硬件初始化相关的空模板usb_core.c :比较底层USB函数usb_dcd.c:USB作为设备时需要的API函数usb_dcd_int.c :作为设备时的中断处理usb_hcd.c :USB作为主机时的AP......
STM32 USB-HID设备示例及工程结构
STM32 USB-HID设备工程结构对于HID示例工程,其代码数据结构如下:APPapp.c :main函数stm32fxxx_it.c :STM32中断usb_bsp.c :平台硬件相关的。主要是USB_OTG_BSP_Init和USB_OTG_BSP_EnableInterruptus......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!