1 /**
2   ******************************************************************************
3   * @file    stm32l0xx_ll_gpio.h
4   * @author  MCD Application Team
5   * @brief   Header file of GPIO LL module.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2016 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 __STM32L0xx_LL_GPIO_H
21 #define __STM32L0xx_LL_GPIO_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32l0xx.h"
29 
30 /** @addtogroup STM32L0xx_LL_Driver
31   * @{
32   */
33 
34 #if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOH)
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_MODE0_0  /*!< Select output mode */
138 #define LL_GPIO_MODE_ALTERNATE             GPIO_MODER_MODE0_1  /*!< Select alternate function mode */
139 #define LL_GPIO_MODE_ANALOG                GPIO_MODER_MODE0    /*!< 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_OSPEED0_0 /*!< Select I/O medium output speed */
158 #define LL_GPIO_SPEED_FREQ_HIGH            GPIO_OSPEEDER_OSPEED0_1 /*!< Select I/O fast output speed   */
159 #define LL_GPIO_SPEED_FREQ_VERY_HIGH       GPIO_OSPEEDER_OSPEED0   /*!< Select I/O high output speed   */
160 /**
161   * @}
162   */
163 #define LL_GPIO_SPEED_LOW                  LL_GPIO_SPEED_FREQ_LOW
164 #define LL_GPIO_SPEED_MEDIUM               LL_GPIO_SPEED_FREQ_MEDIUM
165 #define LL_GPIO_SPEED_FAST                 LL_GPIO_SPEED_FREQ_HIGH
166 #define LL_GPIO_SPEED_HIGH                 LL_GPIO_SPEED_FREQ_VERY_HIGH
167 
168 /** @defgroup GPIO_LL_EC_PULL Pull Up Pull Down
169   * @{
170   */
171 #define LL_GPIO_PULL_NO                    (0x00000000U)      /*!< Select I/O no pull */
172 #define LL_GPIO_PULL_UP                    GPIO_PUPDR_PUPD0_0 /*!< Select I/O pull up */
173 #define LL_GPIO_PULL_DOWN                  GPIO_PUPDR_PUPD0_1 /*!< Select I/O pull down */
174 /**
175   * @}
176   */
177 
178 /** @defgroup GPIO_LL_EC_AF Alternate Function
179   * @{
180   */
181 #define LL_GPIO_AF_0                       (0x0000000U) /*!< Select alternate function 0 */
182 #define LL_GPIO_AF_1                       (0x0000001U) /*!< Select alternate function 1 */
183 #define LL_GPIO_AF_2                       (0x0000002U) /*!< Select alternate function 2 */
184 #define LL_GPIO_AF_3                       (0x0000003U) /*!< Select alternate function 3 */
185 #define LL_GPIO_AF_4                       (0x0000004U) /*!< Select alternate function 4 */
186 #define LL_GPIO_AF_5                       (0x0000005U) /*!< Select alternate function 5 */
187 #define LL_GPIO_AF_6                       (0x0000006U) /*!< Select alternate function 6 */
188 #define LL_GPIO_AF_7                       (0x0000007U) /*!< Select alternate function 7 */
189 /**
190   * @}
191   */
192 
193 /**
194   * @}
195   */
196 
197 /* Exported macro ------------------------------------------------------------*/
198 /** @defgroup GPIO_LL_Exported_Macros GPIO Exported Macros
199   * @{
200   */
201 
202 /** @defgroup GPIO_LL_EM_WRITE_READ Common Write and read registers Macros
203   * @{
204   */
205 
206 /**
207   * @brief  Write a value in GPIO register
208   * @param  __INSTANCE__ GPIO Instance
209   * @param  __REG__ Register to be written
210   * @param  __VALUE__ Value to be written in the register
211   * @retval None
212   */
213 #define LL_GPIO_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__))
214 
215 /**
216   * @brief  Read a value in GPIO register
217   * @param  __INSTANCE__ GPIO Instance
218   * @param  __REG__ Register to be read
219   * @retval Register value
220   */
221 #define LL_GPIO_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__)
222 /**
223   * @}
224   */
225 
226 /**
227   * @}
228   */
229 
230 /* Exported functions --------------------------------------------------------*/
231 /** @defgroup GPIO_LL_Exported_Functions GPIO Exported Functions
232   * @{
233   */
234 
235 /** @defgroup GPIO_LL_EF_Port_Configuration Port Configuration
236   * @{
237   */
238 
239 /**
240   * @brief  Configure gpio mode for a dedicated pin on dedicated port.
241   * @note   I/O mode can be Input mode, General purpose output, Alternate function mode or Analog.
242   * @note   Warning: only one pin can be passed as parameter.
243   * @rmtoll MODER        MODEy         LL_GPIO_SetPinMode
244   * @param  GPIOx GPIO Port
245   * @param  Pin This parameter can be one of the following values:
246   *         @arg @ref LL_GPIO_PIN_0
247   *         @arg @ref LL_GPIO_PIN_1
248   *         @arg @ref LL_GPIO_PIN_2
249   *         @arg @ref LL_GPIO_PIN_3
250   *         @arg @ref LL_GPIO_PIN_4
251   *         @arg @ref LL_GPIO_PIN_5
252   *         @arg @ref LL_GPIO_PIN_6
253   *         @arg @ref LL_GPIO_PIN_7
254   *         @arg @ref LL_GPIO_PIN_8
255   *         @arg @ref LL_GPIO_PIN_9
256   *         @arg @ref LL_GPIO_PIN_10
257   *         @arg @ref LL_GPIO_PIN_11
258   *         @arg @ref LL_GPIO_PIN_12
259   *         @arg @ref LL_GPIO_PIN_13
260   *         @arg @ref LL_GPIO_PIN_14
261   *         @arg @ref LL_GPIO_PIN_15
262   * @param  Mode This parameter can be one of the following values:
263   *         @arg @ref LL_GPIO_MODE_INPUT
264   *         @arg @ref LL_GPIO_MODE_OUTPUT
265   *         @arg @ref LL_GPIO_MODE_ALTERNATE
266   *         @arg @ref LL_GPIO_MODE_ANALOG
267   * @retval None
268   */
LL_GPIO_SetPinMode(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Mode)269 __STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode)
270 {
271   MODIFY_REG(GPIOx->MODER, ((Pin * Pin) * GPIO_MODER_MODE0), ((Pin * Pin) * Mode));
272 }
273 
274 /**
275   * @brief  Return gpio mode for a dedicated pin on dedicated port.
276   * @note   I/O mode can be Input mode, General purpose output, Alternate function mode or Analog.
277   * @note   Warning: only one pin can be passed as parameter.
278   * @rmtoll MODER        MODEy         LL_GPIO_GetPinMode
279   * @param  GPIOx GPIO Port
280   * @param  Pin This parameter can be one of the following values:
281   *         @arg @ref LL_GPIO_PIN_0
282   *         @arg @ref LL_GPIO_PIN_1
283   *         @arg @ref LL_GPIO_PIN_2
284   *         @arg @ref LL_GPIO_PIN_3
285   *         @arg @ref LL_GPIO_PIN_4
286   *         @arg @ref LL_GPIO_PIN_5
287   *         @arg @ref LL_GPIO_PIN_6
288   *         @arg @ref LL_GPIO_PIN_7
289   *         @arg @ref LL_GPIO_PIN_8
290   *         @arg @ref LL_GPIO_PIN_9
291   *         @arg @ref LL_GPIO_PIN_10
292   *         @arg @ref LL_GPIO_PIN_11
293   *         @arg @ref LL_GPIO_PIN_12
294   *         @arg @ref LL_GPIO_PIN_13
295   *         @arg @ref LL_GPIO_PIN_14
296   *         @arg @ref LL_GPIO_PIN_15
297   * @retval Returned value can be one of the following values:
298   *         @arg @ref LL_GPIO_MODE_INPUT
299   *         @arg @ref LL_GPIO_MODE_OUTPUT
300   *         @arg @ref LL_GPIO_MODE_ALTERNATE
301   *         @arg @ref LL_GPIO_MODE_ANALOG
302   */
LL_GPIO_GetPinMode(GPIO_TypeDef * GPIOx,uint32_t Pin)303 __STATIC_INLINE uint32_t LL_GPIO_GetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin)
304 {
305   return (uint32_t)(READ_BIT(GPIOx->MODER, ((Pin * Pin) * GPIO_MODER_MODE0)) / (Pin * Pin));
306 }
307 
308 /**
309   * @brief  Configure gpio output type for several pins on dedicated port.
310   * @note   Output type as to be set when gpio pin is in output or
311   *         alternate modes. Possible type are Push-pull or Open-drain.
312   * @rmtoll OTYPER       OTy           LL_GPIO_SetPinOutputType
313   * @param  GPIOx GPIO Port
314   * @param  PinMask This parameter can be a combination of the following values:
315   *         @arg @ref LL_GPIO_PIN_0
316   *         @arg @ref LL_GPIO_PIN_1
317   *         @arg @ref LL_GPIO_PIN_2
318   *         @arg @ref LL_GPIO_PIN_3
319   *         @arg @ref LL_GPIO_PIN_4
320   *         @arg @ref LL_GPIO_PIN_5
321   *         @arg @ref LL_GPIO_PIN_6
322   *         @arg @ref LL_GPIO_PIN_7
323   *         @arg @ref LL_GPIO_PIN_8
324   *         @arg @ref LL_GPIO_PIN_9
325   *         @arg @ref LL_GPIO_PIN_10
326   *         @arg @ref LL_GPIO_PIN_11
327   *         @arg @ref LL_GPIO_PIN_12
328   *         @arg @ref LL_GPIO_PIN_13
329   *         @arg @ref LL_GPIO_PIN_14
330   *         @arg @ref LL_GPIO_PIN_15
331   *         @arg @ref LL_GPIO_PIN_ALL
332   * @param  OutputType This parameter can be one of the following values:
333   *         @arg @ref LL_GPIO_OUTPUT_PUSHPULL
334   *         @arg @ref LL_GPIO_OUTPUT_OPENDRAIN
335   * @retval None
336   */
LL_GPIO_SetPinOutputType(GPIO_TypeDef * GPIOx,uint32_t PinMask,uint32_t OutputType)337 __STATIC_INLINE void LL_GPIO_SetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t PinMask, uint32_t OutputType)
338 {
339   MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType));
340 }
341 
342 /**
343   * @brief  Return gpio output type for several pins on dedicated port.
344   * @note   Output type as to be set when gpio pin is in output or
345   *         alternate modes. Possible type are Push-pull or Open-drain.
346   * @note   Warning: only one pin can be passed as parameter.
347   * @rmtoll OTYPER       OTy           LL_GPIO_GetPinOutputType
348   * @param  GPIOx GPIO Port
349   * @param  Pin This parameter can be one of the following values:
350   *         @arg @ref LL_GPIO_PIN_0
351   *         @arg @ref LL_GPIO_PIN_1
352   *         @arg @ref LL_GPIO_PIN_2
353   *         @arg @ref LL_GPIO_PIN_3
354   *         @arg @ref LL_GPIO_PIN_4
355   *         @arg @ref LL_GPIO_PIN_5
356   *         @arg @ref LL_GPIO_PIN_6
357   *         @arg @ref LL_GPIO_PIN_7
358   *         @arg @ref LL_GPIO_PIN_8
359   *         @arg @ref LL_GPIO_PIN_9
360   *         @arg @ref LL_GPIO_PIN_10
361   *         @arg @ref LL_GPIO_PIN_11
362   *         @arg @ref LL_GPIO_PIN_12
363   *         @arg @ref LL_GPIO_PIN_13
364   *         @arg @ref LL_GPIO_PIN_14
365   *         @arg @ref LL_GPIO_PIN_15
366   *         @arg @ref LL_GPIO_PIN_ALL
367   * @retval Returned value can be one of the following values:
368   *         @arg @ref LL_GPIO_OUTPUT_PUSHPULL
369   *         @arg @ref LL_GPIO_OUTPUT_OPENDRAIN
370   */
LL_GPIO_GetPinOutputType(GPIO_TypeDef * GPIOx,uint32_t Pin)371 __STATIC_INLINE uint32_t LL_GPIO_GetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t Pin)
372 {
373   return (uint32_t)(READ_BIT(GPIOx->OTYPER, Pin) / Pin);
374 }
375 
376 /**
377   * @brief  Configure gpio speed for a dedicated pin on dedicated port.
378   * @note   I/O speed can be Low, Medium, Fast or High speed.
379   * @note   Warning: only one pin can be passed as parameter.
380   * @note   Refer to datasheet for frequency specifications and the power
381   *         supply and load conditions for each speed.
382   * @rmtoll OSPEEDR      OSPEEDy       LL_GPIO_SetPinSpeed
383   * @param  GPIOx GPIO Port
384   * @param  Pin This parameter can be one of the following values:
385   *         @arg @ref LL_GPIO_PIN_0
386   *         @arg @ref LL_GPIO_PIN_1
387   *         @arg @ref LL_GPIO_PIN_2
388   *         @arg @ref LL_GPIO_PIN_3
389   *         @arg @ref LL_GPIO_PIN_4
390   *         @arg @ref LL_GPIO_PIN_5
391   *         @arg @ref LL_GPIO_PIN_6
392   *         @arg @ref LL_GPIO_PIN_7
393   *         @arg @ref LL_GPIO_PIN_8
394   *         @arg @ref LL_GPIO_PIN_9
395   *         @arg @ref LL_GPIO_PIN_10
396   *         @arg @ref LL_GPIO_PIN_11
397   *         @arg @ref LL_GPIO_PIN_12
398   *         @arg @ref LL_GPIO_PIN_13
399   *         @arg @ref LL_GPIO_PIN_14
400   *         @arg @ref LL_GPIO_PIN_15
401   * @param  Speed This parameter can be one of the following values:
402   *         @arg @ref LL_GPIO_SPEED_FREQ_LOW
403   *         @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM
404   *         @arg @ref LL_GPIO_SPEED_FREQ_HIGH
405   *         @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH
406   * @retval None
407   */
LL_GPIO_SetPinSpeed(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Speed)408 __STATIC_INLINE void LL_GPIO_SetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t  Speed)
409 {
410   MODIFY_REG(GPIOx->OSPEEDR, ((Pin * Pin) * GPIO_OSPEEDER_OSPEED0), ((Pin * Pin) * Speed));
411 }
412 
413 /**
414   * @brief  Return gpio speed for a dedicated pin on dedicated port.
415   * @note   I/O speed can be Low, Medium, Fast or High speed.
416   * @note   Warning: only one pin can be passed as parameter.
417   * @note   Refer to datasheet for frequency specifications and the power
418   *         supply and load conditions for each speed.
419   * @rmtoll OSPEEDR      OSPEEDy       LL_GPIO_GetPinSpeed
420   * @param  GPIOx GPIO Port
421   * @param  Pin This parameter can be one of the following values:
422   *         @arg @ref LL_GPIO_PIN_0
423   *         @arg @ref LL_GPIO_PIN_1
424   *         @arg @ref LL_GPIO_PIN_2
425   *         @arg @ref LL_GPIO_PIN_3
426   *         @arg @ref LL_GPIO_PIN_4
427   *         @arg @ref LL_GPIO_PIN_5
428   *         @arg @ref LL_GPIO_PIN_6
429   *         @arg @ref LL_GPIO_PIN_7
430   *         @arg @ref LL_GPIO_PIN_8
431   *         @arg @ref LL_GPIO_PIN_9
432   *         @arg @ref LL_GPIO_PIN_10
433   *         @arg @ref LL_GPIO_PIN_11
434   *         @arg @ref LL_GPIO_PIN_12
435   *         @arg @ref LL_GPIO_PIN_13
436   *         @arg @ref LL_GPIO_PIN_14
437   *         @arg @ref LL_GPIO_PIN_15
438   * @retval Returned value can be one of the following values:
439   *         @arg @ref LL_GPIO_SPEED_FREQ_LOW
440   *         @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM
441   *         @arg @ref LL_GPIO_SPEED_FREQ_HIGH
442   *         @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH
443   */
LL_GPIO_GetPinSpeed(GPIO_TypeDef * GPIOx,uint32_t Pin)444 __STATIC_INLINE uint32_t LL_GPIO_GetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin)
445 {
446   return (uint32_t)(READ_BIT(GPIOx->OSPEEDR, ((Pin * Pin) * GPIO_OSPEEDER_OSPEED0)) / (Pin * Pin));
447 }
448 
449 /**
450   * @brief  Configure gpio pull-up or pull-down for a dedicated pin on a dedicated port.
451   * @note   Warning: only one pin can be passed as parameter.
452   * @rmtoll PUPDR        PUPDy         LL_GPIO_SetPinPull
453   * @param  GPIOx GPIO Port
454   * @param  Pin This parameter can be one of the following values:
455   *         @arg @ref LL_GPIO_PIN_0
456   *         @arg @ref LL_GPIO_PIN_1
457   *         @arg @ref LL_GPIO_PIN_2
458   *         @arg @ref LL_GPIO_PIN_3
459   *         @arg @ref LL_GPIO_PIN_4
460   *         @arg @ref LL_GPIO_PIN_5
461   *         @arg @ref LL_GPIO_PIN_6
462   *         @arg @ref LL_GPIO_PIN_7
463   *         @arg @ref LL_GPIO_PIN_8
464   *         @arg @ref LL_GPIO_PIN_9
465   *         @arg @ref LL_GPIO_PIN_10
466   *         @arg @ref LL_GPIO_PIN_11
467   *         @arg @ref LL_GPIO_PIN_12
468   *         @arg @ref LL_GPIO_PIN_13
469   *         @arg @ref LL_GPIO_PIN_14
470   *         @arg @ref LL_GPIO_PIN_15
471   * @param  Pull This parameter can be one of the following values:
472   *         @arg @ref LL_GPIO_PULL_NO
473   *         @arg @ref LL_GPIO_PULL_UP
474   *         @arg @ref LL_GPIO_PULL_DOWN
475   * @retval None
476   */
LL_GPIO_SetPinPull(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Pull)477 __STATIC_INLINE void LL_GPIO_SetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Pull)
478 {
479   MODIFY_REG(GPIOx->PUPDR, ((Pin * Pin) * GPIO_PUPDR_PUPD0), ((Pin * Pin) * Pull));
480 }
481 
482 /**
483   * @brief  Return gpio pull-up or pull-down for a dedicated pin on a dedicated port
484   * @note   Warning: only one pin can be passed as parameter.
485   * @rmtoll PUPDR        PUPDy         LL_GPIO_GetPinPull
486   * @param  GPIOx GPIO Port
487   * @param  Pin This parameter can be one of the following values:
488   *         @arg @ref LL_GPIO_PIN_0
489   *         @arg @ref LL_GPIO_PIN_1
490   *         @arg @ref LL_GPIO_PIN_2
491   *         @arg @ref LL_GPIO_PIN_3
492   *         @arg @ref LL_GPIO_PIN_4
493   *         @arg @ref LL_GPIO_PIN_5
494   *         @arg @ref LL_GPIO_PIN_6
495   *         @arg @ref LL_GPIO_PIN_7
496   *         @arg @ref LL_GPIO_PIN_8
497   *         @arg @ref LL_GPIO_PIN_9
498   *         @arg @ref LL_GPIO_PIN_10
499   *         @arg @ref LL_GPIO_PIN_11
500   *         @arg @ref LL_GPIO_PIN_12
501   *         @arg @ref LL_GPIO_PIN_13
502   *         @arg @ref LL_GPIO_PIN_14
503   *         @arg @ref LL_GPIO_PIN_15
504   * @retval Returned value can be one of the following values:
505   *         @arg @ref LL_GPIO_PULL_NO
506   *         @arg @ref LL_GPIO_PULL_UP
507   *         @arg @ref LL_GPIO_PULL_DOWN
508   */
LL_GPIO_GetPinPull(GPIO_TypeDef * GPIOx,uint32_t Pin)509 __STATIC_INLINE uint32_t LL_GPIO_GetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin)
510 {
511   return (uint32_t)(READ_BIT(GPIOx->PUPDR, ((Pin * Pin) * GPIO_PUPDR_PUPD0)) / (Pin * Pin));
512 }
513 
514 /**
515   * @brief  Configure gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port.
516   * @note   Possible values are from AF0 to AF7 depending on target.
517   * @note   Warning: only one pin can be passed as parameter.
518   * @rmtoll AFRL         AFSELy        LL_GPIO_SetAFPin_0_7
519   * @param  GPIOx GPIO Port
520   * @param  Pin This parameter can be one of the following values:
521   *         @arg @ref LL_GPIO_PIN_0
522   *         @arg @ref LL_GPIO_PIN_1
523   *         @arg @ref LL_GPIO_PIN_2
524   *         @arg @ref LL_GPIO_PIN_3
525   *         @arg @ref LL_GPIO_PIN_4
526   *         @arg @ref LL_GPIO_PIN_5
527   *         @arg @ref LL_GPIO_PIN_6
528   *         @arg @ref LL_GPIO_PIN_7
529   * @param  Alternate This parameter can be one of the following values:
530   *         @arg @ref LL_GPIO_AF_0
531   *         @arg @ref LL_GPIO_AF_1
532   *         @arg @ref LL_GPIO_AF_2
533   *         @arg @ref LL_GPIO_AF_3
534   *         @arg @ref LL_GPIO_AF_4
535   *         @arg @ref LL_GPIO_AF_5
536   *         @arg @ref LL_GPIO_AF_6
537   *         @arg @ref LL_GPIO_AF_7
538   * @retval None
539   */
LL_GPIO_SetAFPin_0_7(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Alternate)540 __STATIC_INLINE void LL_GPIO_SetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate)
541 {
542   MODIFY_REG(GPIOx->AFR[0], ((((Pin * Pin) * Pin) * Pin) * GPIO_AFRL_AFSEL0),
543              ((((Pin * Pin) * Pin) * Pin) * Alternate));
544 }
545 
546 /**
547   * @brief  Return gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port.
548   * @rmtoll AFRL         AFSELy        LL_GPIO_GetAFPin_0_7
549   * @param  GPIOx GPIO Port
550   * @param  Pin This parameter can be one of the following values:
551   *         @arg @ref LL_GPIO_PIN_0
552   *         @arg @ref LL_GPIO_PIN_1
553   *         @arg @ref LL_GPIO_PIN_2
554   *         @arg @ref LL_GPIO_PIN_3
555   *         @arg @ref LL_GPIO_PIN_4
556   *         @arg @ref LL_GPIO_PIN_5
557   *         @arg @ref LL_GPIO_PIN_6
558   *         @arg @ref LL_GPIO_PIN_7
559   * @retval Returned value can be one of the following values:
560   *         @arg @ref LL_GPIO_AF_0
561   *         @arg @ref LL_GPIO_AF_1
562   *         @arg @ref LL_GPIO_AF_2
563   *         @arg @ref LL_GPIO_AF_3
564   *         @arg @ref LL_GPIO_AF_4
565   *         @arg @ref LL_GPIO_AF_5
566   *         @arg @ref LL_GPIO_AF_6
567   *         @arg @ref LL_GPIO_AF_7
568   */
LL_GPIO_GetAFPin_0_7(GPIO_TypeDef * GPIOx,uint32_t Pin)569 __STATIC_INLINE uint32_t LL_GPIO_GetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin)
570 {
571   return (uint32_t)(READ_BIT(GPIOx->AFR[0],
572                              ((((Pin * Pin) * Pin) * Pin) * GPIO_AFRL_AFSEL0)) / (((Pin * Pin) * Pin) * Pin));
573 }
574 
575 /**
576   * @brief  Configure gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port.
577   * @note   Possible values are from AF0 to AF7 depending on target.
578   * @note   Warning: only one pin can be passed as parameter.
579   * @rmtoll AFRH         AFSELy        LL_GPIO_SetAFPin_8_15
580   * @param  GPIOx GPIO Port
581   * @param  Pin This parameter can be one of the following values:
582   *         @arg @ref LL_GPIO_PIN_8
583   *         @arg @ref LL_GPIO_PIN_9
584   *         @arg @ref LL_GPIO_PIN_10
585   *         @arg @ref LL_GPIO_PIN_11
586   *         @arg @ref LL_GPIO_PIN_12
587   *         @arg @ref LL_GPIO_PIN_13
588   *         @arg @ref LL_GPIO_PIN_14
589   *         @arg @ref LL_GPIO_PIN_15
590   * @param  Alternate This parameter can be one of the following values:
591   *         @arg @ref LL_GPIO_AF_0
592   *         @arg @ref LL_GPIO_AF_1
593   *         @arg @ref LL_GPIO_AF_2
594   *         @arg @ref LL_GPIO_AF_3
595   *         @arg @ref LL_GPIO_AF_4
596   *         @arg @ref LL_GPIO_AF_5
597   *         @arg @ref LL_GPIO_AF_6
598   *         @arg @ref LL_GPIO_AF_7
599   * @retval None
600   */
LL_GPIO_SetAFPin_8_15(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Alternate)601 __STATIC_INLINE void LL_GPIO_SetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate)
602 {
603   MODIFY_REG(GPIOx->AFR[1], (((((Pin >> 8U) * (Pin >> 8U)) * (Pin >> 8U)) * (Pin >> 8U)) * GPIO_AFRH_AFSEL8),
604              (((((Pin >> 8U) * (Pin >> 8U)) * (Pin >> 8U)) * (Pin >> 8U)) * Alternate));
605 }
606 
607 /**
608   * @brief  Return gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port.
609   * @note   Possible values are from AF0 to AF7 depending on target.
610   * @rmtoll AFRH         AFSELy        LL_GPIO_GetAFPin_8_15
611   * @param  GPIOx GPIO Port
612   * @param  Pin This parameter can be one of the following values:
613   *         @arg @ref LL_GPIO_PIN_8
614   *         @arg @ref LL_GPIO_PIN_9
615   *         @arg @ref LL_GPIO_PIN_10
616   *         @arg @ref LL_GPIO_PIN_11
617   *         @arg @ref LL_GPIO_PIN_12
618   *         @arg @ref LL_GPIO_PIN_13
619   *         @arg @ref LL_GPIO_PIN_14
620   *         @arg @ref LL_GPIO_PIN_15
621   * @retval Returned value can be one of the following values:
622   *         @arg @ref LL_GPIO_AF_0
623   *         @arg @ref LL_GPIO_AF_1
624   *         @arg @ref LL_GPIO_AF_2
625   *         @arg @ref LL_GPIO_AF_3
626   *         @arg @ref LL_GPIO_AF_4
627   *         @arg @ref LL_GPIO_AF_5
628   *         @arg @ref LL_GPIO_AF_6
629   *         @arg @ref LL_GPIO_AF_7
630   */
LL_GPIO_GetAFPin_8_15(GPIO_TypeDef * GPIOx,uint32_t Pin)631 __STATIC_INLINE uint32_t LL_GPIO_GetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin)
632 {
633   return (uint32_t)(READ_BIT(GPIOx->AFR[1],
634                              (((((Pin >> 8U) * (Pin >> 8U)) * (Pin >> 8U)) * (Pin >> 8U)) * GPIO_AFRH_AFSEL8)) / ((((Pin >> 8U) *
635                                  (Pin >> 8U)) * (Pin >> 8U)) * (Pin >> 8U)));
636 }
637 
638 
639 /**
640   * @brief  Lock configuration of several pins for a dedicated port.
641   * @note   When the lock sequence has been applied on a port bit, the
642   *         value of this port bit can no longer be modified until the
643   *         next reset.
644   * @note   Each lock bit freezes a specific configuration register
645   *         (control and alternate function registers).
646   * @rmtoll LCKR         LCKK          LL_GPIO_LockPin
647   * @param  GPIOx GPIO Port
648   * @param  PinMask This parameter can be a combination of the following values:
649   *         @arg @ref LL_GPIO_PIN_0
650   *         @arg @ref LL_GPIO_PIN_1
651   *         @arg @ref LL_GPIO_PIN_2
652   *         @arg @ref LL_GPIO_PIN_3
653   *         @arg @ref LL_GPIO_PIN_4
654   *         @arg @ref LL_GPIO_PIN_5
655   *         @arg @ref LL_GPIO_PIN_6
656   *         @arg @ref LL_GPIO_PIN_7
657   *         @arg @ref LL_GPIO_PIN_8
658   *         @arg @ref LL_GPIO_PIN_9
659   *         @arg @ref LL_GPIO_PIN_10
660   *         @arg @ref LL_GPIO_PIN_11
661   *         @arg @ref LL_GPIO_PIN_12
662   *         @arg @ref LL_GPIO_PIN_13
663   *         @arg @ref LL_GPIO_PIN_14
664   *         @arg @ref LL_GPIO_PIN_15
665   *         @arg @ref LL_GPIO_PIN_ALL
666   * @retval None
667   */
LL_GPIO_LockPin(GPIO_TypeDef * GPIOx,uint32_t PinMask)668 __STATIC_INLINE void LL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
669 {
670   __IO uint32_t temp;
671   WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask);
672   WRITE_REG(GPIOx->LCKR, PinMask);
673   WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask);
674   /* Read LCKK register. This read is mandatory to complete key lock sequence */
675   temp = READ_REG(GPIOx->LCKR);
676   (void) temp;
677 }
678 
679 /**
680   * @brief  Return 1 if all pins passed as parameter, of a dedicated port, are locked. else Return 0.
681   * @rmtoll LCKR         LCKy          LL_GPIO_IsPinLocked
682   * @param  GPIOx GPIO Port
683   * @param  PinMask This parameter can be a combination of the following values:
684   *         @arg @ref LL_GPIO_PIN_0
685   *         @arg @ref LL_GPIO_PIN_1
686   *         @arg @ref LL_GPIO_PIN_2
687   *         @arg @ref LL_GPIO_PIN_3
688   *         @arg @ref LL_GPIO_PIN_4
689   *         @arg @ref LL_GPIO_PIN_5
690   *         @arg @ref LL_GPIO_PIN_6
691   *         @arg @ref LL_GPIO_PIN_7
692   *         @arg @ref LL_GPIO_PIN_8
693   *         @arg @ref LL_GPIO_PIN_9
694   *         @arg @ref LL_GPIO_PIN_10
695   *         @arg @ref LL_GPIO_PIN_11
696   *         @arg @ref LL_GPIO_PIN_12
697   *         @arg @ref LL_GPIO_PIN_13
698   *         @arg @ref LL_GPIO_PIN_14
699   *         @arg @ref LL_GPIO_PIN_15
700   *         @arg @ref LL_GPIO_PIN_ALL
701   * @retval State of bit (1 or 0).
702   */
LL_GPIO_IsPinLocked(GPIO_TypeDef * GPIOx,uint32_t PinMask)703 __STATIC_INLINE uint32_t LL_GPIO_IsPinLocked(GPIO_TypeDef *GPIOx, uint32_t PinMask)
704 {
705   return (READ_BIT(GPIOx->LCKR, PinMask) == (PinMask));
706 }
707 
708 /**
709   * @brief  Return 1 if one of the pin of a dedicated port is locked. else return 0.
710   * @rmtoll LCKR         LCKK          LL_GPIO_IsAnyPinLocked
711   * @param  GPIOx GPIO Port
712   * @retval State of bit (1 or 0).
713   */
LL_GPIO_IsAnyPinLocked(GPIO_TypeDef * GPIOx)714 __STATIC_INLINE uint32_t LL_GPIO_IsAnyPinLocked(GPIO_TypeDef *GPIOx)
715 {
716   return (READ_BIT(GPIOx->LCKR, GPIO_LCKR_LCKK) == (GPIO_LCKR_LCKK));
717 }
718 
719 /**
720   * @}
721   */
722 
723 /** @defgroup GPIO_LL_EF_Data_Access Data Access
724   * @{
725   */
726 
727 /**
728   * @brief  Return full input data register value for a dedicated port.
729   * @rmtoll IDR          IDy           LL_GPIO_ReadInputPort
730   * @param  GPIOx GPIO Port
731   * @retval Input data register value of port
732   */
LL_GPIO_ReadInputPort(GPIO_TypeDef * GPIOx)733 __STATIC_INLINE uint32_t LL_GPIO_ReadInputPort(GPIO_TypeDef *GPIOx)
734 {
735   return (uint32_t)(READ_REG(GPIOx->IDR));
736 }
737 
738 /**
739   * @brief  Return if input data level for several pins of dedicated port is high or low.
740   * @rmtoll IDR          IDy           LL_GPIO_IsInputPinSet
741   * @param  GPIOx GPIO Port
742   * @param  PinMask This parameter can be a combination of the following values:
743   *         @arg @ref LL_GPIO_PIN_0
744   *         @arg @ref LL_GPIO_PIN_1
745   *         @arg @ref LL_GPIO_PIN_2
746   *         @arg @ref LL_GPIO_PIN_3
747   *         @arg @ref LL_GPIO_PIN_4
748   *         @arg @ref LL_GPIO_PIN_5
749   *         @arg @ref LL_GPIO_PIN_6
750   *         @arg @ref LL_GPIO_PIN_7
751   *         @arg @ref LL_GPIO_PIN_8
752   *         @arg @ref LL_GPIO_PIN_9
753   *         @arg @ref LL_GPIO_PIN_10
754   *         @arg @ref LL_GPIO_PIN_11
755   *         @arg @ref LL_GPIO_PIN_12
756   *         @arg @ref LL_GPIO_PIN_13
757   *         @arg @ref LL_GPIO_PIN_14
758   *         @arg @ref LL_GPIO_PIN_15
759   *         @arg @ref LL_GPIO_PIN_ALL
760   * @retval State of bit (1 or 0).
761   */
LL_GPIO_IsInputPinSet(GPIO_TypeDef * GPIOx,uint32_t PinMask)762 __STATIC_INLINE uint32_t LL_GPIO_IsInputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask)
763 {
764   return (READ_BIT(GPIOx->IDR, PinMask) == (PinMask));
765 }
766 
767 /**
768   * @brief  Write output data register for the port.
769   * @rmtoll ODR          ODy           LL_GPIO_WriteOutputPort
770   * @param  GPIOx GPIO Port
771   * @param  PortValue Level value for each pin of the port
772   * @retval None
773   */
LL_GPIO_WriteOutputPort(GPIO_TypeDef * GPIOx,uint32_t PortValue)774 __STATIC_INLINE void LL_GPIO_WriteOutputPort(GPIO_TypeDef *GPIOx, uint32_t PortValue)
775 {
776   WRITE_REG(GPIOx->ODR, PortValue);
777 }
778 
779 /**
780   * @brief  Return full output data register value for a dedicated port.
781   * @rmtoll ODR          ODy           LL_GPIO_ReadOutputPort
782   * @param  GPIOx GPIO Port
783   * @retval Output data register value of port
784   */
LL_GPIO_ReadOutputPort(GPIO_TypeDef * GPIOx)785 __STATIC_INLINE uint32_t LL_GPIO_ReadOutputPort(GPIO_TypeDef *GPIOx)
786 {
787   return (uint32_t)(READ_REG(GPIOx->ODR));
788 }
789 
790 /**
791   * @brief  Return if input data level for several pins of dedicated port is high or low.
792   * @rmtoll ODR          ODy           LL_GPIO_IsOutputPinSet
793   * @param  GPIOx GPIO Port
794   * @param  PinMask This parameter can be a combination of the following values:
795   *         @arg @ref LL_GPIO_PIN_0
796   *         @arg @ref LL_GPIO_PIN_1
797   *         @arg @ref LL_GPIO_PIN_2
798   *         @arg @ref LL_GPIO_PIN_3
799   *         @arg @ref LL_GPIO_PIN_4
800   *         @arg @ref LL_GPIO_PIN_5
801   *         @arg @ref LL_GPIO_PIN_6
802   *         @arg @ref LL_GPIO_PIN_7
803   *         @arg @ref LL_GPIO_PIN_8
804   *         @arg @ref LL_GPIO_PIN_9
805   *         @arg @ref LL_GPIO_PIN_10
806   *         @arg @ref LL_GPIO_PIN_11
807   *         @arg @ref LL_GPIO_PIN_12
808   *         @arg @ref LL_GPIO_PIN_13
809   *         @arg @ref LL_GPIO_PIN_14
810   *         @arg @ref LL_GPIO_PIN_15
811   *         @arg @ref LL_GPIO_PIN_ALL
812   * @retval State of bit (1 or 0).
813   */
LL_GPIO_IsOutputPinSet(GPIO_TypeDef * GPIOx,uint32_t PinMask)814 __STATIC_INLINE uint32_t LL_GPIO_IsOutputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask)
815 {
816   return (READ_BIT(GPIOx->ODR, PinMask) == (PinMask));
817 }
818 
819 /**
820   * @brief  Set several pins to high level on dedicated gpio port.
821   * @rmtoll BSRR         BSy           LL_GPIO_SetOutputPin
822   * @param  GPIOx GPIO Port
823   * @param  PinMask This parameter can be a combination of the following values:
824   *         @arg @ref LL_GPIO_PIN_0
825   *         @arg @ref LL_GPIO_PIN_1
826   *         @arg @ref LL_GPIO_PIN_2
827   *         @arg @ref LL_GPIO_PIN_3
828   *         @arg @ref LL_GPIO_PIN_4
829   *         @arg @ref LL_GPIO_PIN_5
830   *         @arg @ref LL_GPIO_PIN_6
831   *         @arg @ref LL_GPIO_PIN_7
832   *         @arg @ref LL_GPIO_PIN_8
833   *         @arg @ref LL_GPIO_PIN_9
834   *         @arg @ref LL_GPIO_PIN_10
835   *         @arg @ref LL_GPIO_PIN_11
836   *         @arg @ref LL_GPIO_PIN_12
837   *         @arg @ref LL_GPIO_PIN_13
838   *         @arg @ref LL_GPIO_PIN_14
839   *         @arg @ref LL_GPIO_PIN_15
840   *         @arg @ref LL_GPIO_PIN_ALL
841   * @retval None
842   */
LL_GPIO_SetOutputPin(GPIO_TypeDef * GPIOx,uint32_t PinMask)843 __STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
844 {
845   WRITE_REG(GPIOx->BSRR, PinMask);
846 }
847 
848 /**
849   * @brief  Set several pins to low level on dedicated gpio port.
850   * @rmtoll BRR          BRy           LL_GPIO_ResetOutputPin
851   * @param  GPIOx GPIO Port
852   * @param  PinMask This parameter can be a combination of the following values:
853   *         @arg @ref LL_GPIO_PIN_0
854   *         @arg @ref LL_GPIO_PIN_1
855   *         @arg @ref LL_GPIO_PIN_2
856   *         @arg @ref LL_GPIO_PIN_3
857   *         @arg @ref LL_GPIO_PIN_4
858   *         @arg @ref LL_GPIO_PIN_5
859   *         @arg @ref LL_GPIO_PIN_6
860   *         @arg @ref LL_GPIO_PIN_7
861   *         @arg @ref LL_GPIO_PIN_8
862   *         @arg @ref LL_GPIO_PIN_9
863   *         @arg @ref LL_GPIO_PIN_10
864   *         @arg @ref LL_GPIO_PIN_11
865   *         @arg @ref LL_GPIO_PIN_12
866   *         @arg @ref LL_GPIO_PIN_13
867   *         @arg @ref LL_GPIO_PIN_14
868   *         @arg @ref LL_GPIO_PIN_15
869   *         @arg @ref LL_GPIO_PIN_ALL
870   * @retval None
871   */
LL_GPIO_ResetOutputPin(GPIO_TypeDef * GPIOx,uint32_t PinMask)872 __STATIC_INLINE void LL_GPIO_ResetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
873 {
874   WRITE_REG(GPIOx->BRR, PinMask);
875 }
876 
877 /**
878   * @brief  Toggle data value for several pin of dedicated port.
879   * @rmtoll ODR          ODy           LL_GPIO_TogglePin
880   * @param  GPIOx GPIO Port
881   * @param  PinMask This parameter can be a combination of the following values:
882   *         @arg @ref LL_GPIO_PIN_0
883   *         @arg @ref LL_GPIO_PIN_1
884   *         @arg @ref LL_GPIO_PIN_2
885   *         @arg @ref LL_GPIO_PIN_3
886   *         @arg @ref LL_GPIO_PIN_4
887   *         @arg @ref LL_GPIO_PIN_5
888   *         @arg @ref LL_GPIO_PIN_6
889   *         @arg @ref LL_GPIO_PIN_7
890   *         @arg @ref LL_GPIO_PIN_8
891   *         @arg @ref LL_GPIO_PIN_9
892   *         @arg @ref LL_GPIO_PIN_10
893   *         @arg @ref LL_GPIO_PIN_11
894   *         @arg @ref LL_GPIO_PIN_12
895   *         @arg @ref LL_GPIO_PIN_13
896   *         @arg @ref LL_GPIO_PIN_14
897   *         @arg @ref LL_GPIO_PIN_15
898   *         @arg @ref LL_GPIO_PIN_ALL
899   * @retval None
900   */
LL_GPIO_TogglePin(GPIO_TypeDef * GPIOx,uint32_t PinMask)901 __STATIC_INLINE void LL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
902 {
903   uint32_t odr = READ_REG(GPIOx->ODR);
904   WRITE_REG(GPIOx->BSRR, ((odr & PinMask) << 16u) | (~odr & PinMask));
905 }
906 
907 /**
908   * @}
909   */
910 
911 #if defined(USE_FULL_LL_DRIVER)
912 /** @defgroup GPIO_LL_EF_Init Initialization and de-initialization functions
913   * @{
914   */
915 
916 ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx);
917 ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct);
918 void        LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct);
919 
920 /**
921   * @}
922   */
923 #endif /* USE_FULL_LL_DRIVER */
924 
925 /**
926   * @}
927   */
928 
929 /**
930   * @}
931   */
932 
933 #endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOH) */
934 /**
935   * @}
936   */
937 
938 #ifdef __cplusplus
939 }
940 #endif
941 
942 #endif /* __STM32L0xx_LL_GPIO_H */
943 
944