|
STM32G474xx HAL用户手册
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32g4xx_ll_gpio.c 00004 * @author MCD Application Team 00005 * @brief GPIO LL模块驱动程序。 00006 ****************************************************************************** 00007 * @attention 00008 * 00009 * Copyright (c) 2019 STMicroelectronics. 00010 * 保留所有权利。 00011 * 00012 * 本软件根据LICENSE文件中规定的条款进行许可。 00013 * 如果本软件不包含LICENSE文件,则按原样提供。 00014 * 00015 ****************************************************************************** 00016 */ 00017 #if defined(USE_FULL_LL_DRIVER) 00018 00019 /* 头文件包含 ------------------------------------------------------------------*/ 00020 #include "stm32g4xx_ll_gpio.h" 00021 #include "stm32g4xx_ll_bus.h" 00022 #ifdef USE_FULL_ASSERT 00023 #include "stm32_assert.h" 00024 #else 00025 #define assert_param(expr) ((void)0U) 00026 #endif /* USE_FULL_ASSERT */ 00027 00028 /** @addtogroup STM32G4xx_LL_Driver 00029 * @{ 00030 */ 00031 00032 #if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) 00033 00034 /** @addtogroup GPIO_LL 00035 * @{ 00036 */ 00037 /** 已针对以下规则授予MISRA C:2012偏差规则: 00038 * Rule-12.2 - 中等:右侧操作数在区间[0,INF]内,超出了 00039 * 以下API中移位运算符的范围: 00040 * LL_GPIO_Init 00041 */ 00042 00043 /* 私有类型定义 -------------------------------------------------------------*/ 00044 /* 私有变量 -----------------------------------------------------------------*/ 00045 /* 私有常量 -----------------------------------------------------------------*/ 00046 /* 私有宏定义 --------------------------------------------------------------*/ 00047 /** @addtogroup GPIO_LL_Private_Macros 00048 * @{ 00049 */ 00050 #define IS_LL_GPIO_PIN(__VALUE__) (((0x00000000U) < (__VALUE__)) && ((__VALUE__) <= (LL_GPIO_PIN_ALL))) 00051 00052 #define IS_LL_GPIO_MODE(__VALUE__) (((__VALUE__) == LL_GPIO_MODE_INPUT) ||\ 00053 ((__VALUE__) == LL_GPIO_MODE_OUTPUT) ||\ 00054 ((__VALUE__) == LL_GPIO_MODE_ALTERNATE) ||\ 00055 ((__VALUE__) == LL_GPIO_MODE_ANALOG)) 00056 00057 #define IS_LL_GPIO_OUTPUT_TYPE(__VALUE__) (((__VALUE__) == LL_GPIO_OUTPUT_PUSHPULL) ||\ 00058 ((__VALUE__) == LL_GPIO_OUTPUT_OPENDRAIN)) 00059 00060 #define IS_LL_GPIO_SPEED(__VALUE__) (((__VALUE__) == LL_GPIO_SPEED_FREQ_LOW) ||\ 00061 ((__VALUE__) == LL_GPIO_SPEED_FREQ_MEDIUM) ||\ 00062 ((__VALUE__) == LL_GPIO_SPEED_FREQ_HIGH) ||\ 00063 ((__VALUE__) == LL_GPIO_SPEED_FREQ_VERY_HIGH)) 00064 00065 #define IS_LL_GPIO_PULL(__VALUE__) (((__VALUE__) == LL_GPIO_PULL_NO) ||\ 00066 ((__VALUE__) == LL_GPIO_PULL_UP) ||\ 00067 ((__VALUE__) == LL_GPIO_PULL_DOWN)) 00068 00069 #define IS_LL_GPIO_ALTERNATE(__VALUE__) (((__VALUE__) == LL_GPIO_AF_0 ) ||\ 00070 ((__VALUE__) == LL_GPIO_AF_1 ) ||\ 00071 ((__VALUE__) == LL_GPIO_AF_2 ) ||\ 00072 ((__VALUE__) == LL_GPIO_AF_3 ) ||\ 00073 ((__VALUE__) == LL_GPIO_AF_4 ) ||\ 00074 ((__VALUE__) == LL_GPIO_AF_5 ) ||\ 00075 ((__VALUE__) == LL_GPIO_AF_6 ) ||\ 00076 ((__VALUE__) == LL_GPIO_AF_7 ) ||\ 00077 ((__VALUE__) == LL_GPIO_AF_8 ) ||\ 00078 ((__VALUE__) == LL_GPIO_AF_9 ) ||\ 00079 ((__VALUE__) == LL_GPIO_AF_10 ) ||\ 00080 ((__VALUE__) == LL_GPIO_AF_11 ) ||\ 00081 ((__VALUE__) == LL_GPIO_AF_12 ) ||\ 00082 ((__VALUE__) == LL_GPIO_AF_13 ) ||\ 00083 ((__VALUE__) == LL_GPIO_AF_14 ) ||\ 00084 ((__VALUE__) == LL_GPIO_AF_15 )) 00085 /** 00086 * @} 00087 */ 00088 00089 /* 私有函数原型 -------------------------------------------------------------*/ 00090 00091 /* 导出函数 -----------------------------------------------------------------*/ 00092 /** @addtogroup GPIO_LL_Exported_Functions 00093 * @{ 00094 */ 00095 00096 /** @addtogroup GPIO_LL_EF_Init 00097 * @{ 00098 */ 00099 00100 /** 00101 * @brief 反初始化GPIO寄存器(寄存器恢复为默认值)。 00102 * @param GPIOx GPIO端口 00103 * @retval ErrorStatus枚举值: 00104 * - SUCCESS:GPIO寄存器已反初始化 00105 * - ERROR: 错误的GPIO端口 00106 */ 00107 00108 ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx) 00109 { 00110 ErrorStatus status = SUCCESS; 00111 00112 /* 检查参数 */ 00113 assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); 00114 00115 /* 强制并释放GPIOx端口时钟复位 */ 00116 if (GPIOx == GPIOA) 00117 { 00118 LL_AHB2_GRP1_ForceReset(LL_AHB2_GRP1_PERIPH_GPIOA); 00119 LL_AHB2_GRP1_ReleaseReset(LL_AHB2_GRP1_PERIPH_GPIOA); 00120 } 00121 else if (GPIOx == GPIOB) 00122 { 00123 LL_AHB2_GRP1_ForceReset(LL_AHB2_GRP1_PERIPH_GPIOB); 00124 LL_AHB2_GRP1_ReleaseReset(LL_AHB2_GRP1_PERIPH_GPIOB); 00125 } 00126 else if (GPIOx == GPIOC) 00127 { 00128 LL_AHB2_GRP1_ForceReset(LL_AHB2_GRP1_PERIPH_GPIOC); 00129 LL_AHB2_GRP1_ReleaseReset(LL_AHB2_GRP1_PERIPH_GPIOC); 00130 } 00131 else if (GPIOx == GPIOD) 00132 { 00133 LL_AHB2_GRP1_ForceReset(LL_AHB2_GRP1_PERIPH_GPIOD); 00134 LL_AHB2_GRP1_ReleaseReset(LL_AHB2_GRP1_PERIPH_GPIOD); 00135 } 00136 else if (GPIOx == GPIOE) 00137 { 00138 LL_AHB2_GRP1_ForceReset(LL_AHB2_GRP1_PERIPH_GPIOE); 00139 LL_AHB2_GRP1_ReleaseReset(LL_AHB2_GRP1_PERIPH_GPIOE); 00140 } 00141 else if (GPIOx == GPIOF) 00142 { 00143 LL_AHB2_GRP1_ForceReset(LL_AHB2_GRP1_PERIPH_GPIOF); 00144 LL_AHB2_GRP1_ReleaseReset(LL_AHB2_GRP1_PERIPH_GPIOF); 00145 } 00146 else if (GPIOx == GPIOG) 00147 { 00148 LL_AHB2_GRP1_ForceReset(LL_AHB2_GRP1_PERIPH_GPIOG); 00149 LL_AHB2_GRP1_ReleaseReset(LL_AHB2_GRP1_PERIPH_GPIOG); 00150 } 00151 else 00152