1 /**
2 ******************************************************************************
3 * @file stm32f1xx_ll_gpio.c
4 * @author MCD Application Team
5 * @brief GPIO LL module driver.
6 ******************************************************************************
7 * @attention
8 *
9 * <h2><center>© Copyright (c) 2016 STMicroelectronics.
10 * All rights reserved.</center></h2>
11 *
12 * This software component is licensed by ST under BSD 3-Clause license,
13 * the "License"; You may not use this file except in compliance with the
14 * License. You may obtain a copy of the License at:
15 * opensource.org/licenses/BSD-3-Clause
16 *
17 ******************************************************************************
18 */
19
20 #if defined(USE_FULL_LL_DRIVER)
21
22 /* Includes ------------------------------------------------------------------*/
23 #include "stm32f1xx_ll_gpio.h"
24 #include "stm32f1xx_ll_bus.h"
25 #ifdef USE_FULL_ASSERT
26 #include "stm32_assert.h"
27 #else
28 #define assert_param(expr) ((void)0U)
29 #endif
30
31 /** @addtogroup STM32F1xx_LL_Driver
32 * @{
33 */
34
35 #if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG)
36
37 /** @addtogroup GPIO_LL
38 * @{
39 */
40
41 /* Private types -------------------------------------------------------------*/
42 /* Private variables ---------------------------------------------------------*/
43 /* Private constants ---------------------------------------------------------*/
44 /* Private macros ------------------------------------------------------------*/
45 /** @addtogroup GPIO_LL_Private_Macros
46 * @{
47 */
48
49 #define IS_LL_GPIO_PIN(__VALUE__) ((((__VALUE__) & LL_GPIO_PIN_ALL)!= 0u) &&\
50 (((__VALUE__) & (~LL_GPIO_PIN_ALL))== 0u))
51
52 #define IS_LL_GPIO_MODE(__VALUE__) (((__VALUE__) == LL_GPIO_MODE_ANALOG) ||\
53 ((__VALUE__) == LL_GPIO_MODE_FLOATING) ||\
54 ((__VALUE__) == LL_GPIO_MODE_INPUT) ||\
55 ((__VALUE__) == LL_GPIO_MODE_OUTPUT) ||\
56 ((__VALUE__) == LL_GPIO_MODE_ALTERNATE))
57
58 #define IS_LL_GPIO_SPEED(__VALUE__) (((__VALUE__) == LL_GPIO_SPEED_FREQ_LOW) ||\
59 ((__VALUE__) == LL_GPIO_SPEED_FREQ_MEDIUM) ||\
60 ((__VALUE__) == LL_GPIO_SPEED_FREQ_HIGH))
61
62 #define IS_LL_GPIO_OUTPUT_TYPE(__VALUE__) (((__VALUE__) == LL_GPIO_OUTPUT_PUSHPULL) ||\
63 ((__VALUE__) == LL_GPIO_OUTPUT_OPENDRAIN))
64
65 #define IS_LL_GPIO_PULL(__VALUE__) (((__VALUE__) == LL_GPIO_PULL_DOWN) ||\
66 ((__VALUE__) == LL_GPIO_PULL_UP))
67
68 /**
69 * @}
70 */
71
72 /* Private function prototypes -----------------------------------------------*/
73
74 /* Exported functions --------------------------------------------------------*/
75 /** @addtogroup GPIO_LL_Exported_Functions
76 * @{
77 */
78
79 /** @addtogroup GPIO_LL_EF_Init
80 * @{
81 */
82
83 /**
84 * @brief De-initialize GPIO registers (Registers restored to their default values).
85 * @param GPIOx GPIO Port
86 * @retval An ErrorStatus enumeration value:
87 * - SUCCESS: GPIO registers are de-initialized
88 * - ERROR: Wrong GPIO Port
89 */
LL_GPIO_DeInit(GPIO_TypeDef * GPIOx)90 ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx)
91 {
92 ErrorStatus status = SUCCESS;
93
94 /* Check the parameters */
95 assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
96
97 /* Force and Release reset on clock of GPIOx Port */
98 if (GPIOx == GPIOA)
99 {
100 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_GPIOA);
101 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_GPIOA);
102 }
103 else if (GPIOx == GPIOB)
104 {
105 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_GPIOB);
106 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_GPIOB);
107 }
108 else if (GPIOx == GPIOC)
109 {
110 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_GPIOC);
111 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_GPIOC);
112 }
113 else if (GPIOx == GPIOD)
114 {
115 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_GPIOD);
116 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_GPIOD);
117 }
118 #if defined(GPIOE)
119 else if (GPIOx == GPIOE)
120 {
121 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_GPIOE);
122 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_GPIOE);
123 }
124 #endif
125 #if defined(GPIOF)
126 else if (GPIOx == GPIOF)
127 {
128 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_GPIOF);
129 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_GPIOF);
130 }
131 #endif
132 #if defined(GPIOG)
133 else if (GPIOx == GPIOG)
134 {
135 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_GPIOG);
136 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_GPIOG);
137 }
138 #endif
139 else
140 {
141 status = ERROR;
142 }
143
144 return (status);
145 }
146
147 /**
148 * @brief Initialize GPIO registers according to the specified parameters in GPIO_InitStruct.
149 * @param GPIOx GPIO Port
150 * @param GPIO_InitStruct: pointer to a @ref LL_GPIO_InitTypeDef structure
151 * that contains the configuration information for the specified GPIO peripheral.
152 * @retval An ErrorStatus enumeration value:
153 * - SUCCESS: GPIO registers are initialized according to GPIO_InitStruct content
154 * - ERROR: Not applicable
155 */
LL_GPIO_Init(GPIO_TypeDef * GPIOx,LL_GPIO_InitTypeDef * GPIO_InitStruct)156 ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct)
157 {
158 uint32_t pinmask;
159 uint32_t pinpos;
160 uint32_t currentpin;
161
162 /* Check the parameters */
163 assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
164 assert_param(IS_LL_GPIO_PIN(GPIO_InitStruct->Pin));
165
166 /* ------------------------- Configure the port pins ---------------- */
167 /* Initialize pinpos on first pin set */
168
169 pinmask = ((GPIO_InitStruct->Pin) << GPIO_PIN_MASK_POS) >> GPIO_PIN_NB;
170 pinpos = POSITION_VAL(pinmask);
171
172 /* Configure the port pins */
173 while ((pinmask >> pinpos) != 0u)
174 {
175 /* skip if bit is not set */
176 if ((pinmask & (1u << pinpos)) != 0u)
177 {
178 /* Get current io position */
179 if (pinpos < GPIO_PIN_MASK_POS)
180 {
181 currentpin = (0x00000101uL << pinpos);
182 }
183 else
184 {
185 currentpin = ((0x00010001u << (pinpos - GPIO_PIN_MASK_POS)) | 0x04000000u);
186 }
187
188 if (GPIO_InitStruct->Mode == LL_GPIO_MODE_INPUT)
189 {
190 /* Check The Pull parameter */
191 assert_param(IS_LL_GPIO_PULL(GPIO_InitStruct->Pull));
192
193 /* Pull-up Pull-down resistor configuration*/
194 LL_GPIO_SetPinPull(GPIOx, currentpin, GPIO_InitStruct->Pull);
195 }
196
197 /* Check Pin Mode parameters */
198 assert_param(IS_LL_GPIO_MODE(GPIO_InitStruct->Mode));
199
200 /* Pin Mode configuration */
201 LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode);
202
203 if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE))
204 {
205 /* Check speed and Output mode parameters */
206 assert_param(IS_LL_GPIO_SPEED(GPIO_InitStruct->Speed));
207 assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType));
208
209 /* Speed mode configuration */
210 LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed);
211
212 /* Output mode configuration*/
213 LL_GPIO_SetPinOutputType(GPIOx, currentpin, GPIO_InitStruct->OutputType);
214 }
215 }
216 pinpos++;
217 }
218 return (SUCCESS);
219 }
220
221 /**
222 * @brief Set each @ref LL_GPIO_InitTypeDef field to default value.
223 * @param GPIO_InitStruct: pointer to a @ref LL_GPIO_InitTypeDef structure
224 * whose fields will be set to default values.
225 * @retval None
226 */
227
LL_GPIO_StructInit(LL_GPIO_InitTypeDef * GPIO_InitStruct)228 void LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct)
229 {
230 /* Reset GPIO init structure parameters values */
231 GPIO_InitStruct->Pin = LL_GPIO_PIN_ALL;
232 GPIO_InitStruct->Mode = LL_GPIO_MODE_FLOATING;
233 GPIO_InitStruct->Speed = LL_GPIO_SPEED_FREQ_LOW;
234 GPIO_InitStruct->OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
235 GPIO_InitStruct->Pull = LL_GPIO_PULL_DOWN;
236 }
237
238 /**
239 * @}
240 */
241
242 /**
243 * @}
244 */
245
246 /**
247 * @}
248 */
249
250 #endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) */
251
252 /**
253 * @}
254 */
255
256 #endif /* USE_FULL_LL_DRIVER */
257
258 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
259