All ports have external interrupt/event capability. To use external interrupt lines, the port 
must be configured in input mode. All available GPIO pins are connected to the 16 external 
interrupt/event lines from EXTI0 to EXTI15.  
 The external interrupt/event controller consists of up to 23 edge detectors (16 lines are 
connected to GPIO) for generating event/interrupt requests (each input line can be 
independently configured to select the type (interrupt or event) and the corresponding 
trigger event (rising or falling or both). Each line can also be masked independently.  
20.2.2  How to use this driver 
1.  Enable the GPIO AHB clock using the following function: 
__HAL_RCC_GPIOx_CLK_ENABLE().  
2.  Configure the GPIO pin(s) using HAL_GPIO_Init().  
  Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure 
  Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef 
structure. 
  In case of Output or alternate function mode selection: the speed is configured 
through "Speed" member from GPIO_InitTypeDef structure. 
  In alternate mode is selection, the alternate function connected to the IO is 
configured through "Alternate" member from GPIO_InitTypeDef structure. 
  Analog mode is required when a pin is to be used as ADC channel or DAC 
output. 
  In case of external interrupt/event selection the "Mode" member from 
GPIO_InitTypeDef structure select the type (interrupt or event) and the 
corresponding trigger event (rising or falling or both).  
3.  In case of external interrupt/event mode selection, configure NVIC IRQ priority 
mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using 
HAL_NVIC_EnableIRQ().  
4.  To get the level of a pin configured in input mode use HAL_GPIO_ReadPin().  
5.  To set/reset the level of a pin configured in output mode use 
HAL_GPIO_WritePin()/HAL_GPIO_TogglePin().  
6.  To lock pin configuration until next reset use HAL_GPIO_LockPin().  
7.  During and just after reset, the alternate functions are not active and the GPIO pins 
are configured in input floating mode (except JTAG pins).  
8.  The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose 
(PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has priority 
over the GPIO function.  
9.  The HSE oscillator pins OSC_IN/OSC_OUT can be used as general purpose PH0 and 
PH1, respectively, when the HSE oscillator is off. The HSE has priority over the GPIO 
function.  
20.2.3  Initialization and de-initialization functions 
 This section provides functions allowing to initialize and de-initialize the GPIOs to be ready 
for use.  
This section contains the following APIs: 
  HAL_GPIO_Init() 
  HAL_GPIO_DeInit() 
20.2.4  IO operation functions 
This section contains the following APIs: 
  HAL_GPIO_ReadPin() 
  HAL_GPIO_WritePin()