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