STM32-USB
+ -

STM32F407入口函数USBD_Init详解

2022-06-14 869 2

从前面可知,USBD_Init是USB设备的初始化函数,这里USB后面的D是指DEVICE的意思。

USBD_Init全代码为:

void USBD_Init(USB_OTG_CORE_HANDLE *pdev,
               USB_OTG_CORE_ID_TypeDef coreID,
               USBD_DEVICE *pDevice,                  
               USBD_Class_cb_TypeDef *class_cb, 
               USBD_Usr_cb_TypeDef *usr_cb)
{
  /* Hardware Init */
  USB_OTG_BSP_Init(pdev);  

  USBD_DeInit(pdev);

  /*Register class and user callbacks */
  pdev->dev.class_cb = class_cb;
  pdev->dev.usr_cb = usr_cb;  
  pdev->dev.usr_device = pDevice;    

  /* set USB OTG core params */
  DCD_Init(pdev , coreID);

  /* Upon Init call usr callback */
  pdev->dev.usr_cb->Init();

  /* Enable Interrupts */
  USB_OTG_BSP_EnableInterrupt(pdev);
}

第一步为初始化STM32F407对应的管脚PA11和PA12,详见:http://www.usbzh.com/article/detail-1064.html
不过前面的文章有少说了一步就是对PA15置1.

//USB主机电源控制接口
#define USB_HOST_PWRCTRL     PAout(15)    //PA15

USB_HOST_PWRCTRL=1;

其原理图如下:
USB HOST电源管理
可以看到,这里用到了场效率管MOSFET,其型号为SI2301,这是一个P沟通的MOSFET.
P沟通的MOSFET
所以,S一直为高电平,当G为低电平时MOSFET导通给D极电泊输出,不过G为低电平的前提是三级管导通,故USB_PWR为高电时,也即PA15输出为高电平。

模电快忘光了,还给王应吉老师了,不知道分析的对不对。

第二步为USBD_DeInit,是个空函数,应该给用户软件层初始化用。

  /*Register class and user callbacks */
  pdev->dev.class_cb = class_cb;
  pdev->dev.usr_cb = usr_cb;  
  pdev->dev.usr_device = pDevice;

后面就是三个结构体的指针赋值,就是回调函数。前面有说过。详见:http://www.usbzh.com/article/detail-1065.html

再就是DCD_Init调用,这是对设备状态、端点参数的默认初始化,根据配置对寄存器、工作模式写入等与硬件相关的。


void DCD_Init(USB_OTG_CORE_HANDLE *pdev , 
              USB_OTG_CORE_ID_TypeDef coreID)
{
  uint32_t i;
  USB_OTG_EP *ep;

//根据配置的工作模式实始化USB参数,如端点数量,FIFO大小等。
  USB_OTG_SelectCore (pdev , coreID);

  pdev->dev.device_status = USB_OTG_DEFAULT;
  pdev->dev.device_address = 0;

  /* Init ep structure */
  for (i = 0; i < pdev->cfg.dev_endpoints ; i++)
  {
    ep = &pdev->dev.in_ep[i];
    /* Init ep structure */
    ep->is_in = 1;
    ep->num = i;
    ep->tx_fifo_num = i;
    /* Control until ep is actvated */
    ep->type = EP_TYPE_CTRL;
    ep->maxpacket =  USB_OTG_MAX_EP0_SIZE;
    ep->xfer_buff = 0;
    ep->xfer_len = 0;
  }

  for (i = 0; i < pdev->cfg.dev_endpoints; i++)
  {
    ep = &pdev->dev.out_ep[i];
    /* Init ep structure */
    ep->is_in = 0;
    ep->num = i;
    ep->tx_fifo_num = i;
    /* Control until ep is activated */
    ep->type = EP_TYPE_CTRL;
    ep->maxpacket = USB_OTG_MAX_EP0_SIZE;
    ep->xfer_buff = 0;
    ep->xfer_len = 0;
  }

/* disable USB Global interrupt */
  USB_OTG_DisableGlobalInt(pdev);

  /*Init the Core (common init.) */
  USB_OTG_CoreInit(pdev);


  /* Force Device Mode*/
  USB_OTG_SetCurrentMode(pdev, DEVICE_MODE);

  /* Init Device */
  USB_OTG_CoreInitDev(pdev);


  /* Enable USB Global interrupt */
  USB_OTG_EnableGlobalInt(pdev);
}

调用初始化回调函数。

  /* Upon Init call usr callback */
  pdev->dev.usr_cb->Init();

最后就是USB中断NVIC的配置。

  /* Enable Interrupts */
  USB_OTG_BSP_EnableInterrupt(pdev);

void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
{
    NVIC_InitTypeDef   NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//ÇÀÕ¼ÓÅÏȼ¶0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;//×ÓÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//ʹÄÜͨµÀ
    NVIC_Init(&NVIC_InitStructure);//ÅäÖÃ  
}
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......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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