1 /**
2 ******************************************************************************
3 * @file stm32f1xx_hal_gpio.c
4 * @author MCD Application Team
5 * @brief GPIO HAL module driver.
6 * This file provides firmware functions to manage the following
7 * functionalities of the General Purpose Input/Output (GPIO) peripheral:
8 * + Initialization and de-initialization functions
9 * + IO operation functions
10 *
11 @verbatim
12 ==============================================================================
13 ##### GPIO Peripheral features #####
14 ==============================================================================
15 [..]
16 Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each
17 port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software
18 in several modes:
19 (+) Input mode
20 (+) Analog mode
21 (+) Output mode
22 (+) Alternate function mode
23 (+) External interrupt/event lines
24
25 [..]
26 During and just after reset, the alternate functions and external interrupt
27 lines are not active and the I/O ports are configured in input floating mode.
28
29 [..]
30 All GPIO pins have weak internal pull-up and pull-down resistors, which can be
31 activated or not.
32
33 [..]
34 In Output or Alternate mode, each IO can be configured on open-drain or push-pull
35 type and the IO speed can be selected depending on the VDD value.
36
37 [..]
38 All ports have external interrupt/event capability. To use external interrupt
39 lines, the port must be configured in input mode. All available GPIO pins are
40 connected to the 16 external interrupt/event lines from EXTI0 to EXTI15.
41
42 [..]
43 The external interrupt/event controller consists of up to 20 edge detectors in connectivity
44 line devices, or 19 edge detectors in other devices for generating event/interrupt requests.
45 Each input line can be independently configured to select the type (event or interrupt) and
46 the corresponding trigger event (rising or falling or both). Each line can also masked
47 independently. A pending register maintains the status line of the interrupt requests
48
49 ##### How to use this driver #####
50 ==============================================================================
51 [..]
52 (#) Enable the GPIO APB2 clock using the following function : __HAL_RCC_GPIOx_CLK_ENABLE().
53
54 (#) Configure the GPIO pin(s) using HAL_GPIO_Init().
55 (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure
56 (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef
57 structure.
58 (++) In case of Output or alternate function mode selection: the speed is
59 configured through "Speed" member from GPIO_InitTypeDef structure
60 (++) Analog mode is required when a pin is to be used as ADC channel
61 or DAC output.
62 (++) In case of external interrupt/event selection the "Mode" member from
63 GPIO_InitTypeDef structure select the type (interrupt or event) and
64 the corresponding trigger event (rising or falling or both).
65
66 (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority
67 mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using
68 HAL_NVIC_EnableIRQ().
69
70 (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin().
71
72 (#) To set/reset the level of a pin configured in output mode use
73 HAL_GPIO_WritePin()/HAL_GPIO_TogglePin().
74
75 (#) To lock pin configuration until next reset use HAL_GPIO_LockPin().
76
77 (#) During and just after reset, the alternate functions are not
78 active and the GPIO pins are configured in input floating mode (except JTAG
79 pins).
80
81 (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose
82 (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has
83 priority over the GPIO function.
84
85 (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as
86 general purpose PD0 and PD1, respectively, when the HSE oscillator is off.
87 The HSE has priority over the GPIO function.
88
89 @endverbatim
90 ******************************************************************************
91 * @attention
92 *
93 * <h2><center>© Copyright (c) 2016 STMicroelectronics.
94 * All rights reserved.</center></h2>
95 *
96 * This software component is licensed by ST under BSD 3-Clause license,
97 * the "License"; You may not use this file except in compliance with the
98 * License. You may obtain a copy of the License at:
99 * opensource.org/licenses/BSD-3-Clause
100 *
101 ******************************************************************************
102 */
103
104 /* Includes ------------------------------------------------------------------*/
105 #include "stm32f1xx_hal.h"
106
107 /** @addtogroup STM32F1xx_HAL_Driver
108 * @{
109 */
110
111 /** @defgroup GPIO GPIO
112 * @brief GPIO HAL module driver
113 * @{
114 */
115
116 #ifdef HAL_GPIO_MODULE_ENABLED
117
118 /* Private typedef -----------------------------------------------------------*/
119 /* Private define ------------------------------------------------------------*/
120 /** @addtogroup GPIO_Private_Constants GPIO Private Constants
121 * @{
122 */
123 #define GPIO_MODE 0x00000003u
124 #define EXTI_MODE 0x10000000u
125 #define GPIO_MODE_IT 0x00010000u
126 #define GPIO_MODE_EVT 0x00020000u
127 #define RISING_EDGE 0x00100000u
128 #define FALLING_EDGE 0x00200000u
129 #define GPIO_OUTPUT_TYPE 0x00000010u
130
131 #define GPIO_NUMBER 16u
132
133 /* Definitions for bit manipulation of CRL and CRH register */
134 #define GPIO_CR_MODE_INPUT 0x00000000u /*!< 00: Input mode (reset state) */
135 #define GPIO_CR_CNF_ANALOG 0x00000000u /*!< 00: Analog mode */
136 #define GPIO_CR_CNF_INPUT_FLOATING 0x00000004u /*!< 01: Floating input (reset state) */
137 #define GPIO_CR_CNF_INPUT_PU_PD 0x00000008u /*!< 10: Input with pull-up / pull-down */
138 #define GPIO_CR_CNF_GP_OUTPUT_PP 0x00000000u /*!< 00: General purpose output push-pull */
139 #define GPIO_CR_CNF_GP_OUTPUT_OD 0x00000004u /*!< 01: General purpose output Open-drain */
140 #define GPIO_CR_CNF_AF_OUTPUT_PP 0x00000008u /*!< 10: Alternate function output Push-pull */
141 #define GPIO_CR_CNF_AF_OUTPUT_OD 0x0000000Cu /*!< 11: Alternate function output Open-drain */
142
143 /**
144 * @}
145 */
146 /* Private macro -------------------------------------------------------------*/
147 /* Private variables ---------------------------------------------------------*/
148 /* Private function prototypes -----------------------------------------------*/
149 /* Private functions ---------------------------------------------------------*/
150 /* Exported functions --------------------------------------------------------*/
151 /** @defgroup GPIO_Exported_Functions GPIO Exported Functions
152 * @{
153 */
154
155 /** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions
156 * @brief Initialization and Configuration functions
157 *
158 @verbatim
159 ===============================================================================
160 ##### Initialization and de-initialization functions #####
161 ===============================================================================
162 [..]
163 This section provides functions allowing to initialize and de-initialize the GPIOs
164 to be ready for use.
165
166 @endverbatim
167 * @{
168 */
169
170
171 /**
172 * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init.
173 * @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
174 * @param GPIO_Init: pointer to a GPIO_InitTypeDef structure that contains
175 * the configuration information for the specified GPIO peripheral.
176 * @retval None
177 */
HAL_GPIO_Init(GPIO_TypeDef * GPIOx,GPIO_InitTypeDef * GPIO_Init)178 void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
179 {
180 uint32_t position = 0x00u;
181 uint32_t ioposition;
182 uint32_t iocurrent;
183 uint32_t temp;
184 uint32_t config = 0x00u;
185 __IO uint32_t *configregister; /* Store the address of CRL or CRH register based on pin number */
186 uint32_t registeroffset; /* offset used during computation of CNF and MODE bits placement inside CRL or CRH register */
187
188 /* Check the parameters */
189 assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
190 assert_param(IS_GPIO_PIN(GPIO_Init->Pin));
191 assert_param(IS_GPIO_MODE(GPIO_Init->Mode));
192
193 /* Configure the port pins */
194 while (((GPIO_Init->Pin) >> position) != 0x00u)
195 {
196 /* Get the IO position */
197 ioposition = (0x01uL << position);
198
199 /* Get the current IO position */
200 iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition;
201
202 if (iocurrent == ioposition)
203 {
204 /* Check the Alternate function parameters */
205 assert_param(IS_GPIO_AF_INSTANCE(GPIOx));
206
207 /* Based on the required mode, filling config variable with MODEy[1:0] and CNFy[3:2] corresponding bits */
208 switch (GPIO_Init->Mode)
209 {
210 /* If we are configuring the pin in OUTPUT push-pull mode */
211 case GPIO_MODE_OUTPUT_PP:
212 /* Check the GPIO speed parameter */
213 assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
214 config = GPIO_Init->Speed + GPIO_CR_CNF_GP_OUTPUT_PP;
215 break;
216
217 /* If we are configuring the pin in OUTPUT open-drain mode */
218 case GPIO_MODE_OUTPUT_OD:
219 /* Check the GPIO speed parameter */
220 assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
221 config = GPIO_Init->Speed + GPIO_CR_CNF_GP_OUTPUT_OD;
222 break;
223
224 /* If we are configuring the pin in ALTERNATE FUNCTION push-pull mode */
225 case GPIO_MODE_AF_PP:
226 /* Check the GPIO speed parameter */
227 assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
228 config = GPIO_Init->Speed + GPIO_CR_CNF_AF_OUTPUT_PP;
229 break;
230
231 /* If we are configuring the pin in ALTERNATE FUNCTION open-drain mode */
232 case GPIO_MODE_AF_OD:
233 /* Check the GPIO speed parameter */
234 assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
235 config = GPIO_Init->Speed + GPIO_CR_CNF_AF_OUTPUT_OD;
236 break;
237
238 /* If we are configuring the pin in INPUT (also applicable to EVENT and IT mode) */
239 case GPIO_MODE_INPUT:
240 case GPIO_MODE_IT_RISING:
241 case GPIO_MODE_IT_FALLING:
242 case GPIO_MODE_IT_RISING_FALLING:
243 case GPIO_MODE_EVT_RISING:
244 case GPIO_MODE_EVT_FALLING:
245 case GPIO_MODE_EVT_RISING_FALLING:
246 /* Check the GPIO pull parameter */
247 assert_param(IS_GPIO_PULL(GPIO_Init->Pull));
248 if (GPIO_Init->Pull == GPIO_NOPULL)
249 {
250 config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_FLOATING;
251 }
252 else if (GPIO_Init->Pull == GPIO_PULLUP)
253 {
254 config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_PU_PD;
255
256 /* Set the corresponding ODR bit */
257 GPIOx->BSRR = ioposition;
258 }
259 else /* GPIO_PULLDOWN */
260 {
261 config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_PU_PD;
262
263 /* Reset the corresponding ODR bit */
264 GPIOx->BRR = ioposition;
265 }
266 break;
267
268 /* If we are configuring the pin in INPUT analog mode */
269 case GPIO_MODE_ANALOG:
270 config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_ANALOG;
271 break;
272
273 /* Parameters are checked with assert_param */
274 default:
275 break;
276 }
277
278 /* Check if the current bit belongs to first half or last half of the pin count number
279 in order to address CRH or CRL register*/
280 configregister = (iocurrent < GPIO_PIN_8) ? &GPIOx->CRL : &GPIOx->CRH;
281 registeroffset = (iocurrent < GPIO_PIN_8) ? (position << 2u) : ((position - 8u) << 2u);
282
283 /* Apply the new configuration of the pin to the register */
284 MODIFY_REG((*configregister), ((GPIO_CRL_MODE0 | GPIO_CRL_CNF0) << registeroffset), (config << registeroffset));
285
286 /*--------------------- EXTI Mode Configuration ------------------------*/
287 /* Configure the External Interrupt or event for the current IO */
288 if ((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE)
289 {
290 /* Enable AFIO Clock */
291 __HAL_RCC_AFIO_CLK_ENABLE();
292 temp = AFIO->EXTICR[position >> 2u];
293 CLEAR_BIT(temp, (0x0Fu) << (4u * (position & 0x03u)));
294 SET_BIT(temp, (GPIO_GET_INDEX(GPIOx)) << (4u * (position & 0x03u)));
295 AFIO->EXTICR[position >> 2u] = temp;
296
297
298 /* Configure the interrupt mask */
299 if ((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT)
300 {
301 SET_BIT(EXTI->IMR, iocurrent);
302 }
303 else
304 {
305 CLEAR_BIT(EXTI->IMR, iocurrent);
306 }
307
308 /* Configure the event mask */
309 if ((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT)
310 {
311 SET_BIT(EXTI->EMR, iocurrent);
312 }
313 else
314 {
315 CLEAR_BIT(EXTI->EMR, iocurrent);
316 }
317
318 /* Enable or disable the rising trigger */
319 if ((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE)
320 {
321 SET_BIT(EXTI->RTSR, iocurrent);
322 }
323 else
324 {
325 CLEAR_BIT(EXTI->RTSR, iocurrent);
326 }
327
328 /* Enable or disable the falling trigger */
329 if ((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE)
330 {
331 SET_BIT(EXTI->FTSR, iocurrent);
332 }
333 else
334 {
335 CLEAR_BIT(EXTI->FTSR, iocurrent);
336 }
337 }
338 }
339
340 position++;
341 }
342 }
343
344 /**
345 * @brief De-initializes the GPIOx peripheral registers to their default reset values.
346 * @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
347 * @param GPIO_Pin: specifies the port bit to be written.
348 * This parameter can be one of GPIO_PIN_x where x can be (0..15).
349 * @retval None
350 */
HAL_GPIO_DeInit(GPIO_TypeDef * GPIOx,uint32_t GPIO_Pin)351 void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
352 {
353 uint32_t position = 0x00u;
354 uint32_t iocurrent;
355 uint32_t tmp;
356 __IO uint32_t *configregister; /* Store the address of CRL or CRH register based on pin number */
357 uint32_t registeroffset;
358
359 /* Check the parameters */
360 assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
361 assert_param(IS_GPIO_PIN(GPIO_Pin));
362
363 /* Configure the port pins */
364 while ((GPIO_Pin >> position) != 0u)
365 {
366 /* Get current io position */
367 iocurrent = (GPIO_Pin) & (1uL << position);
368
369 if (iocurrent)
370 {
371 /*------------------------- EXTI Mode Configuration --------------------*/
372 /* Clear the External Interrupt or Event for the current IO */
373
374 tmp = AFIO->EXTICR[position >> 2u];
375 tmp &= 0x0FuL << (4u * (position & 0x03u));
376 if (tmp == (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u))))
377 {
378 tmp = 0x0FuL << (4u * (position & 0x03u));
379 CLEAR_BIT(AFIO->EXTICR[position >> 2u], tmp);
380
381 /* Clear EXTI line configuration */
382 CLEAR_BIT(EXTI->IMR, (uint32_t)iocurrent);
383 CLEAR_BIT(EXTI->EMR, (uint32_t)iocurrent);
384
385 /* Clear Rising Falling edge configuration */
386 CLEAR_BIT(EXTI->RTSR, (uint32_t)iocurrent);
387 CLEAR_BIT(EXTI->FTSR, (uint32_t)iocurrent);
388 }
389 /*------------------------- GPIO Mode Configuration --------------------*/
390 /* Check if the current bit belongs to first half or last half of the pin count number
391 in order to address CRH or CRL register */
392 configregister = (iocurrent < GPIO_PIN_8) ? &GPIOx->CRL : &GPIOx->CRH;
393 registeroffset = (iocurrent < GPIO_PIN_8) ? (position << 2u) : ((position - 8u) << 2u);
394
395 /* CRL/CRH default value is floating input(0x04) shifted to correct position */
396 MODIFY_REG(*configregister, ((GPIO_CRL_MODE0 | GPIO_CRL_CNF0) << registeroffset), GPIO_CRL_CNF0_0 << registeroffset);
397
398 /* ODR default value is 0 */
399 CLEAR_BIT(GPIOx->ODR, iocurrent);
400 }
401
402 position++;
403 }
404 }
405
406 /**
407 * @}
408 */
409
410 /** @defgroup GPIO_Exported_Functions_Group2 IO operation functions
411 * @brief GPIO Read and Write
412 *
413 @verbatim
414 ===============================================================================
415 ##### IO operation functions #####
416 ===============================================================================
417 [..]
418 This subsection provides a set of functions allowing to manage the GPIOs.
419
420 @endverbatim
421 * @{
422 */
423
424 /**
425 * @brief Reads the specified input port pin.
426 * @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
427 * @param GPIO_Pin: specifies the port bit to read.
428 * This parameter can be GPIO_PIN_x where x can be (0..15).
429 * @retval The input port pin value.
430 */
HAL_GPIO_ReadPin(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)431 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
432 {
433 GPIO_PinState bitstatus;
434
435 /* Check the parameters */
436 assert_param(IS_GPIO_PIN(GPIO_Pin));
437
438 if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
439 {
440 bitstatus = GPIO_PIN_SET;
441 }
442 else
443 {
444 bitstatus = GPIO_PIN_RESET;
445 }
446 return bitstatus;
447 }
448
449 /**
450 * @brief Sets or clears the selected data port bit.
451 *
452 * @note This function uses GPIOx_BSRR register to allow atomic read/modify
453 * accesses. In this way, there is no risk of an IRQ occurring between
454 * the read and the modify access.
455 *
456 * @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
457 * @param GPIO_Pin: specifies the port bit to be written.
458 * This parameter can be one of GPIO_PIN_x where x can be (0..15).
459 * @param PinState: specifies the value to be written to the selected bit.
460 * This parameter can be one of the GPIO_PinState enum values:
461 * @arg GPIO_PIN_RESET: to clear the port pin
462 * @arg GPIO_PIN_SET: to set the port pin
463 * @retval None
464 */
HAL_GPIO_WritePin(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin,GPIO_PinState PinState)465 void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
466 {
467 /* Check the parameters */
468 assert_param(IS_GPIO_PIN(GPIO_Pin));
469 assert_param(IS_GPIO_PIN_ACTION(PinState));
470
471 if (PinState != GPIO_PIN_RESET)
472 {
473 GPIOx->BSRR = GPIO_Pin;
474 }
475 else
476 {
477 GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;
478 }
479 }
480
481 /**
482 * @brief Toggles the specified GPIO pin
483 * @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
484 * @param GPIO_Pin: Specifies the pins to be toggled.
485 * @retval None
486 */
HAL_GPIO_TogglePin(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)487 void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
488 {
489 uint32_t odr;
490
491 /* Check the parameters */
492 assert_param(IS_GPIO_PIN(GPIO_Pin));
493
494 /* get current Ouput Data Register value */
495 odr = GPIOx->ODR;
496
497 /* Set selected pins that were at low level, and reset ones that were high */
498 GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
499 }
500
501 /**
502 * @brief Locks GPIO Pins configuration registers.
503 * @note The locking mechanism allows the IO configuration to be frozen. When the LOCK sequence
504 * has been applied on a port bit, it is no longer possible to modify the value of the port bit until
505 * the next reset.
506 * @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
507 * @param GPIO_Pin: specifies the port bit to be locked.
508 * This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
509 * @retval None
510 */
HAL_GPIO_LockPin(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)511 HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
512 {
513 __IO uint32_t tmp = GPIO_LCKR_LCKK;
514
515 /* Check the parameters */
516 assert_param(IS_GPIO_LOCK_INSTANCE(GPIOx));
517 assert_param(IS_GPIO_PIN(GPIO_Pin));
518
519 /* Apply lock key write sequence */
520 SET_BIT(tmp, GPIO_Pin);
521 /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */
522 GPIOx->LCKR = tmp;
523 /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */
524 GPIOx->LCKR = GPIO_Pin;
525 /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */
526 GPIOx->LCKR = tmp;
527 /* Read LCKK register. This read is mandatory to complete key lock sequence */
528 tmp = GPIOx->LCKR;
529
530 /* read again in order to confirm lock is active */
531 if ((uint32_t)(GPIOx->LCKR & GPIO_LCKR_LCKK))
532 {
533 return HAL_OK;
534 }
535 else
536 {
537 return HAL_ERROR;
538 }
539 }
540
541 /**
542 * @brief This function handles EXTI interrupt request.
543 * @param GPIO_Pin: Specifies the pins connected EXTI line
544 * @retval None
545 */
HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)546 void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
547 {
548 /* EXTI line interrupt detected */
549 if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
550 {
551 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
552 HAL_GPIO_EXTI_Callback(GPIO_Pin);
553 }
554 }
555
556 /**
557 * @brief EXTI line detection callbacks.
558 * @param GPIO_Pin: Specifies the pins connected EXTI line
559 * @retval None
560 */
HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)561 __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
562 {
563 /* Prevent unused argument(s) compilation warning */
564 UNUSED(GPIO_Pin);
565 /* NOTE: This function Should not be modified, when the callback is needed,
566 the HAL_GPIO_EXTI_Callback could be implemented in the user file
567 */
568 }
569
570 /**
571 * @}
572 */
573
574 /**
575 * @}
576 */
577
578 #endif /* HAL_GPIO_MODULE_ENABLED */
579 /**
580 * @}
581 */
582
583 /**
584 * @}
585 */
586
587 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
588