1 /**
2   ******************************************************************************
3   * @file    stm32n6xx_ll_gpio.h
4   * @author  GPM Application Team
5   * @brief   Header for ll_gpio.c module.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2023 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 STM32N6xx_LL_GPIO_H
21 #define STM32N6xx_LL_GPIO_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32n6xx.h"
29 
30 /** @addtogroup STM32N6xx_LL_Driver
31   * @{
32   */
33 
34 #if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPION) || defined (GPIOO) || defined (GPIOP) || defined (GPIOQ)
35 /** @defgroup GPIO_LL GPIO
36   * @{
37   */
38 /** MISRA C:2012 deviation rule has been granted for following rules:
39   * Rule-18.1_d - Medium: Array pointer `GPIOx' is accessed with index [..,..]
40   * which may be out of array bounds [..,UNKNOWN] in following APIs:
41   * LL_GPIO_GetAFPin_0_7
42   * LL_GPIO_SetAFPin_0_7
43   * LL_GPIO_SetAFPin_8_15
44   * LL_GPIO_GetAFPin_8_15
45   */
46 
47 /* Private types -------------------------------------------------------------*/
48 /* Private variables ---------------------------------------------------------*/
49 /* Private constants ---------------------------------------------------------*/
50 /* Private macros ------------------------------------------------------------*/
51 #if defined(USE_FULL_LL_DRIVER)
52 /** @defgroup GPIO_LL_Private_Macros GPIO Private Macros
53   * @{
54   */
55 
56 /**
57   * @}
58   */
59 #endif /*USE_FULL_LL_DRIVER*/
60 
61 /* Exported types ------------------------------------------------------------*/
62 #if defined(USE_FULL_LL_DRIVER)
63 /** @defgroup GPIO_LL_ES_INIT GPIO Exported Init structures
64   * @{
65   */
66 
67 /**
68   * @brief LL GPIO Init Structure definition
69   */
70 typedef struct
71 {
72   uint32_t Pin;          /*!< Specifies the GPIO pins to be configured.
73                               This parameter can be any value of @ref GPIO_LL_EC_PIN */
74 
75   uint32_t Mode;         /*!< Specifies the operating mode for the selected pins.
76                               This parameter can be a value of @ref GPIO_LL_EC_MODE.
77 
78                               GPIO HW configuration can be modified afterwards using unitary function
79                               @ref LL_GPIO_SetPinMode().*/
80 
81   uint32_t Speed;        /*!< Specifies the speed for the selected pins.
82                               This parameter can be a value of @ref GPIO_LL_EC_SPEED.
83 
84                               GPIO HW configuration can be modified afterwards using unitary function
85                               @ref LL_GPIO_SetPinSpeed().*/
86 
87   uint32_t OutputType;   /*!< Specifies the operating output type for the selected pins.
88                               This parameter can be a value of @ref GPIO_LL_EC_OUTPUT.
89 
90                               GPIO HW configuration can be modified afterwards using unitary function
91                               @ref LL_GPIO_SetPinOutputType().*/
92 
93   uint32_t Pull;         /*!< Specifies the operating Pull-up/Pull down for the selected pins.
94                               This parameter can be a value of @ref GPIO_LL_EC_PULL.
95 
96                               GPIO HW configuration can be modified afterwards using unitary function
97                               @ref LL_GPIO_SetPinPull().*/
98 
99   uint32_t Alternate;    /*!< Specifies the Peripheral to be connected to the selected pins.
100                               This parameter can be a value of @ref GPIO_LL_EC_AF.
101 
102                               GPIO HW configuration can be modified afterwards using unitary function
103                               @ref LL_GPIO_SetAFPin_0_7() and LL_GPIO_SetAFPin_8_15().*/
104 } LL_GPIO_InitTypeDef;
105 
106 /**
107   * @}
108   */
109 #endif /* USE_FULL_LL_DRIVER */
110 
111 /* Exported constants --------------------------------------------------------*/
112 /** @defgroup GPIO_LL_Exported_Constants GPIO Exported Constants
113   * @{
114   */
115 
116 /** @defgroup GPIO_LL_EC_PIN PIN
117   * @{
118   */
119 #define LL_GPIO_PIN_0                      GPIO_BSRR_BS0 /*!< Select pin 0 */
120 #define LL_GPIO_PIN_1                      GPIO_BSRR_BS1 /*!< Select pin 1 */
121 #define LL_GPIO_PIN_2                      GPIO_BSRR_BS2 /*!< Select pin 2 */
122 #define LL_GPIO_PIN_3                      GPIO_BSRR_BS3 /*!< Select pin 3 */
123 #define LL_GPIO_PIN_4                      GPIO_BSRR_BS4 /*!< Select pin 4 */
124 #define LL_GPIO_PIN_5                      GPIO_BSRR_BS5 /*!< Select pin 5 */
125 #define LL_GPIO_PIN_6                      GPIO_BSRR_BS6 /*!< Select pin 6 */
126 #define LL_GPIO_PIN_7                      GPIO_BSRR_BS7 /*!< Select pin 7 */
127 #define LL_GPIO_PIN_8                      GPIO_BSRR_BS8 /*!< Select pin 8 */
128 #define LL_GPIO_PIN_9                      GPIO_BSRR_BS9 /*!< Select pin 9 */
129 #define LL_GPIO_PIN_10                     GPIO_BSRR_BS10 /*!< Select pin 10 */
130 #define LL_GPIO_PIN_11                     GPIO_BSRR_BS11 /*!< Select pin 11 */
131 #define LL_GPIO_PIN_12                     GPIO_BSRR_BS12 /*!< Select pin 12 */
132 #define LL_GPIO_PIN_13                     GPIO_BSRR_BS13 /*!< Select pin 13 */
133 #define LL_GPIO_PIN_14                     GPIO_BSRR_BS14 /*!< Select pin 14 */
134 #define LL_GPIO_PIN_15                     GPIO_BSRR_BS15 /*!< Select pin 15 */
135 #define LL_GPIO_PIN_ALL                    (LL_GPIO_PIN_0 | LL_GPIO_PIN_1  | LL_GPIO_PIN_2  | \
136                                             LL_GPIO_PIN_3  | LL_GPIO_PIN_4  | LL_GPIO_PIN_5  | \
137                                             LL_GPIO_PIN_6  | LL_GPIO_PIN_7  | LL_GPIO_PIN_8  | \
138                                             LL_GPIO_PIN_9  | LL_GPIO_PIN_10 | LL_GPIO_PIN_11 | \
139                                             LL_GPIO_PIN_12 | LL_GPIO_PIN_13 | LL_GPIO_PIN_14 | \
140                                             LL_GPIO_PIN_15) /*!< Select all pins */
141 /**
142   * @}
143   */
144 
145 /** @defgroup GPIO_LL_EC_MODE Mode
146   * @{
147   */
148 #define LL_GPIO_MODE_INPUT                 (0x00000000U) /*!< Select input mode */
149 #define LL_GPIO_MODE_OUTPUT                GPIO_MODER_MODE0_0  /*!< Select output mode */
150 #define LL_GPIO_MODE_ALTERNATE             GPIO_MODER_MODE0_1  /*!< Select alternate function mode */
151 #define LL_GPIO_MODE_ANALOG                GPIO_MODER_MODE0    /*!< Select analog mode */
152 /**
153   * @}
154   */
155 
156 /** @defgroup GPIO_LL_EC_OUTPUT Output Type
157   * @{
158   */
159 #define LL_GPIO_OUTPUT_PUSHPULL            (0x00000000U) /*!< Select push-pull as output type */
160 #define LL_GPIO_OUTPUT_OPENDRAIN           GPIO_OTYPER_OT0 /*!< Select open-drain as output type */
161 /**
162   * @}
163   */
164 
165 /** @defgroup GPIO_LL_EC_SPEED Output Speed
166   * @{
167   */
168 #define LL_GPIO_SPEED_FREQ_LOW             (0x00000000U) /*!< Select I/O low output speed    */
169 #define LL_GPIO_SPEED_FREQ_MEDIUM          GPIO_OSPEEDR_OSPEED0_0 /*!< Select I/O medium output speed */
170 #define LL_GPIO_SPEED_FREQ_HIGH            GPIO_OSPEEDR_OSPEED0_1 /*!< Select I/O fast output speed   */
171 #define LL_GPIO_SPEED_FREQ_VERY_HIGH       GPIO_OSPEEDR_OSPEED0   /*!< Select I/O high output speed   */
172 /**
173   * @}
174   */
175 #define LL_GPIO_SPEED_LOW                  LL_GPIO_SPEED_FREQ_LOW
176 #define LL_GPIO_SPEED_MEDIUM               LL_GPIO_SPEED_FREQ_MEDIUM
177 #define LL_GPIO_SPEED_FAST                 LL_GPIO_SPEED_FREQ_HIGH
178 #define LL_GPIO_SPEED_HIGH                 LL_GPIO_SPEED_FREQ_VERY_HIGH
179 
180 
181 /** @defgroup GPIO_LL_EC_PULL Pull Up Pull Down
182   * @{
183   */
184 #define LL_GPIO_PULL_NO                    (0x00000000U) /*!< Select I/O no pull */
185 #define LL_GPIO_PULL_UP                    GPIO_PUPDR_PUPD0_0 /*!< Select I/O pull up */
186 #define LL_GPIO_PULL_DOWN                  GPIO_PUPDR_PUPD0_1 /*!< Select I/O pull down */
187 /**
188   * @}
189   */
190 
191 /** @defgroup GPIO_LL_EC_AF Alternate Function
192   * @{
193   */
194 #define LL_GPIO_AF_0                       (0x0000000U) /*!< Select alternate function 0 */
195 #define LL_GPIO_AF_1                       (0x0000001U) /*!< Select alternate function 1 */
196 #define LL_GPIO_AF_2                       (0x0000002U) /*!< Select alternate function 2 */
197 #define LL_GPIO_AF_3                       (0x0000003U) /*!< Select alternate function 3 */
198 #define LL_GPIO_AF_4                       (0x0000004U) /*!< Select alternate function 4 */
199 #define LL_GPIO_AF_5                       (0x0000005U) /*!< Select alternate function 5 */
200 #define LL_GPIO_AF_6                       (0x0000006U) /*!< Select alternate function 6 */
201 #define LL_GPIO_AF_7                       (0x0000007U) /*!< Select alternate function 7 */
202 #define LL_GPIO_AF_8                       (0x0000008U) /*!< Select alternate function 8 */
203 #define LL_GPIO_AF_9                       (0x0000009U) /*!< Select alternate function 9 */
204 #define LL_GPIO_AF_10                      (0x000000AU) /*!< Select alternate function 10 */
205 #define LL_GPIO_AF_11                      (0x000000BU) /*!< Select alternate function 11 */
206 #define LL_GPIO_AF_12                      (0x000000CU) /*!< Select alternate function 12 */
207 #define LL_GPIO_AF_13                      (0x000000DU) /*!< Select alternate function 13 */
208 #define LL_GPIO_AF_14                      (0x000000EU) /*!< Select alternate function 14 */
209 #define LL_GPIO_AF_15                      (0x000000FU) /*!< Select alternate function 15 */
210 /**
211   * @}
212   */
213 
214 /** @defgroup GPIO_LL_EC_DELAY Delay
215   * @{
216   */
217 #define LL_GPIO_DELAY_0                       (0x0000000U) /*!< Select no delay */
218 #define LL_GPIO_DELAY_300                     (0x0000001U) /*!< Select 0.3 ns   */
219 #define LL_GPIO_DELAY_500                     (0x0000002U) /*!< Select 0.5 ns   */
220 #define LL_GPIO_DELAY_750                     (0x0000003U) /*!< Select 0.75 ns  */
221 #define LL_GPIO_DELAY_1000                    (0x0000004U) /*!< Select 1 ns     */
222 #define LL_GPIO_DELAY_1250                    (0x0000005U) /*!< Select 1.25 ns  */
223 #define LL_GPIO_DELAY_1500                    (0x0000006U) /*!< Select 1.5 ns   */
224 #define LL_GPIO_DELAY_1750                    (0x0000007U) /*!< Select 1.75 ns  */
225 #define LL_GPIO_DELAY_2000                    (0x0000008U) /*!< Select 2 ns     */
226 #define LL_GPIO_DELAY_2250                    (0x0000009U) /*!< Select 2.25 ns  */
227 #define LL_GPIO_DELAY_2500                    (0x000000AU) /*!< Select 2.5 ns   */
228 #define LL_GPIO_DELAY_2750                    (0x000000BU) /*!< Select 2.75 ns  */
229 #define LL_GPIO_DELAY_3000                    (0x000000CU) /*!< Select 3 ns     */
230 #define LL_GPIO_DELAY_3250                    (0x000000DU) /*!< Select 3.25 ns  */
231 /**
232   * @}
233   */
234 
235 /**
236   * @}
237   */
238 
239 /* Exported macro ------------------------------------------------------------*/
240 /** @defgroup GPIO_LL_Exported_Macros GPIO Exported Macros
241   * @{
242   */
243 
244 /** @defgroup GPIO_LL_EM_WRITE_READ Common Write and read registers Macros
245   * @{
246   */
247 
248 /**
249   * @brief  Write a value in GPIO register
250   * @param  __INSTANCE__ GPIO Instance
251   * @param  __REG__ Register to be written
252   * @param  __VALUE__ Value to be written in the register
253   * @retval None
254   */
255 #define LL_GPIO_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__))
256 
257 /**
258   * @brief  Read a value in GPIO register
259   * @param  __INSTANCE__ GPIO Instance
260   * @param  __REG__ Register to be read
261   * @retval Register value
262   */
263 #define LL_GPIO_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__)
264 /**
265   * @}
266   */
267 
268 /**
269   * @}
270   */
271 
272 /* Exported functions --------------------------------------------------------*/
273 /** @defgroup GPIO_LL_Exported_Functions GPIO Exported Functions
274   * @{
275   */
276 
277 /** @defgroup GPIO_LL_EF_Port_Configuration Port Configuration
278   * @{
279   */
280 
281 /**
282   * @brief  Configure gpio mode for a dedicated pin on dedicated port.
283   * @note   I/O mode can be Input mode, General purpose output, Alternate function mode or Analog.
284   * @note   Warning: only one pin can be passed as parameter.
285   * @rmtoll MODER        MODEy         LL_GPIO_SetPinMode
286   * @param  GPIOx GPIO Port
287   * @param  Pin This parameter can be one of the following values:
288   *         @arg @ref LL_GPIO_PIN_0
289   *         @arg @ref LL_GPIO_PIN_1
290   *         @arg @ref LL_GPIO_PIN_2
291   *         @arg @ref LL_GPIO_PIN_3
292   *         @arg @ref LL_GPIO_PIN_4
293   *         @arg @ref LL_GPIO_PIN_5
294   *         @arg @ref LL_GPIO_PIN_6
295   *         @arg @ref LL_GPIO_PIN_7
296   *         @arg @ref LL_GPIO_PIN_8
297   *         @arg @ref LL_GPIO_PIN_9
298   *         @arg @ref LL_GPIO_PIN_10
299   *         @arg @ref LL_GPIO_PIN_11
300   *         @arg @ref LL_GPIO_PIN_12
301   *         @arg @ref LL_GPIO_PIN_13
302   *         @arg @ref LL_GPIO_PIN_14
303   *         @arg @ref LL_GPIO_PIN_15
304   * @param  Mode This parameter can be one of the following values:
305   *         @arg @ref LL_GPIO_MODE_INPUT
306   *         @arg @ref LL_GPIO_MODE_OUTPUT
307   *         @arg @ref LL_GPIO_MODE_ALTERNATE
308   *         @arg @ref LL_GPIO_MODE_ANALOG
309   * @retval None
310   */
LL_GPIO_SetPinMode(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Mode)311 __STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode)
312 {
313   MODIFY_REG(GPIOx->MODER, (GPIO_MODER_MODE0 << (POSITION_VAL(Pin) * GPIO_MODER_MODE1_Pos)),
314              (Mode << (POSITION_VAL(Pin) * GPIO_MODER_MODE1_Pos)));
315 }
316 
317 /**
318   * @brief  Return gpio mode for a dedicated pin on dedicated port.
319   * @note   I/O mode can be Input mode, General purpose output, Alternate function mode or Analog.
320   * @note   Warning: only one pin can be passed as parameter.
321   * @rmtoll MODER        MODEy         LL_GPIO_GetPinMode
322   * @param  GPIOx GPIO Port
323   * @param  Pin This parameter can be one of the following values:
324   *         @arg @ref LL_GPIO_PIN_0
325   *         @arg @ref LL_GPIO_PIN_1
326   *         @arg @ref LL_GPIO_PIN_2
327   *         @arg @ref LL_GPIO_PIN_3
328   *         @arg @ref LL_GPIO_PIN_4
329   *         @arg @ref LL_GPIO_PIN_5
330   *         @arg @ref LL_GPIO_PIN_6
331   *         @arg @ref LL_GPIO_PIN_7
332   *         @arg @ref LL_GPIO_PIN_8
333   *         @arg @ref LL_GPIO_PIN_9
334   *         @arg @ref LL_GPIO_PIN_10
335   *         @arg @ref LL_GPIO_PIN_11
336   *         @arg @ref LL_GPIO_PIN_12
337   *         @arg @ref LL_GPIO_PIN_13
338   *         @arg @ref LL_GPIO_PIN_14
339   *         @arg @ref LL_GPIO_PIN_15
340   * @retval Returned value can be one of the following values:
341   *         @arg @ref LL_GPIO_MODE_INPUT
342   *         @arg @ref LL_GPIO_MODE_OUTPUT
343   *         @arg @ref LL_GPIO_MODE_ALTERNATE
344   *         @arg @ref LL_GPIO_MODE_ANALOG
345   */
LL_GPIO_GetPinMode(const GPIO_TypeDef * GPIOx,uint32_t Pin)346 __STATIC_INLINE uint32_t LL_GPIO_GetPinMode(const GPIO_TypeDef *GPIOx, uint32_t Pin)
347 {
348   return (uint32_t)(READ_BIT(GPIOx->MODER, (GPIO_MODER_MODE0 << (POSITION_VAL(Pin) * GPIO_MODER_MODE1_Pos)))
349                     >> (POSITION_VAL(Pin) * GPIO_MODER_MODE1_Pos));
350 }
351 
352 /**
353   * @brief  Configure gpio output type for several pins on dedicated port.
354   * @note   Output type as to be set when gpio pin is in output or
355   *         alternate modes. Possible type are Push-pull or Open-drain.
356   * @rmtoll OTYPER       OTy           LL_GPIO_SetPinOutputType
357   * @param  GPIOx GPIO Port
358   * @param  PinMask This parameter can be a combination of the following values:
359   *         @arg @ref LL_GPIO_PIN_0
360   *         @arg @ref LL_GPIO_PIN_1
361   *         @arg @ref LL_GPIO_PIN_2
362   *         @arg @ref LL_GPIO_PIN_3
363   *         @arg @ref LL_GPIO_PIN_4
364   *         @arg @ref LL_GPIO_PIN_5
365   *         @arg @ref LL_GPIO_PIN_6
366   *         @arg @ref LL_GPIO_PIN_7
367   *         @arg @ref LL_GPIO_PIN_8
368   *         @arg @ref LL_GPIO_PIN_9
369   *         @arg @ref LL_GPIO_PIN_10
370   *         @arg @ref LL_GPIO_PIN_11
371   *         @arg @ref LL_GPIO_PIN_12
372   *         @arg @ref LL_GPIO_PIN_13
373   *         @arg @ref LL_GPIO_PIN_14
374   *         @arg @ref LL_GPIO_PIN_15
375   *         @arg @ref LL_GPIO_PIN_ALL
376   * @param  OutputType This parameter can be one of the following values:
377   *         @arg @ref LL_GPIO_OUTPUT_PUSHPULL
378   *         @arg @ref LL_GPIO_OUTPUT_OPENDRAIN
379   * @retval None
380   */
LL_GPIO_SetPinOutputType(GPIO_TypeDef * GPIOx,uint32_t PinMask,uint32_t OutputType)381 __STATIC_INLINE void LL_GPIO_SetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t PinMask, uint32_t OutputType)
382 {
383   MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType));
384 }
385 
386 /**
387   * @brief  Return gpio output type for several pins on dedicated port.
388   * @note   Output type as to be set when gpio pin is in output or
389   *         alternate modes. Possible type are Push-pull or Open-drain.
390   * @note   Warning: only one pin can be passed as parameter.
391   * @rmtoll OTYPER       OTy           LL_GPIO_GetPinOutputType
392   * @param  GPIOx GPIO Port
393   * @param  Pin This parameter can be one of the following values:
394   *         @arg @ref LL_GPIO_PIN_0
395   *         @arg @ref LL_GPIO_PIN_1
396   *         @arg @ref LL_GPIO_PIN_2
397   *         @arg @ref LL_GPIO_PIN_3
398   *         @arg @ref LL_GPIO_PIN_4
399   *         @arg @ref LL_GPIO_PIN_5
400   *         @arg @ref LL_GPIO_PIN_6
401   *         @arg @ref LL_GPIO_PIN_7
402   *         @arg @ref LL_GPIO_PIN_8
403   *         @arg @ref LL_GPIO_PIN_9
404   *         @arg @ref LL_GPIO_PIN_10
405   *         @arg @ref LL_GPIO_PIN_11
406   *         @arg @ref LL_GPIO_PIN_12
407   *         @arg @ref LL_GPIO_PIN_13
408   *         @arg @ref LL_GPIO_PIN_14
409   *         @arg @ref LL_GPIO_PIN_15
410   *         @arg @ref LL_GPIO_PIN_ALL
411   * @retval Returned value can be one of the following values:
412   *         @arg @ref LL_GPIO_OUTPUT_PUSHPULL
413   *         @arg @ref LL_GPIO_OUTPUT_OPENDRAIN
414   */
LL_GPIO_GetPinOutputType(const GPIO_TypeDef * GPIOx,uint32_t Pin)415 __STATIC_INLINE uint32_t LL_GPIO_GetPinOutputType(const GPIO_TypeDef *GPIOx, uint32_t Pin)
416 {
417   return (uint32_t)(READ_BIT(GPIOx->OTYPER, Pin) >> POSITION_VAL(Pin));
418 }
419 
420 /**
421   * @brief  Configure gpio speed for a dedicated pin on dedicated port.
422   * @note   I/O speed can be Low, Medium, Fast or High speed.
423   * @note   Warning: only one pin can be passed as parameter.
424   * @note   Refer to datasheet for frequency specifications and the power
425   *         supply and load conditions for each speed.
426   * @rmtoll OSPEEDR      OSPEEDy       LL_GPIO_SetPinSpeed
427   * @param  GPIOx GPIO Port
428   * @param  Pin This parameter can be one of the following values:
429   *         @arg @ref LL_GPIO_PIN_0
430   *         @arg @ref LL_GPIO_PIN_1
431   *         @arg @ref LL_GPIO_PIN_2
432   *         @arg @ref LL_GPIO_PIN_3
433   *         @arg @ref LL_GPIO_PIN_4
434   *         @arg @ref LL_GPIO_PIN_5
435   *         @arg @ref LL_GPIO_PIN_6
436   *         @arg @ref LL_GPIO_PIN_7
437   *         @arg @ref LL_GPIO_PIN_8
438   *         @arg @ref LL_GPIO_PIN_9
439   *         @arg @ref LL_GPIO_PIN_10
440   *         @arg @ref LL_GPIO_PIN_11
441   *         @arg @ref LL_GPIO_PIN_12
442   *         @arg @ref LL_GPIO_PIN_13
443   *         @arg @ref LL_GPIO_PIN_14
444   *         @arg @ref LL_GPIO_PIN_15
445   * @param  Speed This parameter can be one of the following values:
446   *         @arg @ref LL_GPIO_SPEED_FREQ_LOW
447   *         @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM
448   *         @arg @ref LL_GPIO_SPEED_FREQ_HIGH
449   *         @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH
450   * @retval None
451   */
LL_GPIO_SetPinSpeed(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Speed)452 __STATIC_INLINE void LL_GPIO_SetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t  Speed)
453 {
454   MODIFY_REG(GPIOx->OSPEEDR, (GPIO_OSPEEDR_OSPEED0 << (POSITION_VAL(Pin) * GPIO_OSPEEDR_OSPEED1_Pos)),
455              (Speed << (POSITION_VAL(Pin) * GPIO_OSPEEDR_OSPEED1_Pos)));
456 }
457 
458 /**
459   * @brief  Return gpio speed for a dedicated pin on dedicated port.
460   * @note   I/O speed can be Low, Medium, Fast or High speed.
461   * @note   Warning: only one pin can be passed as parameter.
462   * @note   Refer to datasheet for frequency specifications and the power
463   *         supply and load conditions for each speed.
464   * @rmtoll OSPEEDR      OSPEEDy       LL_GPIO_GetPinSpeed
465   * @param  GPIOx GPIO Port
466   * @param  Pin This parameter can be one of the following values:
467   *         @arg @ref LL_GPIO_PIN_0
468   *         @arg @ref LL_GPIO_PIN_1
469   *         @arg @ref LL_GPIO_PIN_2
470   *         @arg @ref LL_GPIO_PIN_3
471   *         @arg @ref LL_GPIO_PIN_4
472   *         @arg @ref LL_GPIO_PIN_5
473   *         @arg @ref LL_GPIO_PIN_6
474   *         @arg @ref LL_GPIO_PIN_7
475   *         @arg @ref LL_GPIO_PIN_8
476   *         @arg @ref LL_GPIO_PIN_9
477   *         @arg @ref LL_GPIO_PIN_10
478   *         @arg @ref LL_GPIO_PIN_11
479   *         @arg @ref LL_GPIO_PIN_12
480   *         @arg @ref LL_GPIO_PIN_13
481   *         @arg @ref LL_GPIO_PIN_14
482   *         @arg @ref LL_GPIO_PIN_15
483   * @retval Returned value can be one of the following values:
484   *         @arg @ref LL_GPIO_SPEED_FREQ_LOW
485   *         @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM
486   *         @arg @ref LL_GPIO_SPEED_FREQ_HIGH
487   *         @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH
488   */
LL_GPIO_GetPinSpeed(const GPIO_TypeDef * GPIOx,uint32_t Pin)489 __STATIC_INLINE uint32_t LL_GPIO_GetPinSpeed(const GPIO_TypeDef *GPIOx, uint32_t Pin)
490 {
491   return (uint32_t)(READ_BIT(GPIOx->OSPEEDR, (GPIO_OSPEEDR_OSPEED0 << (POSITION_VAL(Pin) * GPIO_OSPEEDR_OSPEED1_Pos)))
492                     >> (POSITION_VAL(Pin) * GPIO_OSPEEDR_OSPEED1_Pos));
493 }
494 
495 /**
496   * @brief  Configure gpio pull-up or pull-down for a dedicated pin on a dedicated port.
497   * @note   Warning: only one pin can be passed as parameter.
498   * @rmtoll PUPDR        PUPDy         LL_GPIO_SetPinPull
499   * @param  GPIOx GPIO Port
500   * @param  Pin This parameter can be one of the following values:
501   *         @arg @ref LL_GPIO_PIN_0
502   *         @arg @ref LL_GPIO_PIN_1
503   *         @arg @ref LL_GPIO_PIN_2
504   *         @arg @ref LL_GPIO_PIN_3
505   *         @arg @ref LL_GPIO_PIN_4
506   *         @arg @ref LL_GPIO_PIN_5
507   *         @arg @ref LL_GPIO_PIN_6
508   *         @arg @ref LL_GPIO_PIN_7
509   *         @arg @ref LL_GPIO_PIN_8
510   *         @arg @ref LL_GPIO_PIN_9
511   *         @arg @ref LL_GPIO_PIN_10
512   *         @arg @ref LL_GPIO_PIN_11
513   *         @arg @ref LL_GPIO_PIN_12
514   *         @arg @ref LL_GPIO_PIN_13
515   *         @arg @ref LL_GPIO_PIN_14
516   *         @arg @ref LL_GPIO_PIN_15
517   * @param  Pull This parameter can be one of the following values:
518   *         @arg @ref LL_GPIO_PULL_NO
519   *         @arg @ref LL_GPIO_PULL_UP
520   *         @arg @ref LL_GPIO_PULL_DOWN
521   * @retval None
522   */
LL_GPIO_SetPinPull(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Pull)523 __STATIC_INLINE void LL_GPIO_SetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Pull)
524 {
525   MODIFY_REG(GPIOx->PUPDR, (GPIO_PUPDR_PUPD0 << (POSITION_VAL(Pin) * GPIO_PUPDR_PUPD1_Pos)),
526              (Pull << (POSITION_VAL(Pin) * GPIO_PUPDR_PUPD1_Pos)));
527 }
528 
529 /**
530   * @brief  Return gpio pull-up or pull-down for a dedicated pin on a dedicated port
531   * @note   Warning: only one pin can be passed as parameter.
532   * @rmtoll PUPDR        PUPDy         LL_GPIO_GetPinPull
533   * @param  GPIOx GPIO Port
534   * @param  Pin This parameter can be one of the following values:
535   *         @arg @ref LL_GPIO_PIN_0
536   *         @arg @ref LL_GPIO_PIN_1
537   *         @arg @ref LL_GPIO_PIN_2
538   *         @arg @ref LL_GPIO_PIN_3
539   *         @arg @ref LL_GPIO_PIN_4
540   *         @arg @ref LL_GPIO_PIN_5
541   *         @arg @ref LL_GPIO_PIN_6
542   *         @arg @ref LL_GPIO_PIN_7
543   *         @arg @ref LL_GPIO_PIN_8
544   *         @arg @ref LL_GPIO_PIN_9
545   *         @arg @ref LL_GPIO_PIN_10
546   *         @arg @ref LL_GPIO_PIN_11
547   *         @arg @ref LL_GPIO_PIN_12
548   *         @arg @ref LL_GPIO_PIN_13
549   *         @arg @ref LL_GPIO_PIN_14
550   *         @arg @ref LL_GPIO_PIN_15
551   * @retval Returned value can be one of the following values:
552   *         @arg @ref LL_GPIO_PULL_NO
553   *         @arg @ref LL_GPIO_PULL_UP
554   *         @arg @ref LL_GPIO_PULL_DOWN
555   */
LL_GPIO_GetPinPull(const GPIO_TypeDef * GPIOx,uint32_t Pin)556 __STATIC_INLINE uint32_t LL_GPIO_GetPinPull(const GPIO_TypeDef *GPIOx, uint32_t Pin)
557 {
558   return (uint32_t)(READ_BIT(GPIOx->PUPDR, (GPIO_PUPDR_PUPD0 << (POSITION_VAL(Pin) * GPIO_PUPDR_PUPD1_Pos)))
559                     >> (POSITION_VAL(Pin) * GPIO_PUPDR_PUPD1_Pos));
560 }
561 
562 /**
563   * @brief  Configure gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port.
564   * @note   Possible values are from AF0 to AF15 depending on target.
565   * @note   Warning: only one pin can be passed as parameter.
566   * @rmtoll AFRL         AFSELy        LL_GPIO_SetAFPin_0_7
567   * @param  GPIOx GPIO Port
568   * @param  Pin This parameter can be one of the following values:
569   *         @arg @ref LL_GPIO_PIN_0
570   *         @arg @ref LL_GPIO_PIN_1
571   *         @arg @ref LL_GPIO_PIN_2
572   *         @arg @ref LL_GPIO_PIN_3
573   *         @arg @ref LL_GPIO_PIN_4
574   *         @arg @ref LL_GPIO_PIN_5
575   *         @arg @ref LL_GPIO_PIN_6
576   *         @arg @ref LL_GPIO_PIN_7
577   * @param  Alternate This parameter can be one of the following values:
578   *         @arg @ref LL_GPIO_AF_0
579   *         @arg @ref LL_GPIO_AF_1
580   *         @arg @ref LL_GPIO_AF_2
581   *         @arg @ref LL_GPIO_AF_3
582   *         @arg @ref LL_GPIO_AF_4
583   *         @arg @ref LL_GPIO_AF_5
584   *         @arg @ref LL_GPIO_AF_6
585   *         @arg @ref LL_GPIO_AF_7
586   *         @arg @ref LL_GPIO_AF_8
587   *         @arg @ref LL_GPIO_AF_9
588   *         @arg @ref LL_GPIO_AF_10
589   *         @arg @ref LL_GPIO_AF_11
590   *         @arg @ref LL_GPIO_AF_12
591   *         @arg @ref LL_GPIO_AF_13
592   *         @arg @ref LL_GPIO_AF_14
593   *         @arg @ref LL_GPIO_AF_15
594   * @retval None
595   */
LL_GPIO_SetAFPin_0_7(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Alternate)596 __STATIC_INLINE void LL_GPIO_SetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate)
597 {
598   MODIFY_REG(GPIOx->AFR[0], (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * GPIO_AFRL_AFSEL1_Pos)),
599              (Alternate << (POSITION_VAL(Pin) * GPIO_AFRL_AFSEL1_Pos)));
600 }
601 
602 /**
603   * @brief  Return gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port.
604   * @rmtoll AFRL         AFSELy        LL_GPIO_GetAFPin_0_7
605   * @param  GPIOx GPIO Port
606   * @param  Pin This parameter can be one of the following values:
607   *         @arg @ref LL_GPIO_PIN_0
608   *         @arg @ref LL_GPIO_PIN_1
609   *         @arg @ref LL_GPIO_PIN_2
610   *         @arg @ref LL_GPIO_PIN_3
611   *         @arg @ref LL_GPIO_PIN_4
612   *         @arg @ref LL_GPIO_PIN_5
613   *         @arg @ref LL_GPIO_PIN_6
614   *         @arg @ref LL_GPIO_PIN_7
615   * @retval Returned value can be one of the following values:
616   *         @arg @ref LL_GPIO_AF_0
617   *         @arg @ref LL_GPIO_AF_1
618   *         @arg @ref LL_GPIO_AF_2
619   *         @arg @ref LL_GPIO_AF_3
620   *         @arg @ref LL_GPIO_AF_4
621   *         @arg @ref LL_GPIO_AF_5
622   *         @arg @ref LL_GPIO_AF_6
623   *         @arg @ref LL_GPIO_AF_7
624   *         @arg @ref LL_GPIO_AF_8
625   *         @arg @ref LL_GPIO_AF_9
626   *         @arg @ref LL_GPIO_AF_10
627   *         @arg @ref LL_GPIO_AF_11
628   *         @arg @ref LL_GPIO_AF_12
629   *         @arg @ref LL_GPIO_AF_13
630   *         @arg @ref LL_GPIO_AF_14
631   *         @arg @ref LL_GPIO_AF_15
632   */
LL_GPIO_GetAFPin_0_7(const GPIO_TypeDef * GPIOx,uint32_t Pin)633 __STATIC_INLINE uint32_t LL_GPIO_GetAFPin_0_7(const GPIO_TypeDef *GPIOx, uint32_t Pin)
634 {
635   return (uint32_t)(READ_BIT(GPIOx->AFR[0], (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * GPIO_AFRL_AFSEL1_Pos)))
636                     >> (POSITION_VAL(Pin) * GPIO_AFRL_AFSEL1_Pos));
637 }
638 
639 /**
640   * @brief  Configure 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   * @note   Warning: only one pin can be passed as parameter.
643   * @rmtoll AFRH         AFSELy        LL_GPIO_SetAFPin_8_15
644   * @param  GPIOx GPIO Port
645   * @param  Pin This parameter can be one of the following values:
646   *         @arg @ref LL_GPIO_PIN_8
647   *         @arg @ref LL_GPIO_PIN_9
648   *         @arg @ref LL_GPIO_PIN_10
649   *         @arg @ref LL_GPIO_PIN_11
650   *         @arg @ref LL_GPIO_PIN_12
651   *         @arg @ref LL_GPIO_PIN_13
652   *         @arg @ref LL_GPIO_PIN_14
653   *         @arg @ref LL_GPIO_PIN_15
654   * @param  Alternate This parameter can be one of the following values:
655   *         @arg @ref LL_GPIO_AF_0
656   *         @arg @ref LL_GPIO_AF_1
657   *         @arg @ref LL_GPIO_AF_2
658   *         @arg @ref LL_GPIO_AF_3
659   *         @arg @ref LL_GPIO_AF_4
660   *         @arg @ref LL_GPIO_AF_5
661   *         @arg @ref LL_GPIO_AF_6
662   *         @arg @ref LL_GPIO_AF_7
663   *         @arg @ref LL_GPIO_AF_8
664   *         @arg @ref LL_GPIO_AF_9
665   *         @arg @ref LL_GPIO_AF_10
666   *         @arg @ref LL_GPIO_AF_11
667   *         @arg @ref LL_GPIO_AF_12
668   *         @arg @ref LL_GPIO_AF_13
669   *         @arg @ref LL_GPIO_AF_14
670   *         @arg @ref LL_GPIO_AF_15
671   * @retval None
672   */
LL_GPIO_SetAFPin_8_15(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Alternate)673 __STATIC_INLINE void LL_GPIO_SetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate)
674 {
675   MODIFY_REG(GPIOx->AFR[1], (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * GPIO_AFRH_AFSEL9_Pos)),
676              (Alternate << (POSITION_VAL(Pin >> 8U) * GPIO_AFRH_AFSEL9_Pos)));
677 }
678 
679 /**
680   * @brief  Return gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port.
681   * @note   Possible values are from AF0 to AF15 depending on target.
682   * @rmtoll AFRH         AFSELy        LL_GPIO_GetAFPin_8_15
683   * @param  GPIOx GPIO Port
684   * @param  Pin This parameter can be one of the following values:
685   *         @arg @ref LL_GPIO_PIN_8
686   *         @arg @ref LL_GPIO_PIN_9
687   *         @arg @ref LL_GPIO_PIN_10
688   *         @arg @ref LL_GPIO_PIN_11
689   *         @arg @ref LL_GPIO_PIN_12
690   *         @arg @ref LL_GPIO_PIN_13
691   *         @arg @ref LL_GPIO_PIN_14
692   *         @arg @ref LL_GPIO_PIN_15
693   * @retval Returned value can be one of the following values:
694   *         @arg @ref LL_GPIO_AF_0
695   *         @arg @ref LL_GPIO_AF_1
696   *         @arg @ref LL_GPIO_AF_2
697   *         @arg @ref LL_GPIO_AF_3
698   *         @arg @ref LL_GPIO_AF_4
699   *         @arg @ref LL_GPIO_AF_5
700   *         @arg @ref LL_GPIO_AF_6
701   *         @arg @ref LL_GPIO_AF_7
702   *         @arg @ref LL_GPIO_AF_8
703   *         @arg @ref LL_GPIO_AF_9
704   *         @arg @ref LL_GPIO_AF_10
705   *         @arg @ref LL_GPIO_AF_11
706   *         @arg @ref LL_GPIO_AF_12
707   *         @arg @ref LL_GPIO_AF_13
708   *         @arg @ref LL_GPIO_AF_14
709   *         @arg @ref LL_GPIO_AF_15
710   */
LL_GPIO_GetAFPin_8_15(const GPIO_TypeDef * GPIOx,uint32_t Pin)711 __STATIC_INLINE uint32_t LL_GPIO_GetAFPin_8_15(const GPIO_TypeDef *GPIOx, uint32_t Pin)
712 {
713   return (uint32_t)(READ_BIT(GPIOx->AFR[1], (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * GPIO_AFRH_AFSEL9_Pos)))
714                     >> (POSITION_VAL(Pin >> 8U) * GPIO_AFRH_AFSEL9_Pos));
715 }
716 
717 
718 /**
719   * @brief  Lock configuration of several pins for a dedicated port.
720   * @note   When the lock sequence has been applied on a port bit, the
721   *         value of this port bit can no longer be modified until the
722   *         next reset.
723   * @note   Each lock bit freezes a specific configuration register
724   *         (control and alternate function registers).
725   * @rmtoll LCKR         LCKK          LL_GPIO_LockPin
726   * @param  GPIOx GPIO Port
727   * @param  PinMask This parameter can be a combination of the following values:
728   *         @arg @ref LL_GPIO_PIN_0
729   *         @arg @ref LL_GPIO_PIN_1
730   *         @arg @ref LL_GPIO_PIN_2
731   *         @arg @ref LL_GPIO_PIN_3
732   *         @arg @ref LL_GPIO_PIN_4
733   *         @arg @ref LL_GPIO_PIN_5
734   *         @arg @ref LL_GPIO_PIN_6
735   *         @arg @ref LL_GPIO_PIN_7
736   *         @arg @ref LL_GPIO_PIN_8
737   *         @arg @ref LL_GPIO_PIN_9
738   *         @arg @ref LL_GPIO_PIN_10
739   *         @arg @ref LL_GPIO_PIN_11
740   *         @arg @ref LL_GPIO_PIN_12
741   *         @arg @ref LL_GPIO_PIN_13
742   *         @arg @ref LL_GPIO_PIN_14
743   *         @arg @ref LL_GPIO_PIN_15
744   *         @arg @ref LL_GPIO_PIN_ALL
745   * @retval None
746   */
LL_GPIO_LockPin(GPIO_TypeDef * GPIOx,uint32_t PinMask)747 __STATIC_INLINE void LL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
748 {
749   __IO uint32_t temp;
750   WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask);
751   WRITE_REG(GPIOx->LCKR, PinMask);
752   WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask);
753   /* Read LCKK register. This read is mandatory to complete key lock sequence */
754   temp = READ_REG(GPIOx->LCKR);
755   (void) temp;
756 }
757 
758 /**
759   * @brief  Return 1 if all pins passed as parameter, of a dedicated port, are locked. else Return 0.
760   * @rmtoll LCKR         LCKy          LL_GPIO_IsPinLocked
761   * @param  GPIOx GPIO Port
762   * @param  PinMask This parameter can be a combination of the following values:
763   *         @arg @ref LL_GPIO_PIN_0
764   *         @arg @ref LL_GPIO_PIN_1
765   *         @arg @ref LL_GPIO_PIN_2
766   *         @arg @ref LL_GPIO_PIN_3
767   *         @arg @ref LL_GPIO_PIN_4
768   *         @arg @ref LL_GPIO_PIN_5
769   *         @arg @ref LL_GPIO_PIN_6
770   *         @arg @ref LL_GPIO_PIN_7
771   *         @arg @ref LL_GPIO_PIN_8
772   *         @arg @ref LL_GPIO_PIN_9
773   *         @arg @ref LL_GPIO_PIN_10
774   *         @arg @ref LL_GPIO_PIN_11
775   *         @arg @ref LL_GPIO_PIN_12
776   *         @arg @ref LL_GPIO_PIN_13
777   *         @arg @ref LL_GPIO_PIN_14
778   *         @arg @ref LL_GPIO_PIN_15
779   *         @arg @ref LL_GPIO_PIN_ALL
780   * @retval State of bit (1 or 0).
781   */
LL_GPIO_IsPinLocked(const GPIO_TypeDef * GPIOx,uint32_t PinMask)782 __STATIC_INLINE uint32_t LL_GPIO_IsPinLocked(const GPIO_TypeDef *GPIOx, uint32_t PinMask)
783 {
784   return ((READ_BIT(GPIOx->LCKR, PinMask) == (PinMask)) ? 1UL : 0UL);
785 }
786 
787 /**
788   * @brief  Return 1 if one of the pin of a dedicated port is locked. else return 0.
789   * @rmtoll LCKR         LCKK          LL_GPIO_IsAnyPinLocked
790   * @param  GPIOx GPIO Port
791   * @retval State of bit (1 or 0).
792   */
LL_GPIO_IsAnyPinLocked(const GPIO_TypeDef * GPIOx)793 __STATIC_INLINE uint32_t LL_GPIO_IsAnyPinLocked(const GPIO_TypeDef *GPIOx)
794 {
795   return ((READ_BIT(GPIOx->LCKR, GPIO_LCKR_LCKK) == (GPIO_LCKR_LCKK)) ? 1UL : 0UL);
796 }
797 
798 /**
799   * @brief  Lock resource configuration of several pins for a dedicated port.
800   * @note   When the lock sequence has been applied on a port bit, the
801   *         value of this port bit can no longer be modified until the
802   *         next reset.
803   * @note   Each lock bit freezes a security configuration register
804   *         (control and alternate function registers).
805   * @rmtoll LCKR         LCKK          LL_GPIO_LockPin
806   * @param  GPIOx GPIO Port
807   * @param  PinMask This parameter can be a combination of the following values:
808   *         @arg @ref LL_GPIO_PIN_0
809   *         @arg @ref LL_GPIO_PIN_1
810   *         @arg @ref LL_GPIO_PIN_2
811   *         @arg @ref LL_GPIO_PIN_3
812   *         @arg @ref LL_GPIO_PIN_4
813   *         @arg @ref LL_GPIO_PIN_5
814   *         @arg @ref LL_GPIO_PIN_6
815   *         @arg @ref LL_GPIO_PIN_7
816   *         @arg @ref LL_GPIO_PIN_8
817   *         @arg @ref LL_GPIO_PIN_9
818   *         @arg @ref LL_GPIO_PIN_10
819   *         @arg @ref LL_GPIO_PIN_11
820   *         @arg @ref LL_GPIO_PIN_12
821   *         @arg @ref LL_GPIO_PIN_13
822   *         @arg @ref LL_GPIO_PIN_14
823   *         @arg @ref LL_GPIO_PIN_15
824   *         @arg @ref LL_GPIO_PIN_ALL
825   * @retval None
826   */
LL_GPIO_LockResourcePin(GPIO_TypeDef * GPIOx,uint32_t PinMask)827 __STATIC_INLINE void LL_GPIO_LockResourcePin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
828 {
829   MODIFY_REG(GPIOx->RCFGLOCKR, 0U, PinMask);
830 }
831 
832 /**
833   * @brief  Return 1 if all resource pins passed as parameter, of a dedicated port, are locked. else Return 0.
834   * @rmtoll LCKR         LCKy          LL_GPIO_IsPinLocked
835   * @param  GPIOx GPIO Port
836   * @param  PinMask This parameter can be a combination of the following values:
837   *         @arg @ref LL_GPIO_PIN_0
838   *         @arg @ref LL_GPIO_PIN_1
839   *         @arg @ref LL_GPIO_PIN_2
840   *         @arg @ref LL_GPIO_PIN_3
841   *         @arg @ref LL_GPIO_PIN_4
842   *         @arg @ref LL_GPIO_PIN_5
843   *         @arg @ref LL_GPIO_PIN_6
844   *         @arg @ref LL_GPIO_PIN_7
845   *         @arg @ref LL_GPIO_PIN_8
846   *         @arg @ref LL_GPIO_PIN_9
847   *         @arg @ref LL_GPIO_PIN_10
848   *         @arg @ref LL_GPIO_PIN_11
849   *         @arg @ref LL_GPIO_PIN_12
850   *         @arg @ref LL_GPIO_PIN_13
851   *         @arg @ref LL_GPIO_PIN_14
852   *         @arg @ref LL_GPIO_PIN_15
853   *         @arg @ref LL_GPIO_PIN_ALL
854   * @retval State of bit (1 or 0).
855   */
LL_GPIO_IsResourcePinLocked(const GPIO_TypeDef * GPIOx,uint32_t PinMask)856 __STATIC_INLINE uint32_t LL_GPIO_IsResourcePinLocked(const GPIO_TypeDef *GPIOx, uint32_t PinMask)
857 {
858   return ((READ_BIT(GPIOx->RCFGLOCKR, PinMask) == (PinMask)) ? 1UL : 0UL);
859 }
860 
861 /**
862   * @brief  Return 1 if one of the resource pin of a dedicated port is locked. else return 0.
863   * @rmtoll LCKR         LCKK          LL_GPIO_IsAnyPinLocked
864   * @param  GPIOx GPIO Port
865   * @retval State of bit (1 or 0).
866   */
LL_GPIO_IsAnyResourcePinLocked(const GPIO_TypeDef * GPIOx)867 __STATIC_INLINE uint32_t LL_GPIO_IsAnyResourcePinLocked(const GPIO_TypeDef *GPIOx)
868 {
869   return ((GPIOx->RCFGLOCKR == 0x00000000U) ? 0UL : 1UL);
870 }
871 
872 
873 /**
874   * @brief  Configure gpio delay of a dedicated pin from 0 to 7 for a dedicated port.
875   * @note   Warning: only one pin can be passed as parameter.
876   * @param  GPIOx GPIO Port
877   * @param  Pin This parameter can be one of the following values:
878   *         @arg @ref LL_GPIO_PIN_0
879   *         @arg @ref LL_GPIO_PIN_1
880   *         @arg @ref LL_GPIO_PIN_2
881   *         @arg @ref LL_GPIO_PIN_3
882   *         @arg @ref LL_GPIO_PIN_4
883   *         @arg @ref LL_GPIO_PIN_5
884   *         @arg @ref LL_GPIO_PIN_6
885   *         @arg @ref LL_GPIO_PIN_7
886   * @param  Delay This parameter can be one of the following values:
887   *         @arg @ref LL_GPIO_DELAY_0
888   *         @arg @ref LL_GPIO_DELAY_300
889   *         @arg @ref LL_GPIO_DELAY_500
890   *         @arg @ref LL_GPIO_DELAY_750
891   *         @arg @ref LL_GPIO_DELAY_1000
892   *         @arg @ref LL_GPIO_DELAY_1250
893   *         @arg @ref LL_GPIO_DELAY_1500
894   *         @arg @ref LL_GPIO_DELAY_1750
895   *         @arg @ref LL_GPIO_DELAY_2000
896   *         @arg @ref LL_GPIO_DELAY_2250
897   *         @arg @ref LL_GPIO_DELAY_2500
898   *         @arg @ref LL_GPIO_DELAY_2750
899   *         @arg @ref LL_GPIO_DELAY_3000
900   *         @arg @ref LL_GPIO_DELAY_3250
901   * @retval None
902   */
LL_GPIO_SetDelayPin_0_7(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Delay)903 __STATIC_INLINE void LL_GPIO_SetDelayPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Delay)
904 {
905   MODIFY_REG(GPIOx->DELAYR[0], GPIO_DELAYRL_DLY0 << (POSITION_VAL(Pin) * GPIO_DELAYRL_DLY1_Pos),
906              (Delay << (POSITION_VAL(Pin) * GPIO_DELAYRL_DLY1_Pos)));
907 }
908 
909 /**
910   * @brief  Return gpio delay of a dedicated pin from 0 to 7 for a dedicated port.
911   * @param  GPIOx GPIO Port
912   * @param  Pin This parameter can be one of the following values:
913   *         @arg @ref LL_GPIO_PIN_0
914   *         @arg @ref LL_GPIO_PIN_1
915   *         @arg @ref LL_GPIO_PIN_2
916   *         @arg @ref LL_GPIO_PIN_3
917   *         @arg @ref LL_GPIO_PIN_4
918   *         @arg @ref LL_GPIO_PIN_5
919   *         @arg @ref LL_GPIO_PIN_6
920   *         @arg @ref LL_GPIO_PIN_7
921   * @retval Returned value can be one of the following values:
922   *         @arg @ref LL_GPIO_DELAY_0
923   *         @arg @ref LL_GPIO_DELAY_300
924   *         @arg @ref LL_GPIO_DELAY_500
925   *         @arg @ref LL_GPIO_DELAY_750
926   *         @arg @ref LL_GPIO_DELAY_1000
927   *         @arg @ref LL_GPIO_DELAY_1250
928   *         @arg @ref LL_GPIO_DELAY_1500
929   *         @arg @ref LL_GPIO_DELAY_1750
930   *         @arg @ref LL_GPIO_DELAY_2000
931   *         @arg @ref LL_GPIO_DELAY_2250
932   *         @arg @ref LL_GPIO_DELAY_2500
933   *         @arg @ref LL_GPIO_DELAY_2750
934   *         @arg @ref LL_GPIO_DELAY_3000
935   *         @arg @ref LL_GPIO_DELAY_3250
936   */
LL_GPIO_GetDelayPin_0_7(const GPIO_TypeDef * GPIOx,uint32_t Pin)937 __STATIC_INLINE uint32_t LL_GPIO_GetDelayPin_0_7(const GPIO_TypeDef *GPIOx, uint32_t Pin)
938 {
939   return (uint32_t)(READ_BIT(GPIOx->DELAYR[0], (GPIO_DELAYRL_DLY0 << (POSITION_VAL(Pin) * GPIO_DELAYRL_DLY1_Pos)))
940                     >> (POSITION_VAL(Pin) * GPIO_DELAYRL_DLY1_Pos));
941 }
942 
943 /**
944   * @brief  Configure gpio delay of a dedicated pin from 8 to 15 for a dedicated port.
945   * @note   Warning: only one pin can be passed as parameter.
946   * @param  GPIOx GPIO Port
947   * @param  Pin This parameter can be one of the following values:
948   *         @arg @ref LL_GPIO_PIN_8
949   *         @arg @ref LL_GPIO_PIN_9
950   *         @arg @ref LL_GPIO_PIN_10
951   *         @arg @ref LL_GPIO_PIN_11
952   *         @arg @ref LL_GPIO_PIN_12
953   *         @arg @ref LL_GPIO_PIN_13
954   *         @arg @ref LL_GPIO_PIN_14
955   *         @arg @ref LL_GPIO_PIN_15
956   * @param  Delay This parameter can be one of the following values:
957   *         @arg @ref LL_GPIO_DELAY_0
958   *         @arg @ref LL_GPIO_DELAY_300
959   *         @arg @ref LL_GPIO_DELAY_500
960   *         @arg @ref LL_GPIO_DELAY_750
961   *         @arg @ref LL_GPIO_DELAY_1000
962   *         @arg @ref LL_GPIO_DELAY_1250
963   *         @arg @ref LL_GPIO_DELAY_1500
964   *         @arg @ref LL_GPIO_DELAY_1750
965   *         @arg @ref LL_GPIO_DELAY_2000
966   *         @arg @ref LL_GPIO_DELAY_2250
967   *         @arg @ref LL_GPIO_DELAY_2500
968   *         @arg @ref LL_GPIO_DELAY_2750
969   *         @arg @ref LL_GPIO_DELAY_3000
970   *         @arg @ref LL_GPIO_DELAY_3250
971   * @retval None
972   */
LL_GPIO_SetDelayPin_8_15(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t Delay)973 __STATIC_INLINE void LL_GPIO_SetDelayPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Delay)
974 {
975   MODIFY_REG(GPIOx->DELAYR[1], GPIO_DELAYRH_DLY8 << ((POSITION_VAL(Pin) & 0x07U)  * GPIO_DELAYRH_DLY9_Pos),
976              (Delay << ((POSITION_VAL(Pin) & 0x07U)  * GPIO_DELAYRH_DLY9_Pos)));
977 }
978 
979 /**
980   * @brief  Return gpio delay of a dedicated pin from 8 to 15 for a dedicated port.
981   * @param  GPIOx GPIO Port
982   * @param  Pin This parameter can be one of the following values:
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   * @retval Returned value can be one of the following values:
992   *         @arg @ref LL_GPIO_DELAY_0
993   *         @arg @ref LL_GPIO_DELAY_300
994   *         @arg @ref LL_GPIO_DELAY_500
995   *         @arg @ref LL_GPIO_DELAY_750
996   *         @arg @ref LL_GPIO_DELAY_1000
997   *         @arg @ref LL_GPIO_DELAY_1250
998   *         @arg @ref LL_GPIO_DELAY_1500
999   *         @arg @ref LL_GPIO_DELAY_1750
1000   *         @arg @ref LL_GPIO_DELAY_2000
1001   *         @arg @ref LL_GPIO_DELAY_2250
1002   *         @arg @ref LL_GPIO_DELAY_2500
1003   *         @arg @ref LL_GPIO_DELAY_2750
1004   *         @arg @ref LL_GPIO_DELAY_3000
1005   *         @arg @ref LL_GPIO_DELAY_3250
1006   */
LL_GPIO_GetDelayPin_8_15(const GPIO_TypeDef * GPIOx,uint32_t Pin)1007 __STATIC_INLINE uint32_t LL_GPIO_GetDelayPin_8_15(const GPIO_TypeDef *GPIOx, uint32_t Pin)
1008 {
1009   return (uint32_t)(READ_BIT(GPIOx->DELAYR[1],
1010                              (GPIO_DELAYRH_DLY8 << ((POSITION_VAL(Pin) & 0x07U) * GPIO_DELAYRH_DLY9_Pos)))
1011                     >> ((POSITION_VAL(Pin) & 0x07U)  * GPIO_DELAYRH_DLY9_Pos));
1012 }
1013 
1014 /**
1015   * @brief  Configure gpio delay of a dedicated pin from 0 to 7 for a dedicated port.
1016   * @note   Warning: only one pin can be passed as parameter.
1017   * @param  GPIOx GPIO Port
1018   * @param  Pin This parameter can be one of the following values:
1019   *         @arg @ref LL_GPIO_PIN_0
1020   *         @arg @ref LL_GPIO_PIN_1
1021   *         @arg @ref LL_GPIO_PIN_2
1022   *         @arg @ref LL_GPIO_PIN_3
1023   *         @arg @ref LL_GPIO_PIN_4
1024   *         @arg @ref LL_GPIO_PIN_5
1025   *         @arg @ref LL_GPIO_PIN_6
1026   *         @arg @ref LL_GPIO_PIN_7
1027   * @param  CfgMask:
1028   *         ADVCFG[0] : Delay on ouptput path
1029   *         ADVCFG[1] : input and ouptput data are double edge
1030   *         ADVCFG[2] : I/O clocks are inverted
1031   *         ADVCFG[3] : input and ouptput data are retimed
1032   * @retval None
1033   */
LL_GPIO_SetPIOControlPin_0_7(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t CfgMask)1034 __STATIC_INLINE void LL_GPIO_SetPIOControlPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t CfgMask)
1035 {
1036   MODIFY_REG(GPIOx->ADVCFGR[0], GPIO_ADVCFGRL_0 << (POSITION_VAL(Pin) * GPIO_ADVCFGRL_1_Pos),
1037              (CfgMask << (POSITION_VAL(Pin) * GPIO_ADVCFGRL_1_Pos)));
1038 }
1039 
1040 /**
1041   * @brief  Return gpio delay of a dedicated pin from 0 to 7 for a dedicated port.
1042   * @param  GPIOx GPIO Port
1043   * @param  Pin This parameter can be one of the following values:
1044   *         @arg @ref LL_GPIO_PIN_0
1045   *         @arg @ref LL_GPIO_PIN_1
1046   *         @arg @ref LL_GPIO_PIN_2
1047   *         @arg @ref LL_GPIO_PIN_3
1048   *         @arg @ref LL_GPIO_PIN_4
1049   *         @arg @ref LL_GPIO_PIN_5
1050   *         @arg @ref LL_GPIO_PIN_6
1051   *         @arg @ref LL_GPIO_PIN_7
1052   * @retval Returned value can be one of the following values:
1053   *         ADVCFG[0] : Delay on ouptput path
1054   *         ADVCFG[1] : input and ouptput data are double edge
1055   *         ADVCFG[2] : I/O clocks are inverted
1056   *         ADVCFG[3] : input and ouptput data are retimed
1057   */
LL_GPIO_GetPIOControlPin_0_7(const GPIO_TypeDef * GPIOx,uint32_t Pin)1058 __STATIC_INLINE uint32_t LL_GPIO_GetPIOControlPin_0_7(const GPIO_TypeDef *GPIOx, uint32_t Pin)
1059 {
1060   return (uint32_t)(READ_BIT(GPIOx->ADVCFGR[0],
1061                              (GPIO_ADVCFGRL_0 << (POSITION_VAL(Pin) * GPIO_ADVCFGRL_1_Pos)))
1062                     >> (POSITION_VAL(Pin) * GPIO_ADVCFGRL_1_Pos));
1063 }
1064 
1065 /**
1066   * @brief  Configure gpio delay of a dedicated pin from 8 to 15 for a dedicated port.
1067   * @note   Warning: only one pin can be passed as parameter.
1068   * @param  GPIOx GPIO Port
1069   * @param  Pin This parameter can be one of the following values:
1070   *         @arg @ref LL_GPIO_PIN_8
1071   *         @arg @ref LL_GPIO_PIN_9
1072   *         @arg @ref LL_GPIO_PIN_10
1073   *         @arg @ref LL_GPIO_PIN_11
1074   *         @arg @ref LL_GPIO_PIN_12
1075   *         @arg @ref LL_GPIO_PIN_13
1076   *         @arg @ref LL_GPIO_PIN_14
1077   *         @arg @ref LL_GPIO_PIN_15
1078   * @param  CfgMask:
1079   *         ADVCFG[0] : Delay on ouptput path
1080   *         ADVCFG[1] : input and ouptput data are double edge
1081   *         ADVCFG[2] : I/O clocks are inverted
1082   *         ADVCFG[3] : input and ouptput data are retimed
1083   * @retval None
1084   */
LL_GPIO_SetPIOControlPin_8_15(GPIO_TypeDef * GPIOx,uint32_t Pin,uint32_t CfgMask)1085 __STATIC_INLINE void LL_GPIO_SetPIOControlPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t CfgMask)
1086 {
1087   MODIFY_REG(GPIOx->ADVCFGR[1], GPIO_ADVCFGRH_8 << ((POSITION_VAL(Pin) & 0x07U)  * GPIO_ADVCFGRH_9_Pos),
1088              (CfgMask << ((POSITION_VAL(Pin) & 0x07U)  * GPIO_ADVCFGRH_9_Pos)));
1089 }
1090 
1091 /**
1092   * @brief  Return gpio delay of a dedicated pin from 8 to 15 for a dedicated port.
1093   * @param  GPIOx GPIO Port
1094   * @param  Pin This parameter can be one of the following values:
1095   *         @arg @ref LL_GPIO_PIN_8
1096   *         @arg @ref LL_GPIO_PIN_9
1097   *         @arg @ref LL_GPIO_PIN_10
1098   *         @arg @ref LL_GPIO_PIN_11
1099   *         @arg @ref LL_GPIO_PIN_12
1100   *         @arg @ref LL_GPIO_PIN_13
1101   *         @arg @ref LL_GPIO_PIN_14
1102   *         @arg @ref LL_GPIO_PIN_15
1103   * @retval Returned value can be one of the following values:
1104   *         ADVCFG[0] : Delay on ouptput path
1105   *         ADVCFG[1] : input and ouptput data are double edge
1106   *         ADVCFG[2] : I/O clocks are inverted
1107   *         ADVCFG[3] : input and ouptput data are retimed
1108   */
LL_GPIO_GetPIOControlPin_8_15(const GPIO_TypeDef * GPIOx,uint32_t Pin)1109 __STATIC_INLINE uint32_t LL_GPIO_GetPIOControlPin_8_15(const GPIO_TypeDef *GPIOx, uint32_t Pin)
1110 {
1111   return (uint32_t)(READ_BIT(GPIOx->ADVCFGR[1],
1112                              (GPIO_ADVCFGRH_8 << ((POSITION_VAL(Pin) & 0x07U) * GPIO_ADVCFGRH_9_Pos)))
1113                     >> ((POSITION_VAL(Pin) & 0x07U)  * GPIO_ADVCFGRH_9_Pos));
1114 }
1115 
1116 /**
1117   * @}
1118   */
1119 
1120 
1121 /** @defgroup GPIO_LL_EF_Data_Access Data Access
1122   * @{
1123   */
1124 
1125 /**
1126   * @brief  Return full input data register value for a dedicated port.
1127   * @rmtoll IDR          IDy           LL_GPIO_ReadInputPort
1128   * @param  GPIOx GPIO Port
1129   * @retval Input data register value of port
1130   */
LL_GPIO_ReadInputPort(const GPIO_TypeDef * GPIOx)1131 __STATIC_INLINE uint32_t LL_GPIO_ReadInputPort(const GPIO_TypeDef *GPIOx)
1132 {
1133   return (uint32_t)(READ_REG(GPIOx->IDR));
1134 }
1135 
1136 /**
1137   * @brief  Return if input data level for several pins of dedicated port is high or low.
1138   * @rmtoll IDR          IDy           LL_GPIO_IsInputPinSet
1139   * @param  GPIOx GPIO Port
1140   * @param  PinMask This parameter can be a combination of the following values:
1141   *         @arg @ref LL_GPIO_PIN_0
1142   *         @arg @ref LL_GPIO_PIN_1
1143   *         @arg @ref LL_GPIO_PIN_2
1144   *         @arg @ref LL_GPIO_PIN_3
1145   *         @arg @ref LL_GPIO_PIN_4
1146   *         @arg @ref LL_GPIO_PIN_5
1147   *         @arg @ref LL_GPIO_PIN_6
1148   *         @arg @ref LL_GPIO_PIN_7
1149   *         @arg @ref LL_GPIO_PIN_8
1150   *         @arg @ref LL_GPIO_PIN_9
1151   *         @arg @ref LL_GPIO_PIN_10
1152   *         @arg @ref LL_GPIO_PIN_11
1153   *         @arg @ref LL_GPIO_PIN_12
1154   *         @arg @ref LL_GPIO_PIN_13
1155   *         @arg @ref LL_GPIO_PIN_14
1156   *         @arg @ref LL_GPIO_PIN_15
1157   *         @arg @ref LL_GPIO_PIN_ALL
1158   * @retval State of bit (1 or 0).
1159   */
LL_GPIO_IsInputPinSet(const GPIO_TypeDef * GPIOx,uint32_t PinMask)1160 __STATIC_INLINE uint32_t LL_GPIO_IsInputPinSet(const GPIO_TypeDef *GPIOx, uint32_t PinMask)
1161 {
1162   return ((READ_BIT(GPIOx->IDR, PinMask) == (PinMask)) ? 1UL : 0UL);
1163 }
1164 
1165 /**
1166   * @brief  Write output data register for the port.
1167   * @rmtoll ODR          ODy           LL_GPIO_WriteOutputPort
1168   * @param  GPIOx GPIO Port
1169   * @param  PortValue Level value for each pin of the port
1170   * @retval None
1171   */
LL_GPIO_WriteOutputPort(GPIO_TypeDef * GPIOx,uint32_t PortValue)1172 __STATIC_INLINE void LL_GPIO_WriteOutputPort(GPIO_TypeDef *GPIOx, uint32_t PortValue)
1173 {
1174   WRITE_REG(GPIOx->ODR, PortValue);
1175 }
1176 
1177 /**
1178   * @brief  Return full output data register value for a dedicated port.
1179   * @rmtoll ODR          ODy           LL_GPIO_ReadOutputPort
1180   * @param  GPIOx GPIO Port
1181   * @retval Output data register value of port
1182   */
LL_GPIO_ReadOutputPort(const GPIO_TypeDef * GPIOx)1183 __STATIC_INLINE uint32_t LL_GPIO_ReadOutputPort(const GPIO_TypeDef *GPIOx)
1184 {
1185   return (uint32_t)(READ_REG(GPIOx->ODR));
1186 }
1187 
1188 /**
1189   * @brief  Return if input data level for several pins of dedicated port is high or low.
1190   * @rmtoll ODR          ODy           LL_GPIO_IsOutputPinSet
1191   * @param  GPIOx GPIO Port
1192   * @param  PinMask This parameter can be a combination of the following values:
1193   *         @arg @ref LL_GPIO_PIN_0
1194   *         @arg @ref LL_GPIO_PIN_1
1195   *         @arg @ref LL_GPIO_PIN_2
1196   *         @arg @ref LL_GPIO_PIN_3
1197   *         @arg @ref LL_GPIO_PIN_4
1198   *         @arg @ref LL_GPIO_PIN_5
1199   *         @arg @ref LL_GPIO_PIN_6
1200   *         @arg @ref LL_GPIO_PIN_7
1201   *         @arg @ref LL_GPIO_PIN_8
1202   *         @arg @ref LL_GPIO_PIN_9
1203   *         @arg @ref LL_GPIO_PIN_10
1204   *         @arg @ref LL_GPIO_PIN_11
1205   *         @arg @ref LL_GPIO_PIN_12
1206   *         @arg @ref LL_GPIO_PIN_13
1207   *         @arg @ref LL_GPIO_PIN_14
1208   *         @arg @ref LL_GPIO_PIN_15
1209   *         @arg @ref LL_GPIO_PIN_ALL
1210   * @retval State of bit (1 or 0).
1211   */
LL_GPIO_IsOutputPinSet(const GPIO_TypeDef * GPIOx,uint32_t PinMask)1212 __STATIC_INLINE uint32_t LL_GPIO_IsOutputPinSet(const GPIO_TypeDef *GPIOx, uint32_t PinMask)
1213 {
1214   return ((READ_BIT(GPIOx->ODR, PinMask) == (PinMask)) ? 1UL : 0UL);
1215 }
1216 
1217 /**
1218   * @brief  Set several pins to high level on dedicated gpio port.
1219   * @rmtoll BSRR         BSy           LL_GPIO_SetOutputPin
1220   * @param  GPIOx GPIO Port
1221   * @param  PinMask This parameter can be a combination of the following values:
1222   *         @arg @ref LL_GPIO_PIN_0
1223   *         @arg @ref LL_GPIO_PIN_1
1224   *         @arg @ref LL_GPIO_PIN_2
1225   *         @arg @ref LL_GPIO_PIN_3
1226   *         @arg @ref LL_GPIO_PIN_4
1227   *         @arg @ref LL_GPIO_PIN_5
1228   *         @arg @ref LL_GPIO_PIN_6
1229   *         @arg @ref LL_GPIO_PIN_7
1230   *         @arg @ref LL_GPIO_PIN_8
1231   *         @arg @ref LL_GPIO_PIN_9
1232   *         @arg @ref LL_GPIO_PIN_10
1233   *         @arg @ref LL_GPIO_PIN_11
1234   *         @arg @ref LL_GPIO_PIN_12
1235   *         @arg @ref LL_GPIO_PIN_13
1236   *         @arg @ref LL_GPIO_PIN_14
1237   *         @arg @ref LL_GPIO_PIN_15
1238   *         @arg @ref LL_GPIO_PIN_ALL
1239   * @retval None
1240   */
LL_GPIO_SetOutputPin(GPIO_TypeDef * GPIOx,uint32_t PinMask)1241 __STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
1242 {
1243   WRITE_REG(GPIOx->BSRR, PinMask);
1244 }
1245 
1246 /**
1247   * @brief  Set several pins to low level on dedicated gpio port.
1248   * @rmtoll BRR          BRy           LL_GPIO_ResetOutputPin
1249   * @param  GPIOx GPIO Port
1250   * @param  PinMask This parameter can be a combination of the following values:
1251   *         @arg @ref LL_GPIO_PIN_0
1252   *         @arg @ref LL_GPIO_PIN_1
1253   *         @arg @ref LL_GPIO_PIN_2
1254   *         @arg @ref LL_GPIO_PIN_3
1255   *         @arg @ref LL_GPIO_PIN_4
1256   *         @arg @ref LL_GPIO_PIN_5
1257   *         @arg @ref LL_GPIO_PIN_6
1258   *         @arg @ref LL_GPIO_PIN_7
1259   *         @arg @ref LL_GPIO_PIN_8
1260   *         @arg @ref LL_GPIO_PIN_9
1261   *         @arg @ref LL_GPIO_PIN_10
1262   *         @arg @ref LL_GPIO_PIN_11
1263   *         @arg @ref LL_GPIO_PIN_12
1264   *         @arg @ref LL_GPIO_PIN_13
1265   *         @arg @ref LL_GPIO_PIN_14
1266   *         @arg @ref LL_GPIO_PIN_15
1267   *         @arg @ref LL_GPIO_PIN_ALL
1268   * @retval None
1269   */
LL_GPIO_ResetOutputPin(GPIO_TypeDef * GPIOx,uint32_t PinMask)1270 __STATIC_INLINE void LL_GPIO_ResetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
1271 {
1272   WRITE_REG(GPIOx->BRR, PinMask);
1273 }
1274 
1275 /**
1276   * @brief  Toggle data value for several pin of dedicated port.
1277   * @rmtoll ODR          ODy           LL_GPIO_TogglePin
1278   * @param  GPIOx GPIO Port
1279   * @param  PinMask This parameter can be a combination of the following values:
1280   *         @arg @ref LL_GPIO_PIN_0
1281   *         @arg @ref LL_GPIO_PIN_1
1282   *         @arg @ref LL_GPIO_PIN_2
1283   *         @arg @ref LL_GPIO_PIN_3
1284   *         @arg @ref LL_GPIO_PIN_4
1285   *         @arg @ref LL_GPIO_PIN_5
1286   *         @arg @ref LL_GPIO_PIN_6
1287   *         @arg @ref LL_GPIO_PIN_7
1288   *         @arg @ref LL_GPIO_PIN_8
1289   *         @arg @ref LL_GPIO_PIN_9
1290   *         @arg @ref LL_GPIO_PIN_10
1291   *         @arg @ref LL_GPIO_PIN_11
1292   *         @arg @ref LL_GPIO_PIN_12
1293   *         @arg @ref LL_GPIO_PIN_13
1294   *         @arg @ref LL_GPIO_PIN_14
1295   *         @arg @ref LL_GPIO_PIN_15
1296   *         @arg @ref LL_GPIO_PIN_ALL
1297   * @retval None
1298   */
LL_GPIO_TogglePin(GPIO_TypeDef * GPIOx,uint32_t PinMask)1299 __STATIC_INLINE void LL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
1300 {
1301   uint32_t odr = READ_REG(GPIOx->ODR);
1302   WRITE_REG(GPIOx->BSRR, ((odr & PinMask) << 16u) | (~odr & PinMask));
1303 }
1304 
1305 
1306 #if defined CPU_IN_SECURE_STATE
1307 
1308 /**
1309   * @brief  Enable secure write only access for several pin of dedicated port.
1310   * @rmtoll SECCFGR      SECy           LL_GPIO_EnablePinSecure
1311   * @param  GPIOx GPIO Port
1312   * @param  PinMask This parameter can be a combination of the following values:
1313   *         @arg @ref LL_GPIO_PIN_0
1314   *         @arg @ref LL_GPIO_PIN_1
1315   *         @arg @ref LL_GPIO_PIN_2
1316   *         @arg @ref LL_GPIO_PIN_3
1317   *         @arg @ref LL_GPIO_PIN_4
1318   *         @arg @ref LL_GPIO_PIN_5
1319   *         @arg @ref LL_GPIO_PIN_6
1320   *         @arg @ref LL_GPIO_PIN_7
1321   *         @arg @ref LL_GPIO_PIN_8
1322   *         @arg @ref LL_GPIO_PIN_9
1323   *         @arg @ref LL_GPIO_PIN_10
1324   *         @arg @ref LL_GPIO_PIN_11
1325   *         @arg @ref LL_GPIO_PIN_12
1326   *         @arg @ref LL_GPIO_PIN_13
1327   *         @arg @ref LL_GPIO_PIN_14
1328   *         @arg @ref LL_GPIO_PIN_15
1329   *         @arg @ref LL_GPIO_PIN_ALL
1330   * @retval None
1331   */
LL_GPIO_EnablePinSecure(GPIO_TypeDef * GPIOx,uint32_t PinMask)1332 __STATIC_INLINE void LL_GPIO_EnablePinSecure(GPIO_TypeDef *GPIOx, uint32_t PinMask)
1333 {
1334   SET_BIT(GPIOx->SECCFGR, PinMask);
1335 }
1336 
1337 
1338 /**
1339   * @brief  Disable secure write only access for several pin of dedicated port.
1340   * @rmtoll SECCFGR      SECy           LL_GPIO_DisablePinSecure
1341   * @param  GPIOx GPIO Port
1342   * @param  PinMask This parameter can be a combination of the following values:
1343   *         @arg @ref LL_GPIO_PIN_0
1344   *         @arg @ref LL_GPIO_PIN_1
1345   *         @arg @ref LL_GPIO_PIN_2
1346   *         @arg @ref LL_GPIO_PIN_3
1347   *         @arg @ref LL_GPIO_PIN_4
1348   *         @arg @ref LL_GPIO_PIN_5
1349   *         @arg @ref LL_GPIO_PIN_6
1350   *         @arg @ref LL_GPIO_PIN_7
1351   *         @arg @ref LL_GPIO_PIN_8
1352   *         @arg @ref LL_GPIO_PIN_9
1353   *         @arg @ref LL_GPIO_PIN_10
1354   *         @arg @ref LL_GPIO_PIN_11
1355   *         @arg @ref LL_GPIO_PIN_12
1356   *         @arg @ref LL_GPIO_PIN_13
1357   *         @arg @ref LL_GPIO_PIN_14
1358   *         @arg @ref LL_GPIO_PIN_15
1359   *         @arg @ref LL_GPIO_PIN_ALL
1360   * @retval None
1361   */
LL_GPIO_DisablePinSecure(GPIO_TypeDef * GPIOx,uint32_t PinMask)1362 __STATIC_INLINE void LL_GPIO_DisablePinSecure(GPIO_TypeDef *GPIOx, uint32_t PinMask)
1363 {
1364   CLEAR_BIT(GPIOx->SECCFGR, PinMask);
1365 }
1366 
1367 #endif /* CPU_IN_SECURE_STATE */
1368 
1369 /**
1370   * @brief  Return if secure write only access for several pin of dedicated port is enabled or not.
1371   * @rmtoll SECCFGR      SECy           LL_GPIO_IsEnabledPinSecure
1372   * @param  GPIOx GPIO Port
1373   * @param  PinMask This parameter can be a combination of the following values:
1374   *         @arg @ref LL_GPIO_PIN_0
1375   *         @arg @ref LL_GPIO_PIN_1
1376   *         @arg @ref LL_GPIO_PIN_2
1377   *         @arg @ref LL_GPIO_PIN_3
1378   *         @arg @ref LL_GPIO_PIN_4
1379   *         @arg @ref LL_GPIO_PIN_5
1380   *         @arg @ref LL_GPIO_PIN_6
1381   *         @arg @ref LL_GPIO_PIN_7
1382   *         @arg @ref LL_GPIO_PIN_8
1383   *         @arg @ref LL_GPIO_PIN_9
1384   *         @arg @ref LL_GPIO_PIN_10
1385   *         @arg @ref LL_GPIO_PIN_11
1386   *         @arg @ref LL_GPIO_PIN_12
1387   *         @arg @ref LL_GPIO_PIN_13
1388   *         @arg @ref LL_GPIO_PIN_14
1389   *         @arg @ref LL_GPIO_PIN_15
1390   *         @arg @ref LL_GPIO_PIN_ALL
1391   * @retval State of bit (1 or 0).
1392   */
LL_GPIO_IsEnabledPinSecure(const GPIO_TypeDef * GPIOx,uint32_t PinMask)1393 __STATIC_INLINE uint32_t LL_GPIO_IsEnabledPinSecure(const GPIO_TypeDef *GPIOx, uint32_t PinMask)
1394 {
1395   return ((READ_BIT(GPIOx->SECCFGR, PinMask) == (PinMask)) ? 1UL : 0UL);
1396 }
1397 
1398 
1399 
1400 #if defined CPU_IN_SECURE_STATE
1401 
1402 /**
1403   * @brief  Enable secure write only access for several pin of dedicated port.
1404   * @rmtoll SECCFGR      SECy           LL_GPIO_EnablePinPrivilege
1405   * @param  GPIOx GPIO Port
1406   * @param  PinMask This parameter can be a combination of the following values:
1407   *         @arg @ref LL_GPIO_PIN_0
1408   *         @arg @ref LL_GPIO_PIN_1
1409   *         @arg @ref LL_GPIO_PIN_2
1410   *         @arg @ref LL_GPIO_PIN_3
1411   *         @arg @ref LL_GPIO_PIN_4
1412   *         @arg @ref LL_GPIO_PIN_5
1413   *         @arg @ref LL_GPIO_PIN_6
1414   *         @arg @ref LL_GPIO_PIN_7
1415   *         @arg @ref LL_GPIO_PIN_8
1416   *         @arg @ref LL_GPIO_PIN_9
1417   *         @arg @ref LL_GPIO_PIN_10
1418   *         @arg @ref LL_GPIO_PIN_11
1419   *         @arg @ref LL_GPIO_PIN_12
1420   *         @arg @ref LL_GPIO_PIN_13
1421   *         @arg @ref LL_GPIO_PIN_14
1422   *         @arg @ref LL_GPIO_PIN_15
1423   *         @arg @ref LL_GPIO_PIN_ALL
1424   * @retval None
1425   */
LL_GPIO_EnablePinPrivilege(GPIO_TypeDef * GPIOx,uint32_t PinMask)1426 __STATIC_INLINE void LL_GPIO_EnablePinPrivilege(GPIO_TypeDef *GPIOx, uint32_t PinMask)
1427 {
1428   SET_BIT(GPIOx->PRIVCFGR, PinMask);
1429 }
1430 
1431 
1432 /**
1433   * @brief  Disable secure write only access for several pin of dedicated port.
1434   * @rmtoll SECCFGR      SECy           LL_GPIO_DisablePinPrivilege
1435   * @param  GPIOx GPIO Port
1436   * @param  PinMask This parameter can be a combination of the following values:
1437   *         @arg @ref LL_GPIO_PIN_0
1438   *         @arg @ref LL_GPIO_PIN_1
1439   *         @arg @ref LL_GPIO_PIN_2
1440   *         @arg @ref LL_GPIO_PIN_3
1441   *         @arg @ref LL_GPIO_PIN_4
1442   *         @arg @ref LL_GPIO_PIN_5
1443   *         @arg @ref LL_GPIO_PIN_6
1444   *         @arg @ref LL_GPIO_PIN_7
1445   *         @arg @ref LL_GPIO_PIN_8
1446   *         @arg @ref LL_GPIO_PIN_9
1447   *         @arg @ref LL_GPIO_PIN_10
1448   *         @arg @ref LL_GPIO_PIN_11
1449   *         @arg @ref LL_GPIO_PIN_12
1450   *         @arg @ref LL_GPIO_PIN_13
1451   *         @arg @ref LL_GPIO_PIN_14
1452   *         @arg @ref LL_GPIO_PIN_15
1453   *         @arg @ref LL_GPIO_PIN_ALL
1454   * @retval None
1455   */
LL_GPIO_DisablePinPrivilege(GPIO_TypeDef * GPIOx,uint32_t PinMask)1456 __STATIC_INLINE void LL_GPIO_DisablePinPrivilege(GPIO_TypeDef *GPIOx, uint32_t PinMask)
1457 {
1458   CLEAR_BIT(GPIOx->PRIVCFGR, PinMask);
1459 }
1460 
1461 #endif /* CPU_IN_SECURE_STATE */
1462 
1463 /**
1464   * @brief  Return if privilege write only access for several pin of dedicated port is enabled or not.
1465   * @rmtoll SECCFGR      SECy           LL_GPIO_IsEnabledPinSecure
1466   * @param  GPIOx GPIO Port
1467   * @param  PinMask This parameter can be a combination of the following values:
1468   *         @arg @ref LL_GPIO_PIN_0
1469   *         @arg @ref LL_GPIO_PIN_1
1470   *         @arg @ref LL_GPIO_PIN_2
1471   *         @arg @ref LL_GPIO_PIN_3
1472   *         @arg @ref LL_GPIO_PIN_4
1473   *         @arg @ref LL_GPIO_PIN_5
1474   *         @arg @ref LL_GPIO_PIN_6
1475   *         @arg @ref LL_GPIO_PIN_7
1476   *         @arg @ref LL_GPIO_PIN_8
1477   *         @arg @ref LL_GPIO_PIN_9
1478   *         @arg @ref LL_GPIO_PIN_10
1479   *         @arg @ref LL_GPIO_PIN_11
1480   *         @arg @ref LL_GPIO_PIN_12
1481   *         @arg @ref LL_GPIO_PIN_13
1482   *         @arg @ref LL_GPIO_PIN_14
1483   *         @arg @ref LL_GPIO_PIN_15
1484   *         @arg @ref LL_GPIO_PIN_ALL
1485   * @retval State of bit (1 or 0).
1486   */
LL_GPIO_IsEnabledPinPrivilege(const GPIO_TypeDef * GPIOx,uint32_t PinMask)1487 __STATIC_INLINE uint32_t LL_GPIO_IsEnabledPinPrivilege(const GPIO_TypeDef *GPIOx, uint32_t PinMask)
1488 {
1489   return ((READ_BIT(GPIOx->PRIVCFGR, PinMask) == (PinMask)) ? 1UL : 0UL);
1490 }
1491 
1492 
1493 /**
1494   * @}
1495   */
1496 #if defined(USE_FULL_LL_DRIVER)
1497 /** @defgroup GPIO_LL_EF_Init Initialization and de-initialization functions
1498   * @{
1499   */
1500 
1501 ErrorStatus LL_GPIO_DeInit(const GPIO_TypeDef *GPIOx);
1502 ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, const LL_GPIO_InitTypeDef *GPIO_InitStruct);
1503 void        LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct);
1504 
1505 /**
1506   * @}
1507   */
1508 #endif /* USE_FULL_LL_DRIVER */
1509 
1510 /**
1511   * @}
1512   */
1513 
1514 /**
1515   * @}
1516   */
1517 
1518 /**
1519   * @}
1520   */
1521 
1522 /**
1523   * @}
1524   */
1525 
1526 
1527 #endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPION) || defined (GPIOO) || defined (GPIOP) || defined (GPIOQ) */
1528 /**
1529   * @}
1530   */
1531 
1532 #ifdef __cplusplus
1533 }
1534 #endif
1535 
1536 #endif /* STM32N6xx_LL_GPIO_H */
1537 
1538