|
STM32G474xx HAL 用户手册
|
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