1 /**
2   ******************************************************************************
3   * @file    stm32wbaxx_hal_gpio.h
4   * @author  MCD Application Team
5   * @brief   Header file of GPIO HAL module.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2022 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 STM32WBAxx_HAL_GPIO_H
21 #define STM32WBAxx_HAL_GPIO_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32wbaxx_hal_def.h"
29 
30 /** @addtogroup STM32WBAxx_HAL_Driver
31   * @{
32   */
33 
34 /** @defgroup GPIO GPIO
35   * @brief GPIO HAL module driver
36   * @{
37   */
38 
39 /* Exported types ------------------------------------------------------------*/
40 
41 /** @defgroup GPIO_Exported_Types GPIO Exported Types
42   * @{
43   */
44 /**
45   * @brief   GPIO Init structure definition
46   */
47 typedef struct
48 {
49   uint32_t Pin;        /*!< Specifies the GPIO pins to be configured.
50                             This parameter can be any value of @ref GPIO_pins */
51 
52   uint32_t Mode;       /*!< Specifies the operating mode for the selected pins.
53                             This parameter can be a value of @ref GPIO_mode */
54 
55   uint32_t Pull;       /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
56                             This parameter can be a value of @ref GPIO_pull */
57 
58   uint32_t Speed;      /*!< Specifies the speed for the selected pins.
59                             This parameter can be a value of @ref GPIO_speed */
60 
61   uint32_t Alternate;  /*!< Peripheral to be connected to the selected pins
62                             This parameter can be a value of @ref GPIOEx_Alternate_function_selection */
63 } GPIO_InitTypeDef;
64 
65 /**
66   * @brief  GPIO Bit SET and Bit RESET enumeration
67   */
68 typedef enum
69 {
70   GPIO_PIN_RESET = 0U,
71   GPIO_PIN_SET
72 } GPIO_PinState;
73 /**
74   * @}
75   */
76 
77 /* Exported constants --------------------------------------------------------*/
78 /** @defgroup GPIO_Exported_Constants GPIO Exported Constants
79   * @{
80   */
81 /** @defgroup GPIO_pins GPIO pins
82   * @{
83   */
84 #define GPIO_PIN_0                      ((uint16_t)0x0001)  /* Pin 0 selected    */
85 #define GPIO_PIN_1                      ((uint16_t)0x0002)  /* Pin 1 selected    */
86 #define GPIO_PIN_2                      ((uint16_t)0x0004)  /* Pin 2 selected    */
87 #define GPIO_PIN_3                      ((uint16_t)0x0008)  /* Pin 3 selected    */
88 #define GPIO_PIN_4                      ((uint16_t)0x0010)  /* Pin 4 selected    */
89 #define GPIO_PIN_5                      ((uint16_t)0x0020)  /* Pin 5 selected    */
90 #define GPIO_PIN_6                      ((uint16_t)0x0040)  /* Pin 6 selected    */
91 #define GPIO_PIN_7                      ((uint16_t)0x0080)  /* Pin 7 selected    */
92 #define GPIO_PIN_8                      ((uint16_t)0x0100)  /* Pin 8 selected    */
93 #define GPIO_PIN_9                      ((uint16_t)0x0200)  /* Pin 9 selected    */
94 #define GPIO_PIN_10                     ((uint16_t)0x0400)  /* Pin 10 selected   */
95 #define GPIO_PIN_11                     ((uint16_t)0x0800)  /* Pin 11 selected   */
96 #define GPIO_PIN_12                     ((uint16_t)0x1000)  /* Pin 12 selected   */
97 #define GPIO_PIN_13                     ((uint16_t)0x2000)  /* Pin 13 selected   */
98 #define GPIO_PIN_14                     ((uint16_t)0x4000)  /* Pin 14 selected   */
99 #define GPIO_PIN_15                     ((uint16_t)0x8000)  /* Pin 15 selected   */
100 #define GPIO_PIN_All                    ((uint16_t)0xFFFF)  /* All pins selected */
101 
102 #define GPIO_PIN_MASK                   (0x0000FFFFu) /* PIN mask for assert test */
103 /**
104   * @}
105   */
106 
107 /** @defgroup GPIO_mode GPIO mode
108   * @brief GPIO Configuration Mode
109   *        Elements values convention: 0x00WX00YZ
110   *           - W  : EXTI trigger detection on 3 bits
111   *           - X  : EXTI mode (IT or Event) on 2 bits
112   *           - Y  : Output type (Push Pull or Open Drain) on 1 bit
113   *           - Z  : GPIO mode (Input, Output, Alternate or Analog) on 2 bits
114   * @{
115   */
116 #define GPIO_MODE_INPUT                 MODE_INPUT                                                  /*!< Input Floating Mode                                                */
117 #define GPIO_MODE_OUTPUT_PP             (MODE_OUTPUT | OUTPUT_PP)                                   /*!< Output Push Pull Mode                                              */
118 #define GPIO_MODE_OUTPUT_OD             (MODE_OUTPUT | OUTPUT_OD)                                   /*!< Output Open Drain Mode                                             */
119 #define GPIO_MODE_AF_PP                 (MODE_AF | OUTPUT_PP)                                       /*!< Alternate Function Push Pull Mode                                  */
120 #define GPIO_MODE_AF_OD                 (MODE_AF | OUTPUT_OD)                                       /*!< Alternate Function Open Drain Mode                                 */
121 #define GPIO_MODE_ANALOG                MODE_ANALOG                                                 /*!< Analog Mode                                                        */
122 #define GPIO_MODE_IT_RISING             (MODE_INPUT | EXTI_IT | TRIGGER_RISING)                     /*!< External Interrupt Mode with Rising edge trigger detection         */
123 #define GPIO_MODE_IT_FALLING            (MODE_INPUT | EXTI_IT | TRIGGER_FALLING)                    /*!< External Interrupt Mode with Falling edge trigger detection        */
124 #define GPIO_MODE_IT_RISING_FALLING     (MODE_INPUT | EXTI_IT | TRIGGER_RISING | TRIGGER_FALLING)   /*!< External Interrupt Mode with Rising/Falling edge trigger detection */
125 #define GPIO_MODE_EVT_RISING            (MODE_INPUT | EXTI_EVT | TRIGGER_RISING)                    /*!< External Event Mode with Rising edge trigger detection             */
126 #define GPIO_MODE_EVT_FALLING           (MODE_INPUT | EXTI_EVT | TRIGGER_FALLING)                   /*!< External Event Mode with Falling edge trigger detection            */
127 #define GPIO_MODE_EVT_RISING_FALLING    (MODE_INPUT | EXTI_EVT | TRIGGER_RISING | TRIGGER_FALLING)  /*!< External Event Mode with Rising/Falling edge trigger detection     */
128 /**
129   * @}
130   */
131 
132 /** @defgroup GPIO_speed GPIO speed
133   * @brief GPIO Output Maximum frequency
134   * @{
135   */
136 #define GPIO_SPEED_FREQ_LOW             0x00000000u  /*!< Low speed       */
137 #define GPIO_SPEED_FREQ_MEDIUM          0x00000001u  /*!< Medium speed    */
138 #define GPIO_SPEED_FREQ_HIGH            0x00000002u  /*!< High speed      */
139 /**
140   * @}
141   */
142 
143 /** @defgroup GPIO_pull GPIO pull
144   * @brief GPIO Pull-Up or Pull-Down Activation
145   * @{
146   */
147 #define GPIO_NOPULL                     0x00000000u   /*!< No Pull-up or Pull-down activation  */
148 #define GPIO_PULLUP                     0x00000001u   /*!< Pull-up activation                  */
149 #define GPIO_PULLDOWN                   0x00000002u   /*!< Pull-down activation                */
150 /**
151   * @}
152   */
153 
154 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
155 
156 /** @defgroup GPIO_attributes GPIO attributes
157   * @brief GPIO pin secure or non-secure attributes
158   * @{
159   */
160 #define  GPIO_PIN_SEC       (0x00000001U)   /*!< Secure pin attribute      */
161 #define  GPIO_PIN_NSEC      (0x00000000U)   /*!< Non-secure pin attribute  */
162 /**
163   * @}
164   */
165 
166 #endif /* __ARM_FEATURE_CMSE */
167 /**
168   * @}
169   */
170 
171 /* Exported macro ------------------------------------------------------------*/
172 /** @defgroup GPIO_Exported_Macros GPIO Exported Macros
173   * @{
174   */
175 
176 /**
177   * @brief  Check whether the specified EXTI line is rising edge asserted or not.
178   * @param  __EXTI_LINE__ specifies the EXTI line to check.
179   *          This parameter can be GPIO_PIN_x where x can be(0..15)
180   * @retval The new state of __EXTI_LINE__ (SET or RESET).
181   */
182 #define __HAL_GPIO_EXTI_GET_RISING_IT(__EXTI_LINE__)         (EXTI->RPR1 & (__EXTI_LINE__))
183 
184 /**
185   * @brief  Clear the EXTI line rising pending bits.
186   * @param  __EXTI_LINE__ specifies the EXTI lines to clear.
187   *          This parameter can be any combination of GPIO_PIN_x where x can be (0..15)
188   * @retval None
189   */
190 #define __HAL_GPIO_EXTI_CLEAR_RISING_IT(__EXTI_LINE__)       (EXTI->RPR1 = (__EXTI_LINE__))
191 
192 /**
193   * @brief  Check whether the specified EXTI line is falling edge asserted or not.
194   * @param  __EXTI_LINE__ specifies the EXTI line to check.
195   *          This parameter can be GPIO_PIN_x where x can be(0..15)
196   * @retval The new state of __EXTI_LINE__ (SET or RESET).
197   */
198 #define __HAL_GPIO_EXTI_GET_FALLING_IT(__EXTI_LINE__)        (EXTI->FPR1 & (__EXTI_LINE__))
199 
200 /**
201   * @brief  Clear the EXTI line falling pending bits.
202   * @param  __EXTI_LINE__ specifies the EXTI lines to clear.
203   *          This parameter can be any combination of GPIO_PIN_x where x can be (0..15)
204   * @retval None
205   */
206 #define __HAL_GPIO_EXTI_CLEAR_FALLING_IT(__EXTI_LINE__)      (EXTI->FPR1 = (__EXTI_LINE__))
207 
208 /**
209   * @brief  Check whether the specified EXTI line is asserted or not.
210   * @param __EXTI_LINE__ specifies the EXTI line to check.
211   *          This parameter can be GPIO_PIN_x where x can be(0..15)
212   * @retval The new state of __EXTI_LINE__ (SET or RESET).
213   */
214 #define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__)         (__HAL_GPIO_EXTI_GET_RISING_IT(__EXTI_LINE__) || \
215                                                        __HAL_GPIO_EXTI_GET_FALLING_IT(__EXTI_LINE__))
216 
217 /**
218   * @brief  Clear the EXTI's line pending bits.
219   * @param  __EXTI_LINE__ specifies the EXTI lines to clear.
220   *          This parameter can be any combination of GPIO_PIN_x where x can be (0..15)
221   * @retval None
222   */
223 #define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__)         \
224   do {                                                  \
225     __HAL_GPIO_EXTI_CLEAR_RISING_IT(__EXTI_LINE__);     \
226     __HAL_GPIO_EXTI_CLEAR_FALLING_IT(__EXTI_LINE__);    \
227   } while(0)
228 
229 
230 /**
231   * @brief  Generate a Software interrupt on selected EXTI line(s).
232   * @param  __EXTI_LINE__ specifies the EXTI line to be set.
233   *          This parameter can be any combination of GPIO_PIN_x where x can be (0..15)
234   * @retval None
235   */
236 #define __HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__)  (EXTI->SWIER1 = (__EXTI_LINE__))
237 /**
238   * @}
239   */
240 
241 /* Private macros ------------------------------------------------------------*/
242 /** @defgroup GPIO_Private_Constants GPIO Private Constants
243   * @{
244   */
245 #define GPIO_MODE_Pos                           0u
246 #define GPIO_MODE                               (0x3uL << GPIO_MODE_Pos)
247 #define MODE_INPUT                              (0x0uL << GPIO_MODE_Pos)
248 #define MODE_OUTPUT                             (0x1uL << GPIO_MODE_Pos)
249 #define MODE_AF                                 (0x2uL << GPIO_MODE_Pos)
250 #define MODE_ANALOG                             (0x3uL << GPIO_MODE_Pos)
251 #define OUTPUT_TYPE_Pos                         4u
252 #define OUTPUT_TYPE                             (0x1uL << OUTPUT_TYPE_Pos)
253 #define OUTPUT_PP                               (0x0uL << OUTPUT_TYPE_Pos)
254 #define OUTPUT_OD                               (0x1uL << OUTPUT_TYPE_Pos)
255 #define EXTI_MODE_Pos                           16u
256 #define EXTI_MODE                               (0x3uL << EXTI_MODE_Pos)
257 #define EXTI_IT                                 (0x1uL << EXTI_MODE_Pos)
258 #define EXTI_EVT                                (0x2uL << EXTI_MODE_Pos)
259 #define TRIGGER_MODE_Pos                         20u
260 #define TRIGGER_MODE                            (0x7uL << TRIGGER_MODE_Pos)
261 #define TRIGGER_RISING                          (0x1uL << TRIGGER_MODE_Pos)
262 #define TRIGGER_FALLING                         (0x2uL << TRIGGER_MODE_Pos)
263 /**
264   * @}
265   */
266 
267 /** @defgroup GPIO_Private_Macros GPIO Private Macros
268   * @{
269   */
270 #define IS_GPIO_PIN_ACTION(ACTION)  (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET))
271 
272 #define IS_GPIO_PIN(__PIN__)        ((((uint32_t)(__PIN__) & GPIO_PIN_MASK) != 0x00u) &&\
273                                      (((uint32_t)(__PIN__) & ~GPIO_PIN_MASK) == 0x00u))
274 
275 #define IS_GPIO_COMMON_PIN(__RESETMASK__, __SETMASK__)   \
276   (((uint32_t)(__RESETMASK__) & (uint32_t)(__SETMASK__)) == 0x00u)
277 
278 #define IS_GPIO_MODE(__MODE__)      (((__MODE__) == GPIO_MODE_INPUT)              ||\
279                                      ((__MODE__) == GPIO_MODE_OUTPUT_PP)          ||\
280                                      ((__MODE__) == GPIO_MODE_OUTPUT_OD)          ||\
281                                      ((__MODE__) == GPIO_MODE_AF_PP)              ||\
282                                      ((__MODE__) == GPIO_MODE_AF_OD)              ||\
283                                      ((__MODE__) == GPIO_MODE_IT_RISING)          ||\
284                                      ((__MODE__) == GPIO_MODE_IT_FALLING)         ||\
285                                      ((__MODE__) == GPIO_MODE_IT_RISING_FALLING)  ||\
286                                      ((__MODE__) == GPIO_MODE_EVT_RISING)         ||\
287                                      ((__MODE__) == GPIO_MODE_EVT_FALLING)        ||\
288                                      ((__MODE__) == GPIO_MODE_EVT_RISING_FALLING) ||\
289                                      ((__MODE__) == GPIO_MODE_ANALOG))
290 
291 #define IS_GPIO_SPEED(__SPEED__)    (((__SPEED__) == GPIO_SPEED_FREQ_LOW)    ||\
292                                      ((__SPEED__) == GPIO_SPEED_FREQ_MEDIUM) ||\
293                                      ((__SPEED__) == GPIO_SPEED_FREQ_HIGH))
294 
295 #define IS_GPIO_PULL(__PULL__)      (((__PULL__) == GPIO_NOPULL)   ||\
296                                      ((__PULL__) == GPIO_PULLUP)   || \
297                                      ((__PULL__) == GPIO_PULLDOWN))
298 
299 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
300 
301 #define IS_GPIO_PIN_ATTRIBUTES(__ATTRIBUTES__)  (((__ATTRIBUTES__) == GPIO_PIN_SEC)  ||\
302                                                  ((__ATTRIBUTES__) == GPIO_PIN_NSEC))
303 
304 #endif /* __ARM_FEATURE_CMSE */
305 
306 /* Include GPIO HAL Extended module */
307 #include "stm32wbaxx_hal_gpio_ex.h"
308 
309 /* Exported functions --------------------------------------------------------*/
310 /** @defgroup GPIO_Exported_Functions GPIO Exported Functions
311   *  @brief    GPIO Exported Functions
312   * @{
313   */
314 
315 /** @defgroup GPIO_Exported_Functions_Group1 Initialization/de-initialization functions
316   *  @brief    Initialization and Configuration functions
317   * @{
318   */
319 
320 /* Initialization and de-initialization functions *****************************/
321 void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, const GPIO_InitTypeDef *GPIO_Init);
322 void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);
323 
324 /**
325   * @}
326   */
327 
328 /** @defgroup GPIO_Exported_Functions_Group2 IO operation functions
329   *  @brief    IO operation functions
330   * @{
331   */
332 
333 /* IO operation functions *****************************************************/
334 GPIO_PinState     HAL_GPIO_ReadPin(const GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
335 void              HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
336 void              HAL_GPIO_WriteMultipleStatePin(GPIO_TypeDef *GPIOx, uint16_t PinReset, uint16_t PinSet);
337 void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
338 HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
339 void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
340 void              HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin);
341 void              HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin);
342 
343 /**
344   * @}
345   */
346 
347 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
348 
349 /** @defgroup GPIO_Exported_Functions_Group3 IO attributes management functions
350   * @{
351   */
352 
353 /* IO attributes management functions *****************************************/
354 void              HAL_GPIO_ConfigPinAttributes(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, uint32_t PinAttributes);
355 HAL_StatusTypeDef HAL_GPIO_GetConfigPinAttributes(const GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, uint32_t *pPinAttributes);
356 
357 /**
358   * @}
359   */
360 
361 #endif /* __ARM_FEATURE_CMSE */
362 
363 /**
364   * @}
365   */
366 
367 /**
368   * @}
369   */
370 
371 /**
372   * @}
373   */
374 
375 /**
376   * @}
377   */
378 
379 #ifdef __cplusplus
380 }
381 #endif
382 
383 #endif /* STM32WBAxx_HAL_GPIO_H */
384 
385