STM32 USB学习条记6

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

主机情况:Windows 7 SP1

开发情况:MDK5.14

目标板:STM32F103C8T6

开发库:STM32F1Cube库和STM32_USB_Device_Library

现在来分析哈USB器件库代码,先来看usbd_core文件,其头文件只有一些函数声明,没啥可说的,只有一点,之前分析usbd_conf.c文件时里面USB中断回调函数中调用的底层接口都是在usbd_core.h文件中声明的,同样由用户实现的底层接口也是在该文件中声明的,在usbd_core.c文件中实现,该文件是很重要的一个文件,因为所有上层操作最终都市调用该文件中的API来实现。在器件库文档中提到了焦点库的作用,如下:

第一个分析的函数是USB栈的初始化以及重新初始化,如下:

/**

* @brief  USBD_Init

*         Initializes the device stack and load the class driver

* @param  pdev: device instance

* @param  pdesc: Descriptor structure address

* @param  id: Low level core index

* @retval None

*/

USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id)

{

  /* Check whether the USB Host handle is valid */

  if(pdev == NULL)

  {

    USBD_ErrLog("Invalid Device handle");

    return USBD_FAIL; 

  }

  

  /* Unlink previous class*/

  if(pdev->pClass != NULL)

  {

    pdev->pClass = NULL;

  }

  

  /* Assign USBD Descriptors */

  if(pdesc != NULL)

  {

    pdev->pDesc = pdesc;

  }

  

  /* Set Device initial State */

  pdev->dev_state  = USBD_STATE_DEFAULT;

  pdev->id = id;

  /* Initialize low level driver */

  USBD_LL_Init(pdev);

  

  return USBD_OK; 

}

 

/**

* @brief  USBD_DeInit 

*         Re-Initialize th device library

* @param  pdev: device instance

* @retval status: status

*/

USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev)

{

  /* Set Default State */

  pdev->dev_state  = USBD_STATE_DEFAULT;

  

  /* Free Class Resources */

  pdev->pClass->DeInit(pdev, pdev->dev_config);  

  

    /* Stop the low level driver  */

  USBD_LL_Stop(pdev); 

  

  /* Initialize low level driver */

  USBD_LL_DeInit(pdev);

  

  return USBD_OK;

}

USB初始化函数很简朴,将USB句柄的设备类指针置NULL,同时将USB的描述符加载上去,将USB设备状态置为默认状态,该函数里面的id目前不清楚是作何用,最后调用USB_LL_Init()函数来初始化底层驱动。USB器件库中USB设备有四种状态,界说在usbd_def.h文件中,如下:


/*  Device Status */

#define USBD_STATE_DEFAULT                                1

#define USBD_STATE_ADDRESSED                              2

#define USBD_STATE_CONFIGURED                             3

#define USBD_STATE_SUSPENDED                              4

默认状态、地址状态、配置状态、挂起状态。在USB2.0协议文档的第9章节中划定了USB设备的6种状态:连接状态、上电状态、默认状态、地址状态、配置状态、挂起状态,六者之间的关系图如下所示:


在USB库中是省略了连接和上电两个状态,剩下四种状态的说明可以在USB2.0协议的第九章节找到,由此可以看出USB2.0协议中第九章节有多重要了。在USB分配地址之前其使用默认地址,处在默认状态下的USB设备不能响应正常的请求,当USB设备分配了唯一的地址后即进入地址状态,响应正常请求,USB设备配置完成后进入配置状态,USB设备在指定时间长度内没有检测到总线通信时会进入挂起状态,但会保持任何内部状态,包罗地址和配置。在USB重新初始化函数中,需要释放类资源,且停止USB底层驱动,重新初始化底层驱动。接着是注册类函数:



/**

  * @brief  USBD_RegisterClass 

  *         Link class driver to Device Core.

  * @param  pDevice : Device Handle

  * @param  pclass: Class handle

  * @retval USBD Status

  */

USBD_StatusTypeDef  USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass)

{

  USBD_StatusTypeDef   status = USBD_OK;

  if(pclass != 0)

  {

    /* link the class to the USB Device handle */

    pdev->pClass = pclass;

    status = USBD_OK;

  }

  else

  {

    USBD_ErrLog("Invalid Class handle");

    status = USBD_FAIL; 

  }

  

  return status;

}

注册设备类函数也很简朴,把设备类指针通报给USB设备句柄即可,通过指针USB句柄包罗了我们所用的所有资源,接着来看USB的一些基本操作,如下:


/**

  * @brief  USBD_Start 

  *         Start the USB Device Core.

  * @param  pdev: Device Handle

  * @retval USBD Status

  */

USBD_StatusTypeDef  USBD_Start  (USBD_HandleTypeDef *pdev)

{

  

  /* Start the low level driver  */

  USBD_LL_Start(pdev); 

  

  return USBD_OK;  

}

 

/**

  * @brief  USBD_Stop 

  *         Stop the USB Device Core.

  * @param  pdev: Device Handle

  * @retval USBD Status

  */

USBD_StatusTypeDef  USBD_Stop   (USBD_HandleTypeDef *pdev)

{

  /* Free Class Resources */

  pdev->pClass->DeInit(pdev, pdev->dev_config);  

 

  /* Stop the low level driver  */

  USBD_LL_Stop(pdev); 

  

  return USBD_OK;  

}

 

/**

* @brief  USBD_RunTestMode 

*         Launch test mode process

* @param  pdev: device instance

* @retval status

*/

USBD_StatusTypeDef  USBD_RunTestMode (USBD_HandleTypeDef  *pdev) 

{

  return USBD_OK;

}

 

 

/**

* @brief  USBD_SetClassConfig 

*        Configure device and start the interface

* @param  pdev: device instance

* @param  cfgidx: configuration index

* @retval status

*/

 

USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef  *pdev, uint8_t cfgidx)

{

  USBD_StatusTypeDef   ret = USBD_FAIL;

  

  if(pdev->pClass != NULL)

  {

    /* Set configuration  and Start the Class*/

    if(pdev->pClass->Init(pdev, cfgidx) == 0)

    {

      ret = USBD_OK;

    }

  }

  return ret; 

}

 

/**

* @brief  USBD_ClrClassConfig 

*         Clear current configuration

* @param  pdev: device instance

* @param  cfgidx: configuration index

* @retval status: USBD_StatusTypeDef

*/

USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef  *pdev, uint8_t cfgidx)

{

  /* Clear configuration  and De-initialize the Class process*/

  pdev->pClass->DeInit(pdev, cfgidx);  

  return USBD_OK;

}

 

/**

* @brief  USBD_LL_Reset 

*         Handle Reset event

* @param  pdev: device instance

* @retval status

*/

USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef  *pdev, USBD_SpeedTypeDef speed)

{

  pdev->dev_speed = speed;

  return USBD_OK;

}

其中USBD_Start和USBD_Stop跟USBD的初始化类似都是调用usbd_conf中的底层基本操作,USBD_RunTestMode()函数为空,讲明不支持测试模式,测试模式在USB2.0协议文档有提及,既然这里不支持就么有去细研究该功效。另外两个函数USBD_SetClassConfig()、USBD_ClrClassConfig()函数则是跟USB设备类相关,这里我们还没有分析到USB设备类中,所以也略过,知道其功效即可。最后有一个USBD_LL_SetSpeed()函数,USB通信有三种通信速度:低速、全速、高速,STM32F103C8T6支持全速模式,USB速度的界说如下:

/* Following USB Device Speed */

typedef enum 

{

  USBD_SPEED_HIGH  = 0,

  USBD_SPEED_FULL  = 1,

  USBD_SPEED_LOW   = 2,  

}USBD_SpeedTypeDef;

usbd_core.c中剩下的一些函数体则是在usbd_conf.cUSB中断回调函数中调用的USB通信处置惩罚的真正实现者,如下:

/**

* @brief  USBD_SetupStage 

*         Handle the setup stage

* @param  pdev: device instance

* @retval status

*/

USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup)

{

 

  USBD_ParseSetupRequest(&pdev->request, psetup);

  

  pdev->ep0_state = USBD_EP0_SETUP;

  pdev->ep0_data_len = pdev->request.wLength;

  

  switch (pdev->request.bmRequest & 0x1F) 

  {

  case USB_REQ_RECIPIENT_DEVICE:   

    USBD_StdDevReq (pdev, &pdev->request);

    break;

    

  case USB_REQ_RECIPIENT_INTERFACE:     

    USBD_StdItfReq(pdev, &pdev->request);

    break;

    

  case USB_REQ_RECIPIENT_ENDPOINT:        

    USBD_StdEPReq(pdev, &pdev->request);   

    break;

    

  default:           

    USBD_LL_StallEP(pdev , pdev->request.bmRequest & 0x80);

    break;

  }  

  return USBD_OK;  

}

 

/**

* @brief  USBD_DataOutStage 

*         Handle data OUT stage

* @param  pdev: device instance

* @param  epnum: endpoint index

* @retval status

*/

USBD_StatusTypeDe

[1] [2] [3]

要害字:STM32   USB学习

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

上一篇:STM32 USB学习条记2
下一篇:最后一页

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

推荐阅读

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
热门资源推荐
更多
  •  pdf文件圈圈教你玩USB
  •  rar文件STM32 以太网络WEB编程(适合初学者学习)
  •  rar文件基于2148的usb例程
  •  rar文件基于STM32的USB-OTG的,对U盘文件(FATfs文件系统)读写操作的的法式源码
  •  嵌入式硬件设计(第二版)
  •  初学嵌入式开发指点
  •  ARM9嵌入式系统设计与开发教程
  •  ARM启动代码分析——妙手手把手教你理解boot

小广播

热门运动
换一批
更多

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

最新视频课程更多

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

何立民专栏

单片机及嵌入式宝典

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

更多相关热搜器件

  •  MC68020RC33E
  •  ST72F325J6T3
  •  445I25K30M00000
  •  ASFLMPC-33.000MHZ-Z-T
  •  EFM32GG395F512-E-BGA120T
  •  CRT1-MD32S-1
  •  7C-100000MBE-T
  •  8N4Q001EG-1088CDI8
  •  LM2937ES-25-NOPB
  •  LM2853MHX-1.8
亿博娱乐平台版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright ? 2005-2018 EEWORLD.com.cn, Inc. All rights reserved