1 /**
2   ******************************************************************************
3   * @file    stm32f4xx_ll_gpio.h
4   * @author  MCD Application Team
5   * @brief   Header file of GPIO LL module.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2017 STMicroelectronics.
10   * All rights reserved.
11   *
12   * This software is licensed under terms that can be found in the LICENSE file
13   * in the root directory of this software component.
14   * If no LICENSE file comes with this software, it is provided AS-IS.
15   *
16   ******************************************************************************
17   */
18 
19 /* Define to prevent recursive inclusion -------------------------------------*/
20 #ifndef __STM32F4xx_LL_GPIO_H
21 #define __STM32F4xx_LL_GPIO_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32f4xx.h"
29 
30 /** @addtogroup STM32F4xx_LL_Driver
31   * @{
32   */
33 
34 #if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK)
35 
36 /** @defgroup GPIO_LL GPIO
37   * @{
38   */
39 
40 /* Private types -------------------------------------------------------------*/
41 /* Private variables ---------------------------------------------------------*/
42 /* Private constants ---------------------------------------------------------*/
43 /* Private macros ------------------------------------------------------------*/
44 #if defined(USE_FULL_LL_DRIVER)
45 /** @defgroup GPIO_LL_Private_Macros GPIO Private Macros
46   * @{
47   */
48 
49 /**
50   * @}
51   */
52 #endif /*USE_FULL_LL_DRIVER*/
53 
54 /* Exported types ------------------------------------------------------------*/
55 #if defined(USE_FULL_LL_DRIVER)
56 /** @defgroup GPIO_LL_ES_INIT GPIO Exported Init structures
57   * @{
58   */
59 
60 /**
61   * @brief LL GPIO Init Structure definition
62   */
63 typedef struct
64 {
65   uint32_t Pin;          /*!< Specifies the GPIO pins to be configured.
66                               This parameter can be any value of @ref GPIO_LL_EC_PIN */
67 
68   uint32_t Mode;         /*!< Specifies the operating mode for the selected pins.
69                               This parameter can be a value of @ref GPIO_LL_EC_MODE.
70 
71                               GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinMode().*/
72 
73   uint32_t Speed;        /*!< Specifies the speed for the selected pins.
74                               This parameter can be a value of @ref GPIO_LL_EC_SPEED.
75 
76                               GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinSpeed().*/
77 
78   uint32_t OutputType;   /*!< Specifies the operating output type for the selected pins.
79                               This parameter can be a value of @ref GPIO_LL_EC_OUTPUT.
80 
81                               GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinOutputType().*/
82 
83   uint32_t Pull;         /*!< Specifies the operating Pull-up/Pull down for the selected pins.
84                               This parameter can be a value of @ref GPIO_LL_EC_PULL.
85 
86                               GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinPull().*/
87 
88   uint32_t Alternate;    /*!< Specifies the Peripheral to be connected to the selected pins.
89                               This parameter can be a value of @ref GPIO_LL_EC_AF.
90 
91                               GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetAFPin_0_7() and LL_GPIO_SetAFPin_8_15().*/
92 } LL_GPIO_InitTypeDef;
93 
94 /**
95   * @}
96   */
97 #endif /* USE_FULL_LL_DRIVER */
98 
99 /* Exported constants --------------------------------------------------------*/
100 /** @defgroup GPIO_LL_Exported_Constants GPIO Exported Constants
101   * @{
102   */
103 
104 /** @defgroup GPIO_LL_EC_PIN PIN
105   * @{
106   */
107 #define LL_GPIO_PIN_0                      GPIO_BSRR_BS_0 /*!< Select pin 0 */
108 #define LL_GPIO_PIN_1                      GPIO_BSRR_BS_1 /*!< Select pin 1 */
109 #define LL_GPIO_PIN_2                      GPIO_BSRR_BS_2 /*!< Select pin 2 */
110 #define LL_GPIO_PIN_3                      GPIO_BSRR_BS_3 /*!< Select pin 3 */
111 #define LL_GPIO_PIN_4                      GPIO_BSRR_BS_4 /*!< Select pin 4 */
112 #define LL_GPIO_PIN_5                      GPIO_BSRR_BS_5 /*!< Select pin 5 */
113 #define LL_GPIO_PIN_6                      GPIO_BSRR_BS_6 /*!< Select pin 6 */
114 #define LL_GPIO_PIN_7                      GPIO_BSRR_BS_7 /*!< Select pin 7 */
115 #define LL_GPIO_PIN_8                      GPIO_BSRR_BS_8 /*!< Select pin 8 */
116 #define LL_GPIO_PIN_9                      GPIO_BSRR_BS_9 /*!< Select pin 9 */
117 #define LL_GPIO_PIN_10                     GPIO_BSRR_BS_10 /*!< Select pin 10 */
118 #define LL_GPIO_PIN_11                     GPIO_BSRR_BS_11 /*!< Select pin 11 */
119 #define LL_GPIO_PIN_12                     GPIO_BSRR_BS_12 /*!< Select pin 12 */
120 #define LL_GPIO_PIN_13                     GPIO_BSRR_BS_13 /*!< Select pin 13 */
121 #define LL_GPIO_PIN_14                     GPIO_BSRR_BS_14 /*!< Select pin 14 */
122 #define LL_GPIO_PIN_15                     GPIO_BSRR_BS_15 /*!< Select pin 15 */
123 #define LL_GPIO_PIN_ALL                    (GPIO_BSRR_BS_0 | GPIO_BSRR_BS_1  | GPIO_BSRR_BS_2  | \
124                                            GPIO_BSRR_BS_3  | GPIO_BSRR_BS_4  | GPIO_BSRR_BS_5  | \
125                                            GPIO_BSRR_BS_6  | GPIO_BSRR_BS_7  | GPIO_BSRR_BS_8  | \
126                                            GPIO_BSRR_BS_9  | GPIO_BSRR_BS_10 | GPIO_BSRR_BS_11 | \
127                                            GPIO_BSRR_BS_12 | GPIO_BSRR_BS_13 | GPIO_BSRR_BS_14 | \
128                                            GPIO_BSRR_BS_15) /*!< Select all pins */
129 /**
130   * @}
131   */
132 
133 /** @defgroup GPIO_LL_EC_MODE Mode
134   * @{
135   */
136 #define LL_GPIO_MODE_INPUT                 (0x00000000U) /*!< Select input mode */
137 #define LL_GPIO_MODE_OUTPUT                GPIO_MODER_MODER0_0  /*!< Select output mode */
138 #define LL_GPIO_MODE_ALTERNATE             GPIO_MODER_MODER0_1  /*!< Select alternate function mode */
139 #define LL_GPIO_MODE_ANALOG                GPIO_MODER_MODER0    /*!< Select analog mode */
140 /**
141   * @}
142   */
143 
144 /** @defgroup GPIO_LL_EC_OUTPUT Output Type
145   * @{
146   */
147 #define LL_GPIO_OUTPUT_PUSHPULL            (0x00000000U) /*!< Select push-pull as output type */
148 #define LL_GPIO_OUTPUT_OPENDRAIN           GPIO_OTYPER_OT_0 /*!< Select open-drain as output type */
149 /**
150   * @}
151   */
152 
153 /** @defgroup GPIO_LL_EC_SPEED Output Speed
154   * @{
155   */
156 #define LL_GPIO_SPEED_FREQ_LOW             (0x00000000U) /*!< Select I/O low output speed    */
157 #define LL_GPIO_SPEED_FREQ_MEDIUM          GPIO_OSPEEDER_OSPEEDR0_0 /*!< Select I/O medium output speed */
158 #define LL_GPIO_SPEED_FREQ_HIGH            GPIO_OSPEEDER_OSPEEDR0_1 /*!< Select I/O fast output speed   */
159 #define LL_GPIO_SPEED_FREQ_VERY_HIGH       GPIO_OSPEEDER_OSPEEDR0   /*!< Select I/O high output speed   */
160 /**
161   * @}
162   */
163 
164 /** @defgroup GPIO_LL_EC_PULL Pull Up Pull Down
165   * @{
166   */
167 #define LL_GPIO_PULL_NO                    (0x00000000U) /*!< Select I/O no pull */
168 #define LL_GPIO_PULL_UP                    GPIO_PUPDR_PUPDR0_0 /*!< Select I/O pull up */
169 #define LL_GPIO_PULL_DOWN                  GPIO_PUPDR_PUPDR0_1 /*!< Select I/O pull down */
170 /**
171   * @}
172   */
173 
174 /** @defgroup GPIO_LL_EC_AF Alternate Function
175   * @{
176   */
177 #define LL_GPIO_AF_0                       (0x0000000U) /*!< Select alternate function 0 */
178 #define LL_GPIO_AF_1                       (0x0000001U) /*!< Select alternate function 1 */
179 #define LL_GPIO_AF_2                       (0x0000002U) /*!< Select alternate function 2 */
180 #define LL_GPIO_AF_3                       (0x0000003U) /*!< Select alternate function 3 */
181 #define LL_GPIO_AF_4                       (0x0000004U) /*!< Select alternate function 4 */
182 #define LL_GPIO_AF_5                       (0x0000005U) /*!< Select alternate function 5 */
183 #define LL_GPIO_AF_6                       (0x0000006U) /*!< Select alternate function 6 */
184 #define LL_GPIO_AF_7                       (0x0000007U) /*!< Select alternate function 7 */
185 #define LL_GPIO_AF_8                       (0x0000008U) /*!< Select alternate function 8 */
186 #define LL_GPIO_AF_9                       (0x0000009U) /*!< Select alternate function 9 */
187 #define LL_GPIO_AF_10                      (0x000000AU) /*!< Select alternate function 10 */
188 #define LL_GPIO_AF_11                      (0x000000BU) /*!< Select alternate function 11 */
189 #define LL_GPIO_AF_12                      (0x000000CU) /*!< Select alternate function 12 */
190 #define LL_GPIO_AF_13                      (0x000000DU) /*!< Select alternate function 13 */
191 #define LL_GPIO_AF_14                      (0x000000EU) /*!< Select alternate function 14 */
192 #define LL_GPIO_AF_15                      (0x000000FU) /*!< Select alternate function 15 */
193 /**
194   * @}
195   */
196 
197 /**
198   * @}
199   */
200 
201 /* Exported macro ------------------------------------------------------------*/
202 /** @defgroup GPIO_LL_Exported_Macros GPIO Exported Macros
203   * @{
204   */
205 
206 /** @defgroup GPIO_LL_EM_WRITE_READ Common Write and read registers Macros
207   * @{
208   */
209 
210 /**
211   * @brief  Write a value in GPIO register
212   * @param  __INSTANCE__ GPIO Instance
213   * @param  __REG__ Register to be written
214   * @param  __VALUE__ Value to be written in the register
215   * @retval None
216   */
217 #define LL_GPIO_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__))
218 
219 /**
220   * @brief  Read a value in GPIO register
221   * @param  __INSTANCE__ GPIO Instance
222   * @param  __REG__ Register to be read
223   * @retval Register value
224   */
225 #define LL_GPIO_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__)
226 /**
227   * @}
228   */
229 
230 /**
231   * @}
232   */
233 
234 /* Exported functions --------------------------------------------------------*/
235 /** @defgroup GPIO_LL_Exported_Functions GPIO Exported Functions
236   * @{
237   */
238 
239 /** @defgroup GPIO_LL_EF_Port_Configuration Port Configuration
240   * @{
241   */
242 
243 /**
244   * @brief  Configure gpio mode for a dedicated pin on dedicated port.
245   * @note   I/O mode can be Input mode, General purpose output, Alternate function mode or Analog.
246   * @note   Warning: only one pin can be passed as parameter.
247   * @rmtoll MODER        MODEy         LL_GPIO_SetPinMode
248   * @param  GPIOx GPIO Port
249   * @param  Pin This parameter can be one of the following values:
250   *         @arg @ref LL_GPIO_PIN_0
251   *         @arg @ref LL_GPIO_PIN_1
252   *         @arg @ref LL_GPIO_PIN_2
253   *         @arg @ref LL_GPIO_PIN_3
254   *         @arg @ref LL_GPIO_PIN_4
255   *         @arg @ref LL_GPIO_PIN_5
256   *         @arg @ref LL_GPIO_PIN_6
257   *         @arg @ref LL_GPIO_PIN_7
258   *         @arg @ref LL_GPIO_PIN_8
259   *         @arg @ref LL_GPIO_PIN_9
260   *         @arg @ref LL_GPIO_PIN_10
261   *         @arg @ref LL_GPIO_PIN_11
262   *         @arg @ref LL_GPIO_PIN_12
263   *         @arg @ref LL_GPIO_PIN_13
264   *         @arg @ref LL_GPIO_PIN_14
265   *         @arg @ref LL_GPIO_PIN_15
266   * @param  Mode This parameter can be one of the following values:
267   *         @arg @ref LL_GPIO_MODE_INPUT
268   *         @arg @ref LL_GPIO_MODE_OUTPUT
269   *         @arg @ref LL_GPIO_MODE_ALTERNATE
270   *         @arg @ref LL_GPIO_MODE_ANALOG
271   * @retval None
272   */
LL_GPIO_SetPinMode(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Mode)273 __STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode)
274 {
275   MODIFY_REG(GPIOx->MODER, (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U)), (Mode << (POSITION_VAL(Pin) * 2U)));
276 }
277 
278 /**
279   * @brief  Return gpio mode for a dedicated pin on dedicated port.
280   * @note   I/O mode can be Input mode, General purpose output, Alternate function mode or Analog.
281   * @note   Warning: only one pin can be passed as parameter.
282   * @rmtoll MODER        MODEy         LL_GPIO_GetPinMode
283   * @param  GPIOx GPIO Port
284   * @param  Pin This parameter can be one of the following values:
285   *         @arg @ref LL_GPIO_PIN_0
286   *         @arg @ref LL_GPIO_PIN_1
287   *         @arg @ref LL_GPIO_PIN_2
288   *         @arg @ref LL_GPIO_PIN_3
289   *         @arg @ref LL_GPIO_PIN_4
290   *         @arg @ref LL_GPIO_PIN_5
291   *         @arg @ref LL_GPIO_PIN_6
292   *         @arg @ref LL_GPIO_PIN_7
293   *         @arg @ref LL_GPIO_PIN_8
294   *         @arg @ref LL_GPIO_PIN_9
295   *         @arg @ref LL_GPIO_PIN_10
296   *         @arg @ref LL_GPIO_PIN_11
297   *         @arg @ref LL_GPIO_PIN_12
298   *         @arg @ref LL_GPIO_PIN_13
299   *         @arg @ref LL_GPIO_PIN_14
300   *         @arg @ref LL_GPIO_PIN_15
301   * @retval Returned value can be one of the following values:
302   *         @arg @ref LL_GPIO_MODE_INPUT
303   *         @arg @ref LL_GPIO_MODE_OUTPUT
304   *         @arg @ref LL_GPIO_MODE_ALTERNATE
305   *         @arg @ref LL_GPIO_MODE_ANALOG
306   */
LL_GPIO_GetPinMode(GPIO_TypeDef * GPIOx,uint32_t Pin)307 __STATIC_INLINE uint32_t LL_GPIO_GetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin)
308 {
309   return (uint32_t)(READ_BIT(GPIOx->MODER,
310                              (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U));
311 }
312 
313 /**
314   * @brief  Configure gpio output type for several pins on dedicated port.
315   * @note   Output type as to be set when gpio pin is in output or
316   *         alternate modes. Possible type are Push-pull or Open-drain.
317   * @rmtoll OTYPER       OTy           LL_GPIO_SetPinOutputType
318   * @param  GPIOx GPIO Port
319   * @param  PinMask This parameter can be a combination of the following values:
320   *         @arg @ref LL_GPIO_PIN_0
321   *         @arg @ref LL_GPIO_PIN_1
322   *         @arg @ref LL_GPIO_PIN_2
323   *         @arg @ref LL_GPIO_PIN_3
324   *         @arg @ref LL_GPIO_PIN_4
325   *         @arg @ref LL_GPIO_PIN_5
326   *         @arg @ref LL_GPIO_PIN_6
327   *         @arg @ref LL_GPIO_PIN_7
328   *         @arg @ref LL_GPIO_PIN_8
329   *         @arg @ref LL_GPIO_PIN_9
330   *         @arg @ref LL_GPIO_PIN_10
331   *         @arg @ref LL_GPIO_PIN_11
332   *         @arg @ref LL_GPIO_PIN_12
333   *         @arg @ref LL_GPIO_PIN_13
334   *         @arg @ref LL_GPIO_PIN_14
335   *         @arg @ref LL_GPIO_PIN_15
336   *         @arg @ref LL_GPIO_PIN_ALL
337   * @param  OutputType This parameter can be one of the following values:
338   *         @arg @ref LL_GPIO_OUTPUT_PUSHPULL
339   *         @arg @ref LL_GPIO_OUTPUT_OPENDRAIN
340   * @retval None
341   */
LL_GPIO_SetPinOutputType(GPIO_TypeDef * GPIOx,uint32_t PinMask,uint32_t OutputType)342 __STATIC_INLINE void LL_GPIO_SetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t PinMask, uint32_t OutputType)
343 {
344   MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType));
345 }
346 
347 /**
348   * @brief  Return gpio output type for several pins on dedicated port.
349   * @note   Output type as to be set when gpio pin is in output or
350   *         alternate modes. Possible type are Push-pull or Open-drain.
351   * @note   Warning: only one pin can be passed as parameter.
352   * @rmtoll OTYPER       OTy           LL_GPIO_GetPinOutputType
353   * @param  GPIOx GPIO Port
354   * @param  Pin This parameter can be one of the following values:
355   *         @arg @ref LL_GPIO_PIN_0
356   *         @arg @ref LL_GPIO_PIN_1
357   *         @arg @ref LL_GPIO_PIN_2
358   *         @arg @ref LL_GPIO_PIN_3
359   *         @arg @ref LL_GPIO_PIN_4
360   *         @arg @ref LL_GPIO_PIN_5
361   *         @arg @ref LL_GPIO_PIN_6
362   *         @arg @ref LL_GPIO_PIN_7
363   *         @arg @ref LL_GPIO_PIN_8
364   *         @arg @ref LL_GPIO_PIN_9
365   *         @arg @ref LL_GPIO_PIN_10
366   *         @arg @ref LL_GPIO_PIN_11
367   *         @arg @ref LL_GPIO_PIN_12
368   *         @arg @ref LL_GPIO_PIN_13
369   *         @arg @ref LL_GPIO_PIN_14
370   *         @arg @ref LL_GPIO_PIN_15
371   *         @arg @ref LL_GPIO_PIN_ALL
372   * @retval Returned value can be one of the following values:
373   *         @arg @ref LL_GPIO_OUTPUT_PUSHPULL
374   *         @arg @ref LL_GPIO_OUTPUT_OPENDRAIN
375   */
LL_GPIO_GetPinOutputType(GPIO_TypeDef * GPIOx,uint32_t Pin)376 __STATIC_INLINE uint32_t LL_GPIO_GetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t Pin)
377 {
378   return (uint32_t)(READ_BIT(GPIOx->OTYPER, Pin) >> POSITION_VAL(Pin));
379 }
380 
381 /**
382   * @brief  Configure gpio speed for a dedicated pin on dedicated port.
383   * @note   I/O speed can be Low, Medium, Fast or High speed.
384   * @note   Warning: only one pin can be passed as parameter.
385   * @note   Refer to datasheet for frequency specifications and the power
386   *         supply and load conditions for each speed.
387   * @rmtoll OSPEEDR      OSPEEDy       LL_GPIO_SetPinSpeed
388   * @param  GPIOx GPIO Port
389   * @param  Pin This parameter can be one of the following values:
390   *         @arg @ref LL_GPIO_PIN_0
391   *         @arg @ref LL_GPIO_PIN_1
392   *         @arg @ref LL_GPIO_PIN_2
393   *         @arg @ref LL_GPIO_PIN_3
394   *         @arg @ref LL_GPIO_PIN_4
395   *         @arg @ref LL_GPIO_PIN_5
396   *         @arg @ref LL_GPIO_PIN_6
397   *         @arg @ref LL_GPIO_PIN_7
398   *         @arg @ref LL_GPIO_PIN_8
399   *         @arg @ref LL_GPIO_PIN_9
400   *         @arg @ref LL_GPIO_PIN_10
401   *         @arg @ref LL_GPIO_PIN_11
402   *         @arg @ref LL_GPIO_PIN_12
403   *         @arg @ref LL_GPIO_PIN_13
404   *         @arg @ref LL_GPIO_PIN_14
405   *         @arg @ref LL_GPIO_PIN_15
406   * @param  Speed This parameter can be one of the following values:
407   *         @arg @ref LL_GPIO_SPEED_FREQ_LOW
408   *         @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM
409   *         @arg @ref LL_GPIO_SPEED_FREQ_HIGH
410   *         @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH
411   * @retval None
412   */
LL_GPIO_SetPinSpeed(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Speed)413 __STATIC_INLINE void LL_GPIO_SetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t  Speed)
414 {
415   MODIFY_REG(GPIOx->OSPEEDR, (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U)),
416              (Speed << (POSITION_VAL(Pin) * 2U)));
417 }
418 
419 /**
420   * @brief  Return gpio speed for a dedicated pin on dedicated port.
421   * @note   I/O speed can be Low, Medium, Fast or High speed.
422   * @note   Warning: only one pin can be passed as parameter.
423   * @note   Refer to datasheet for frequency specifications and the power
424   *         supply and load conditions for each speed.
425   * @rmtoll OSPEEDR      OSPEEDy       LL_GPIO_GetPinSpeed
426   * @param  GPIOx GPIO Port
427   * @param  Pin This parameter can be one of the following values:
428   *         @arg @ref LL_GPIO_PIN_0
429   *         @arg @ref LL_GPIO_PIN_1
430   *         @arg @ref LL_GPIO_PIN_2
431   *         @arg @ref LL_GPIO_PIN_3
432   *         @arg @ref LL_GPIO_PIN_4
433   *         @arg @ref LL_GPIO_PIN_5
434   *         @arg @ref LL_GPIO_PIN_6
435   *         @arg @ref LL_GPIO_PIN_7
436   *         @arg @ref LL_GPIO_PIN_8
437   *         @arg @ref LL_GPIO_PIN_9
438   *         @arg @ref LL_GPIO_PIN_10
439   *         @arg @ref LL_GPIO_PIN_11
440   *         @arg @ref LL_GPIO_PIN_12
441   *         @arg @ref LL_GPIO_PIN_13
442   *         @arg @ref LL_GPIO_PIN_14
443   *         @arg @ref LL_GPIO_PIN_15
444   * @retval Returned value can be one of the following values:
445   *         @arg @ref LL_GPIO_SPEED_FREQ_LOW
446   *         @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM
447   *         @arg @ref LL_GPIO_SPEED_FREQ_HIGH
448   *         @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH
449   */
LL_GPIO_GetPinSpeed(GPIO_TypeDef * GPIOx,uint32_t Pin)450 __STATIC_INLINE uint32_t LL_GPIO_GetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin)
451 {
452   return (uint32_t)(READ_BIT(GPIOx->OSPEEDR,
453                              (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U));
454 }
455 
456 /**
457   * @brief  Configure gpio pull-up or pull-down for a dedicated pin on a dedicated port.
458   * @note   Warning: only one pin can be passed as parameter.
459   * @rmtoll PUPDR        PUPDy         LL_GPIO_SetPinPull
460   * @param  GPIOx GPIO Port
461   * @param  Pin This parameter can be one of the following values:
462   *         @arg @ref LL_GPIO_PIN_0
463   *         @arg @ref LL_GPIO_PIN_1
464   *         @arg @ref LL_GPIO_PIN_2
465   *         @arg @ref LL_GPIO_PIN_3
466   *         @arg @ref LL_GPIO_PIN_4
467   *         @arg @ref LL_GPIO_PIN_5
468   *         @arg @ref LL_GPIO_PIN_6
469   *         @arg @ref LL_GPIO_PIN_7
470   *         @arg @ref LL_GPIO_PIN_8
471   *         @arg @ref LL_GPIO_PIN_9
472   *         @arg @ref LL_GPIO_PIN_10
473   *         @arg @ref LL_GPIO_PIN_11
474   *         @arg @ref LL_GPIO_PIN_12
475   *         @arg @ref LL_GPIO_PIN_13
476   *         @arg @ref LL_GPIO_PIN_14
477   *         @arg @ref LL_GPIO_PIN_15
478   * @param  Pull This parameter can be one of the following values:
479   *         @arg @ref LL_GPIO_PULL_NO
480   *         @arg @ref LL_GPIO_PULL_UP
481   *         @arg @ref LL_GPIO_PULL_DOWN
482   * @retval None
483   */
LL_GPIO_SetPinPull(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Pull)484 __STATIC_INLINE void LL_GPIO_SetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Pull)
485 {
486   MODIFY_REG(GPIOx->PUPDR, (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U)), (Pull << (POSITION_VAL(Pin) * 2U)));
487 }
488 
489 /**
490   * @brief  Return gpio pull-up or pull-down for a dedicated pin on a dedicated port
491   * @note   Warning: only one pin can be passed as parameter.
492   * @rmtoll PUPDR        PUPDy         LL_GPIO_GetPinPull
493   * @param  GPIOx GPIO Port
494   * @param  Pin This parameter can be one of the following values:
495   *         @arg @ref LL_GPIO_PIN_0
496   *         @arg @ref LL_GPIO_PIN_1
497   *         @arg @ref LL_GPIO_PIN_2
498   *         @arg @ref LL_GPIO_PIN_3
499   *         @arg @ref LL_GPIO_PIN_4
500   *         @arg @ref LL_GPIO_PIN_5
501   *         @arg @ref LL_GPIO_PIN_6
502   *         @arg @ref LL_GPIO_PIN_7
503   *         @arg @ref LL_GPIO_PIN_8
504   *         @arg @ref LL_GPIO_PIN_9
505   *         @arg @ref LL_GPIO_PIN_10
506   *         @arg @ref LL_GPIO_PIN_11
507   *         @arg @ref LL_GPIO_PIN_12
508   *         @arg @ref LL_GPIO_PIN_13
509   *         @arg @ref LL_GPIO_PIN_14
510   *         @arg @ref LL_GPIO_PIN_15
511   * @retval Returned value can be one of the following values:
512   *         @arg @ref LL_GPIO_PULL_NO
513   *         @arg @ref LL_GPIO_PULL_UP
514   *         @arg @ref LL_GPIO_PULL_DOWN
515   */
LL_GPIO_GetPinPull(GPIO_TypeDef * GPIOx,uint32_t Pin)516 __STATIC_INLINE uint32_t LL_GPIO_GetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin)
517 {
518   return (uint32_t)(READ_BIT(GPIOx->PUPDR,
519                              (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U));
520 }
521 
522 /**
523   * @brief  Configure gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port.
524   * @note   Possible values are from AF0 to AF15 depending on target.
525   * @note   Warning: only one pin can be passed as parameter.
526   * @rmtoll AFRL         AFSELy        LL_GPIO_SetAFPin_0_7
527   * @param  GPIOx GPIO Port
528   * @param  Pin This parameter can be one of the following values:
529   *         @arg @ref LL_GPIO_PIN_0
530   *         @arg @ref LL_GPIO_PIN_1
531   *         @arg @ref LL_GPIO_PIN_2
532   *         @arg @ref LL_GPIO_PIN_3
533   *         @arg @ref LL_GPIO_PIN_4
534   *         @arg @ref LL_GPIO_PIN_5
535   *         @arg @ref LL_GPIO_PIN_6
536   *         @arg @ref LL_GPIO_PIN_7
537   * @param  Alternate This parameter can be one of the following values:
538   *         @arg @ref LL_GPIO_AF_0
539   *         @arg @ref LL_GPIO_AF_1
540   *         @arg @ref LL_GPIO_AF_2
541   *         @arg @ref LL_GPIO_AF_3
542   *         @arg @ref LL_GPIO_AF_4
543   *         @arg @ref LL_GPIO_AF_5
544   *         @arg @ref LL_GPIO_AF_6
545   *         @arg @ref LL_GPIO_AF_7
546   *         @arg @ref LL_GPIO_AF_8
547   *         @arg @ref LL_GPIO_AF_9
548   *         @arg @ref LL_GPIO_AF_10
549   *         @arg @ref LL_GPIO_AF_11
550   *         @arg @ref LL_GPIO_AF_12
551   *         @arg @ref LL_GPIO_AF_13
552   *         @arg @ref LL_GPIO_AF_14
553   *         @arg @ref LL_GPIO_AF_15
554   * @retval None
555   */
LL_GPIO_SetAFPin_0_7(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Alternate)556 __STATIC_INLINE void LL_GPIO_SetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate)
557 {
558   MODIFY_REG(GPIOx->AFR[0], (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U)),
559              (Alternate << (POSITION_VAL(Pin) * 4U)));
560 }
561 
562 /**
563   * @brief  Return gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port.
564   * @rmtoll AFRL         AFSELy        LL_GPIO_GetAFPin_0_7
565   * @param  GPIOx GPIO Port
566   * @param  Pin This parameter can be one of the following values:
567   *         @arg @ref LL_GPIO_PIN_0
568   *         @arg @ref LL_GPIO_PIN_1
569   *         @arg @ref LL_GPIO_PIN_2
570   *         @arg @ref LL_GPIO_PIN_3
571   *         @arg @ref LL_GPIO_PIN_4
572   *         @arg @ref LL_GPIO_PIN_5
573   *         @arg @ref LL_GPIO_PIN_6
574   *         @arg @ref LL_GPIO_PIN_7
575   * @retval Returned value can be one of the following values:
576   *         @arg @ref LL_GPIO_AF_0
577   *         @arg @ref LL_GPIO_AF_1
578   *         @arg @ref LL_GPIO_AF_2
579   *         @arg @ref LL_GPIO_AF_3
580   *         @arg @ref LL_GPIO_AF_4
581   *         @arg @ref LL_GPIO_AF_5
582   *         @arg @ref LL_GPIO_AF_6
583   *         @arg @ref LL_GPIO_AF_7
584   *         @arg @ref LL_GPIO_AF_8
585   *         @arg @ref LL_GPIO_AF_9
586   *         @arg @ref LL_GPIO_AF_10
587   *         @arg @ref LL_GPIO_AF_11
588   *         @arg @ref LL_GPIO_AF_12
589   *         @arg @ref LL_GPIO_AF_13
590   *         @arg @ref LL_GPIO_AF_14
591   *         @arg @ref LL_GPIO_AF_15
592   */
LL_GPIO_GetAFPin_0_7(GPIO_TypeDef * GPIOx,uint32_t Pin)593 __STATIC_INLINE uint32_t LL_GPIO_GetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin)
594 {
595   return (uint32_t)(READ_BIT(GPIOx->AFR[0],
596                              (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U))) >> (POSITION_VAL(Pin) * 4U));
597 }
598 
599 /**
600   * @brief  Configure gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port.
601   * @note   Possible values are from AF0 to AF15 depending on target.
602   * @note   Warning: only one pin can be passed as parameter.
603   * @rmtoll AFRH         AFSELy        LL_GPIO_SetAFPin_8_15
604   * @param  GPIOx GPIO Port
605   * @param  Pin This parameter can be one of the following values:
606   *         @arg @ref LL_GPIO_PIN_8
607   *         @arg @ref LL_GPIO_PIN_9
608   *         @arg @ref LL_GPIO_PIN_10
609   *         @arg @ref LL_GPIO_PIN_11
610   *         @arg @ref LL_GPIO_PIN_12
611   *         @arg @ref LL_GPIO_PIN_13
612   *         @arg @ref LL_GPIO_PIN_14
613   *         @arg @ref LL_GPIO_PIN_15
614   * @param  Alternate This parameter can be one of the following values:
615   *         @arg @ref LL_GPIO_AF_0
616   *         @arg @ref LL_GPIO_AF_1
617   *         @arg @ref LL_GPIO_AF_2
618   *         @arg @ref LL_GPIO_AF_3
619   *         @arg @ref LL_GPIO_AF_4
620   *         @arg @ref LL_GPIO_AF_5
621   *         @arg @ref LL_GPIO_AF_6
622   *         @arg @ref LL_GPIO_AF_7
623   *         @arg @ref LL_GPIO_AF_8
624   *         @arg @ref LL_GPIO_AF_9
625   *         @arg @ref LL_GPIO_AF_10
626   *         @arg @ref LL_GPIO_AF_11
627   *         @arg @ref LL_GPIO_AF_12
628   *         @arg @ref LL_GPIO_AF_13
629   *         @arg @ref LL_GPIO_AF_14
630   *         @arg @ref LL_GPIO_AF_15
631   * @retval None
632   */
LL_GPIO_SetAFPin_8_15(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Alternate)633 __STATIC_INLINE void LL_GPIO_SetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate)
634 {
635   MODIFY_REG(GPIOx->AFR[1], (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U)),
636              (Alternate << (POSITION_VAL(Pin >> 8U) * 4U)));
637 }
638 
639 /**
640   * @brief  Return gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port.
641   * @note   Possible values are from AF0 to AF15 depending on target.
642   * @rmtoll AFRH         AFSELy        LL_GPIO_GetAFPin_8_15
643   * @param  GPIOx GPIO Port
644   * @param  Pin This parameter can be one of the following values:
645   *         @arg @ref LL_GPIO_PIN_8
646   *         @arg @ref LL_GPIO_PIN_9
647   *         @arg @ref LL_GPIO_PIN_10
648   *         @arg @ref LL_GPIO_PIN_11
649   *         @arg @ref LL_GPIO_PIN_12
650   *         @arg @ref LL_GPIO_PIN_13
651   *         @arg @ref LL_GPIO_PIN_14
652   *         @arg @ref LL_GPIO_PIN_15
653   * @retval Returned value can be one of the following values:
654   *         @arg @ref LL_GPIO_AF_0
655   *         @arg @ref LL_GPIO_AF_1
656   *         @arg @ref LL_GPIO_AF_2
657   *         @arg @ref LL_GPIO_AF_3
658   *         @arg @ref LL_GPIO_AF_4
659   *         @arg @ref LL_GPIO_AF_5
660   *         @arg @ref LL_GPIO_AF_6
661   *         @arg @ref LL_GPIO_AF_7
662   *         @arg @ref LL_GPIO_AF_8
663   *         @arg @ref LL_GPIO_AF_9
664   *         @arg @ref LL_GPIO_AF_10
665   *         @arg @ref LL_GPIO_AF_11
666   *         @arg @ref LL_GPIO_AF_12
667   *         @arg @ref LL_GPIO_AF_13
668   *         @arg @ref LL_GPIO_AF_14
669   *         @arg @ref LL_GPIO_AF_15
670   */
LL_GPIO_GetAFPin_8_15(GPIO_TypeDef * GPIOx,uint32_t Pin)671 __STATIC_INLINE uint32_t LL_GPIO_GetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin)
672 {
673   return (uint32_t)(READ_BIT(GPIOx->AFR[1],
674                              (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U))) >> (POSITION_VAL(Pin >> 8U) * 4U));
675 }
676 
677 
678 /**
679   * @brief  Lock configuration of several pins for a dedicated port.
680   * @note   When the lock sequence has been applied on a port bit, the
681   *         value of this port bit can no longer be modified until the
682   *         next reset.
683   * @note   Each lock bit freezes a specific configuration register
684   *         (control and alternate function registers).
685   * @rmtoll LCKR         LCKK          LL_GPIO_LockPin
686   * @param  GPIOx GPIO Port
687   * @param  PinMask This parameter can be a combination of the following values:
688   *         @arg @ref LL_GPIO_PIN_0
689   *         @arg @ref LL_GPIO_PIN_1
690   *         @arg @ref LL_GPIO_PIN_2
691   *         @arg @ref LL_GPIO_PIN_3
692   *         @arg @ref LL_GPIO_PIN_4
693   *         @arg @ref LL_GPIO_PIN_5
694   *         @arg @ref LL_GPIO_PIN_6
695   *         @arg @ref LL_GPIO_PIN_7
696   *         @arg @ref LL_GPIO_PIN_8
697   *         @arg @ref LL_GPIO_PIN_9
698   *         @arg @ref LL_GPIO_PIN_10
699   *         @arg @ref LL_GPIO_PIN_11
700   *         @arg @ref LL_GPIO_PIN_12
701   *         @arg @ref LL_GPIO_PIN_13
702   *         @arg @ref LL_GPIO_PIN_14
703   *         @arg @ref LL_GPIO_PIN_15
704   *         @arg @ref LL_GPIO_PIN_ALL
705   * @retval None
706   */
LL_GPIO_LockPin(GPIO_TypeDef * GPIOx,uint32_t PinMask)707 __STATIC_INLINE void LL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
708 {
709   __IO uint32_t temp;
710   WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask);
711   WRITE_REG(GPIOx->LCKR, PinMask);
712   WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask);
713   temp = READ_REG(GPIOx->LCKR);
714   (void) temp;
715 }
716 
717 /**
718   * @brief  Return 1 if all pins passed as parameter, of a dedicated port, are locked. else Return 0.
719   * @rmtoll LCKR         LCKy          LL_GPIO_IsPinLocked
720   * @param  GPIOx GPIO Port
721   * @param  PinMask This parameter can be a combination of the following values:
722   *         @arg @ref LL_GPIO_PIN_0
723   *         @arg @ref LL_GPIO_PIN_1
724   *         @arg @ref LL_GPIO_PIN_2
725   *         @arg @ref LL_GPIO_PIN_3
726   *         @arg @ref LL_GPIO_PIN_4
727   *         @arg @ref LL_GPIO_PIN_5
728   *         @arg @ref LL_GPIO_PIN_6
729   *         @arg @ref LL_GPIO_PIN_7
730   *         @arg @ref LL_GPIO_PIN_8
731   *         @arg @ref LL_GPIO_PIN_9
732   *         @arg @ref LL_GPIO_PIN_10
733   *         @arg @ref LL_GPIO_PIN_11
734   *         @arg @ref LL_GPIO_PIN_12
735   *         @arg @ref LL_GPIO_PIN_13
736   *         @arg @ref LL_GPIO_PIN_14
737   *         @arg @ref LL_GPIO_PIN_15
738   *         @arg @ref LL_GPIO_PIN_ALL
739   * @retval State of bit (1 or 0).
740   */
LL_GPIO_IsPinLocked(GPIO_TypeDef * GPIOx,uint32_t PinMask)741 __STATIC_INLINE uint32_t LL_GPIO_IsPinLocked(GPIO_TypeDef *GPIOx, uint32_t PinMask)
742 {
743   return (READ_BIT(GPIOx->LCKR, PinMask) == (PinMask));
744 }
745 
746 /**
747   * @brief  Return 1 if one of the pin of a dedicated port is locked. else return 0.
748   * @rmtoll LCKR         LCKK          LL_GPIO_IsAnyPinLocked
749   * @param  GPIOx GPIO Port
750   * @retval State of bit (1 or 0).
751   */
LL_GPIO_IsAnyPinLocked(GPIO_TypeDef * GPIOx)752 __STATIC_INLINE uint32_t LL_GPIO_IsAnyPinLocked(GPIO_TypeDef *GPIOx)
753 {
754   return (READ_BIT(GPIOx->LCKR, GPIO_LCKR_LCKK) == (GPIO_LCKR_LCKK));
755 }
756 
757 /**
758   * @}
759   */
760 
761 /** @defgroup GPIO_LL_EF_Data_Access Data Access
762   * @{
763   */
764 
765 /**
766   * @brief  Return full input data register value for a dedicated port.
767   * @rmtoll IDR          IDy           LL_GPIO_ReadInputPort
768   * @param  GPIOx GPIO Port
769   * @retval Input data register value of port
770   */
LL_GPIO_ReadInputPort(GPIO_TypeDef * GPIOx)771 __STATIC_INLINE uint32_t LL_GPIO_ReadInputPort(GPIO_TypeDef *GPIOx)
772 {
773   return (uint32_t)(READ_REG(GPIOx->IDR));
774 }
775 
776 /**
777   * @brief  Return if input data level for several pins of dedicated port is high or low.
778   * @rmtoll IDR          IDy           LL_GPIO_IsInputPinSet
779   * @param  GPIOx GPIO Port
780   * @param  PinMask This parameter can be a combination of the following values:
781   *         @arg @ref LL_GPIO_PIN_0
782   *         @arg @ref LL_GPIO_PIN_1
783   *         @arg @ref LL_GPIO_PIN_2
784   *         @arg @ref LL_GPIO_PIN_3
785   *         @arg @ref LL_GPIO_PIN_4
786   *         @arg @ref LL_GPIO_PIN_5
787   *         @arg @ref LL_GPIO_PIN_6
788   *         @arg @ref LL_GPIO_PIN_7
789   *         @arg @ref LL_GPIO_PIN_8
790   *         @arg @ref LL_GPIO_PIN_9
791   *         @arg @ref LL_GPIO_PIN_10
792   *         @arg @ref LL_GPIO_PIN_11
793   *         @arg @ref LL_GPIO_PIN_12
794   *         @arg @ref LL_GPIO_PIN_13
795   *         @arg @ref LL_GPIO_PIN_14
796   *         @arg @ref LL_GPIO_PIN_15
797   *         @arg @ref LL_GPIO_PIN_ALL
798   * @retval State of bit (1 or 0).
799   */
LL_GPIO_IsInputPinSet(GPIO_TypeDef * GPIOx,uint32_t PinMask)800 __STATIC_INLINE uint32_t LL_GPIO_IsInputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask)
801 {
802   return (READ_BIT(GPIOx->IDR, PinMask) == (PinMask));
803 }
804 
805 /**
806   * @brief  Write output data register for the port.
807   * @rmtoll ODR          ODy           LL_GPIO_WriteOutputPort
808   * @param  GPIOx GPIO Port
809   * @param  PortValue Level value for each pin of the port
810   * @retval None
811   */
LL_GPIO_WriteOutputPort(GPIO_TypeDef * GPIOx,uint32_t PortValue)812 __STATIC_INLINE void LL_GPIO_WriteOutputPort(GPIO_TypeDef *GPIOx, uint32_t PortValue)
813 {
814   WRITE_REG(GPIOx->ODR, PortValue);
815 }
816 
817 /**
818   * @brief  Return full output data register value for a dedicated port.
819   * @rmtoll ODR          ODy           LL_GPIO_ReadOutputPort
820   * @param  GPIOx GPIO Port
821   * @retval Output data register value of port
822   */
LL_GPIO_ReadOutputPort(GPIO_TypeDef * GPIOx)823 __STATIC_INLINE uint32_t LL_GPIO_ReadOutputPort(GPIO_TypeDef *GPIOx)
824 {
825   return (uint32_t)(READ_REG(GPIOx->ODR));
826 }
827 
828 /**
829   * @brief  Return if input data level for several pins of dedicated port is high or low.
830   * @rmtoll ODR          ODy           LL_GPIO_IsOutputPinSet
831   * @param  GPIOx GPIO Port
832   * @param  PinMask This parameter can be a combination of the following values:
833   *         @arg @ref LL_GPIO_PIN_0
834   *         @arg @ref LL_GPIO_PIN_1
835   *         @arg @ref LL_GPIO_PIN_2
836   *         @arg @ref LL_GPIO_PIN_3
837   *         @arg @ref LL_GPIO_PIN_4
838   *         @arg @ref LL_GPIO_PIN_5
839   *         @arg @ref LL_GPIO_PIN_6
840   *         @arg @ref LL_GPIO_PIN_7
841   *         @arg @ref LL_GPIO_PIN_8
842   *         @arg @ref LL_GPIO_PIN_9
843   *         @arg @ref LL_GPIO_PIN_10
844   *         @arg @ref LL_GPIO_PIN_11
845   *         @arg @ref LL_GPIO_PIN_12
846   *         @arg @ref LL_GPIO_PIN_13
847   *         @arg @ref LL_GPIO_PIN_14
848   *         @arg @ref LL_GPIO_PIN_15
849   *         @arg @ref LL_GPIO_PIN_ALL
850   * @retval State of bit (1 or 0).
851   */
LL_GPIO_IsOutputPinSet(GPIO_TypeDef * GPIOx,uint32_t PinMask)852 __STATIC_INLINE uint32_t LL_GPIO_IsOutputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask)
853 {
854   return (READ_BIT(GPIOx->ODR, PinMask) == (PinMask));
855 }
856 
857 /**
858   * @brief  Set several pins to high level on dedicated gpio port.
859   * @rmtoll BSRR         BSy           LL_GPIO_SetOutputPin
860   * @param  GPIOx GPIO Port
861   * @param  PinMask This parameter can be a combination of the following values:
862   *         @arg @ref LL_GPIO_PIN_0
863   *         @arg @ref LL_GPIO_PIN_1
864   *         @arg @ref LL_GPIO_PIN_2
865   *         @arg @ref LL_GPIO_PIN_3
866   *         @arg @ref LL_GPIO_PIN_4
867   *         @arg @ref LL_GPIO_PIN_5
868   *         @arg @ref LL_GPIO_PIN_6
869   *         @arg @ref LL_GPIO_PIN_7
870   *         @arg @ref LL_GPIO_PIN_8
871   *         @arg @ref LL_GPIO_PIN_9
872   *         @arg @ref LL_GPIO_PIN_10
873   *         @arg @ref LL_GPIO_PIN_11
874   *         @arg @ref LL_GPIO_PIN_12
875   *         @arg @ref LL_GPIO_PIN_13
876   *         @arg @ref LL_GPIO_PIN_14
877   *         @arg @ref LL_GPIO_PIN_15
878   *         @arg @ref LL_GPIO_PIN_ALL
879   * @retval None
880   */
LL_GPIO_SetOutputPin(GPIO_TypeDef * GPIOx,uint32_t PinMask)881 __STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
882 {
883   WRITE_REG(GPIOx->BSRR, PinMask);
884 }
885 
886 /**
887   * @brief  Set several pins to low level on dedicated gpio port.
888   * @rmtoll BSRR         BRy           LL_GPIO_ResetOutputPin
889   * @param  GPIOx GPIO Port
890   * @param  PinMask This parameter can be a combination of the following values:
891   *         @arg @ref LL_GPIO_PIN_0
892   *         @arg @ref LL_GPIO_PIN_1
893   *         @arg @ref LL_GPIO_PIN_2
894   *         @arg @ref LL_GPIO_PIN_3
895   *         @arg @ref LL_GPIO_PIN_4
896   *         @arg @ref LL_GPIO_PIN_5
897   *         @arg @ref LL_GPIO_PIN_6
898   *         @arg @ref LL_GPIO_PIN_7
899   *         @arg @ref LL_GPIO_PIN_8
900   *         @arg @ref LL_GPIO_PIN_9
901   *         @arg @ref LL_GPIO_PIN_10
902   *         @arg @ref LL_GPIO_PIN_11
903   *         @arg @ref LL_GPIO_PIN_12
904   *         @arg @ref LL_GPIO_PIN_13
905   *         @arg @ref LL_GPIO_PIN_14
906   *         @arg @ref LL_GPIO_PIN_15
907   *         @arg @ref LL_GPIO_PIN_ALL
908   * @retval None
909   */
LL_GPIO_ResetOutputPin(GPIO_TypeDef * GPIOx,uint32_t PinMask)910 __STATIC_INLINE void LL_GPIO_ResetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
911 {
912   WRITE_REG(GPIOx->BSRR, (PinMask << 16));
913 }
914 
915 /**
916   * @brief  Toggle data value for several pin of dedicated port.
917   * @rmtoll ODR          ODy           LL_GPIO_TogglePin
918   * @param  GPIOx GPIO Port
919   * @param  PinMask This parameter can be a combination of the following values:
920   *         @arg @ref LL_GPIO_PIN_0
921   *         @arg @ref LL_GPIO_PIN_1
922   *         @arg @ref LL_GPIO_PIN_2
923   *         @arg @ref LL_GPIO_PIN_3
924   *         @arg @ref LL_GPIO_PIN_4
925   *         @arg @ref LL_GPIO_PIN_5
926   *         @arg @ref LL_GPIO_PIN_6
927   *         @arg @ref LL_GPIO_PIN_7
928   *         @arg @ref LL_GPIO_PIN_8
929   *         @arg @ref LL_GPIO_PIN_9
930   *         @arg @ref LL_GPIO_PIN_10
931   *         @arg @ref LL_GPIO_PIN_11
932   *         @arg @ref LL_GPIO_PIN_12
933   *         @arg @ref LL_GPIO_PIN_13
934   *         @arg @ref LL_GPIO_PIN_14
935   *         @arg @ref LL_GPIO_PIN_15
936   *         @arg @ref LL_GPIO_PIN_ALL
937   * @retval None
938   */
LL_GPIO_TogglePin(GPIO_TypeDef * GPIOx,uint32_t PinMask)939 __STATIC_INLINE void LL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
940 {
941   uint32_t odr = READ_REG(GPIOx->ODR);
942   WRITE_REG(GPIOx->BSRR, ((odr & PinMask) << 16u) | (~odr & PinMask));
943 }
944 
945 /**
946   * @}
947   */
948 
949 #if defined(USE_FULL_LL_DRIVER)
950 /** @defgroup GPIO_LL_EF_Init Initialization and de-initialization functions
951   * @{
952   */
953 
954 ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx);
955 ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct);
956 void        LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct);
957 
958 /**
959   * @}
960   */
961 #endif /* USE_FULL_LL_DRIVER */
962 
963 /**
964   * @}
965   */
966 
967 /**
968   * @}
969   */
970 
971 #endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) */
972 /**
973   * @}
974   */
975 
976 #ifdef __cplusplus
977 }
978 #endif
979 
980 #endif /* __STM32F4xx_LL_GPIO_H */
981 
982