STM32G474xx HAL 用户手册
stm32g4xx_hal_pcd.c
转至该文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_pcd.c
00004   * @author  MCD Application Team
00005   * @brief   PCD HAL 模块驱动程序。
00006   *          本文件提供固件函数用于管理以下
00007   *          USB 外设控制器的功能:
00008   *           + 初始化和去初始化函数
00009   *           + IO 操作函数
00010   *           + 外设控制函数
00011   *           + 外设状态函数
00012   *
00013   ******************************************************************************
00014   * @attention
00015   *
00016   * Copyright (c) 2019 STMicroelectronics.
00017   * All rights reserved.
00018   *
00019   * This software is licensed under terms that can be found in the LICENSE file
00020   * in the root directory of this software component.
00021   * If no LICENSE file comes with this software, it is provided AS-IS.
00022   *
00023   ******************************************************************************
00024   @verbatim
00025   ==============================================================================
00026                     ##### 如何使用本驱动程序 #####
00027   ==============================================================================
00028     [..]
00029       PCD HAL 驱动程序的使用方法如下:
00030 
00031      (#) 声明一个 PCD_HandleTypeDef 句柄结构,例如:
00032          PCD_HandleTypeDef  hpcd;
00033 
00034      (#) 在 HCD 句柄中填充 Init 结构体参数
00035 
00036      (#) 调用 HAL_PCD_Init() API 初始化 PCD 外设(核心、设备核心...)
00037 
00038      (#) 通过 HAL_PCD_MspInit() API 初始化 PCD 低层资源:
00039          (##) 使用以下方式启用 PCD/USB 低层接口时钟
00040               (+++) __HAL_RCC_USB_CLK_ENABLE(); 用于 USB 设备 FS 外设
00041 
00042          (##) 初始化相关的 GPIO 时钟
00043          (##) 配置 PCD 引脚分配
00044          (##) 配置 PCD NVIC 中断
00045 
00046      (#)将上级 USB 设备栈关联到 HAL PCD 驱动程序:
00047          (##) hpcd.pData = pdev;
00048 
00049      (#)启用 PCD 发送和接收:
00050          (##) HAL_PCD_Start();
00051 
00052      (#)注意:对于不使用双缓冲模式的应用程序,定义符号
00053                'USE_USB_DOUBLE_BUFFER' 为 0 以减小驱动程序的内存占用。
00054 
00055   @endverbatim
00056   ******************************************************************************
00057   */
00058 
00059 /* Includes ------------------------------------------------------------------*/
00060 #include "stm32g4xx_hal.h"
00061 
00062 /** @addtogroup STM32G4xx_HAL_Driver
00063   * @{
00064   */
00065 
00066 /** @defgroup PCD PCD
00067   * @brief PCD HAL 模块驱动程序
00068   * @{
00069   */
00070 
00071 #ifdef HAL_PCD_MODULE_ENABLED
00072 
00073 #if defined (USB)
00074 
00075 /* Private types -------------------------------------------------------------*/
00076 /* Private variables ---------------------------------------------------------*/
00077 /* Private constants ---------------------------------------------------------*/
00078 /* Private macros ------------------------------------------------------------*/
00079 /** @defgroup PCD_Private_Macros PCD 私有宏
00080   * @{
00081   */
00082 #define PCD_MIN(a, b)  (((a) < (b)) ? (a) : (b))
00083 #define PCD_MAX(a, b)  (((a) > (b)) ? (a) : (b))
00084 /**
00085   * @}
00086   */
00087 
00088 /* Private functions prototypes ----------------------------------------------*/
00089 /** @defgroup PCD_Private_Functions PCD 私有函数
00090   * @{
00091   */
00092 
00093 static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd);
00094 #if (USE_USB_DOUBLE_BUFFER == 1U)
00095 static HAL_StatusTypeDef HAL_PCD_EP_DB_Transmit(PCD_HandleTypeDef *hpcd, PCD_EPTypeDef *ep, uint16_t wEPVal);
00096 static uint16_t HAL_PCD_EP_DB_Receive(PCD_HandleTypeDef *hpcd, PCD_EPTypeDef *ep, uint16_t wEPVal);
00097 #endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
00098 
00099 /**
00100   * @}
00100   */
00101   */
00102 
00103 /* Exported functions --------------------------------------------------------*/
00104 /** @defgroup PCD_Exported_Functions PCD 导出函数
00105   * @{
00106   */
00107 
00108 /** @defgroup PCD_Exported_Functions_Group1 初始化和去初始化函数
00109   *  @brief    初始化和配置函数
00110   *
00111 @verbatim
00112  ===============================================================================
00113             ##### 初始化和去初始化函数 #####
00114  ===============================================================================
00115     [..]  本节提供以下函数:
00116 
00117 @endverbatim
00118   * @{
00119   */
00120 
00121 /**
00122   * @brief  根据 PCD_InitTypeDef 中指定的参数初始化 PCD 并初始化关联的句柄。
00123   * @param  hpcd PCD 句柄
00124   * @retval HAL 状态
00125   */
00126 00127 HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd)
00127 {
00128   uint8_t i;
00129 
00131   /* 检查 PCD 句柄分配 */
00132   if (hpcd == NULL)
00133   {
00134     return HAL_ERROR;
00135   }
00136 
00137   /* 检查参数 */
00138   assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance));
00139 
00140   if (hpcd->State == HAL_PCD_STATE_RESET)
00140   {
00142     /* 分配锁资源并初始化 */
00143     hpcd->Lock = HAL_UNLOCKED;
00143 
00145 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
00145     hpcd->SOFCallback = HAL_PCD_SOFCallback;
00146     hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback;
00147     hpcd->ResetCallback = HAL_PCD_ResetCallback;
00148     hpcd->SuspendCallback = HAL_PCD_SuspendCallback;
00149     hpcd->ResumeCallback = HAL_PCD_ResumeCallback;
00150     hpcd->ConnectCallback = HAL_PCD_ConnectCallback;
00151     hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback;
00152     hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback;
00153     hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback;
00154     hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback;
00155     hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback;
00156     hpcd->LPMCallback = HAL_PCDEx_LPM_Callback;
00157     hpcd->BCDCallback = HAL_PCDEx_BCD_Callback;
00158 
00160     if (hpcd->MspInitCallback == NULL)
00160     {
00161       hpcd->MspInitCallback = HAL_PCD_MspInit;
00162     }
00163 
00165     /* 初始化底层硬件 */
00165     hpcd->MspInitCallback(hpcd);
00166 #else
00167     /* 初始化底层硬件:GPIO、时钟、NVIC... */
00168