Subversion Repositories DashDisplay

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
30 mjames 1
/**
2
  ******************************************************************************
3
  * @file    stm32l1xx_hal_gpio.c
4
  * @author  MCD Application Team
5
  * @version V1.2.0
6
  * @date    01-July-2016
7
  * @brief   GPIO HAL module driver.
8
  *          This file provides firmware functions to manage the following
9
  *          functionalities of the General Purpose Input/Output (GPIO) peripheral:
10
  *           + Initialization and de-initialization functions
11
  *           + IO operation functions
12
  *        
13
  @verbatim
14
  ==============================================================================
15
                    ##### GPIO Peripheral features #####
16
  ==============================================================================        
17
  [..]
18
  Each port bit of the general-purpose I/O (GPIO) ports can be individually
19
  configured by software in several modes:
20
  (+) Input mode
21
  (+) Analog mode
22
  (+) Output mode
23
  (+) Alternate function mode
24
  (+) External interrupt/event lines
25
 
26
  [..]  
27
  During and just after reset, the alternate functions and external interrupt  
28
  lines are not active and the I/O ports are configured in input floating mode.
29
 
30
  [..]  
31
  All GPIO pins have weak internal pull-up and pull-down resistors, which can be
32
  activated or not.
33
 
34
  [..]
35
  In Output or Alternate mode, each IO can be configured on open-drain or push-pull
36
  type and the IO speed can be selected depending on the VDD value.
37
 
38
  [..]
39
  The microcontroller IO pins are connected to onboard peripherals/modules through a
40
  multiplexer that allows only one peripheral s alternate function (AF) connected
41
  to an IO pin at a time. In this way, there can be no conflict between peripherals
42
  sharing the same IO pin.
43
 
44
  [..]  
45
  All ports have external interrupt/event capability. To use external interrupt
46
  lines, the port must be configured in input mode. All available GPIO pins are
47
  connected to the 16 external interrupt/event lines from EXTI0 to EXTI15.
48
 
49
  [..]  
50
  The external interrupt/event controller consists of up to 28 edge detectors
51
  (depending on products 16 lines are connected to GPIO) for generating event/interrupt
52
  requests (each input line can be independently configured to select the type
53
  (interrupt or event) and the corresponding trigger event (rising or falling or both).
54
  Each line can also be masked independently.
55
 
56
            ##### How to use this driver #####
57
  ==============================================================================  
58
  [..]
59
   (#) Enable the GPIO AHB clock using the following function : __GPIOx_CLK_ENABLE().
60
 
61
   (#) Configure the GPIO pin(s) using HAL_GPIO_Init().
62
       (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure
63
       (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef
64
            structure.
65
       (++) In case of Output or alternate function mode selection: the speed is
66
            configured through "Speed" member from GPIO_InitTypeDef structure,
67
            the speed is configurable: Low, Medium and High.
68
       (++) If alternate mode is selected, the alternate function connected to the IO
69
            is configured through "Alternate" member from GPIO_InitTypeDef structure
70
       (++) Analog mode is required when a pin is to be used as ADC channel
71
            or DAC output.
72
       (++) In case of external interrupt/event selection the "Mode" member from
73
            GPIO_InitTypeDef structure select the type (interrupt or event) and
74
            the corresponding trigger event (rising or falling or both).
75
 
76
   (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority
77
       mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using
78
       HAL_NVIC_EnableIRQ().
79
 
80
   (#) HAL_GPIO_DeInit allows to set register values to their reset value. It's also
81
       recommended to use it to unconfigure pin which was used as an external interrupt
82
       or in event mode. That's the only way to reset corresponding bit in EXTI & SYSCFG
83
       registers.
84
 
85
   (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin().
86
 
87
   (#) To set/reset the level of a pin configured in output mode use
88
       HAL_GPIO_WritePin()/HAL_GPIO_TogglePin().
89
 
90
   (#) To lock pin configuration until next reset use HAL_GPIO_LockPin().
91
 
92
   (#) During and just after reset, the alternate functions are not
93
       active and the GPIO pins are configured in input floating mode (except JTAG
94
       pins).
95
 
96
   (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose
97
       (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has
98
       priority over the GPIO function.
99
 
100
   (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as
101
       general purpose PH0 and PH1, respectively, when the HSE oscillator is off.
102
       The HSE has priority over the GPIO function.
103
 
104
  @endverbatim
105
  ******************************************************************************
106
  * @attention
107
  *
108
  * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
109
  *
110
  * Redistribution and use in source and binary forms, with or without modification,
111
  * are permitted provided that the following conditions are met:
112
  *   1. Redistributions of source code must retain the above copyright notice,
113
  *      this list of conditions and the following disclaimer.
114
  *   2. Redistributions in binary form must reproduce the above copyright notice,
115
  *      this list of conditions and the following disclaimer in the documentation
116
  *      and/or other materials provided with the distribution.
117
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
118
  *      may be used to endorse or promote products derived from this software
119
  *      without specific prior written permission.
120
  *
121
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
122
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
123
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
124
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
125
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
126
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
127
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
128
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
129
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
130
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
131
  *
132
  ******************************************************************************  
133
  */
134
 
135
/* Includes ------------------------------------------------------------------*/
136
#include "stm32l1xx_hal.h"
137
 
138
/** @addtogroup STM32L1xx_HAL_Driver
139
  * @{
140
  */
141
 
142
/** @addtogroup GPIO
143
  * @brief GPIO HAL module driver
144
  * @{
145
  */
146
 
147
#ifdef HAL_GPIO_MODULE_ENABLED
148
 
149
/* Private typedef -----------------------------------------------------------*/
150
/* Private define ------------------------------------------------------------*/
151
/** @addtogroup GPIO_Private_Constants
152
  * @{
153
  */
154
#define GPIO_MODE             ((uint32_t)0x00000003)
155
#define EXTI_MODE             ((uint32_t)0x10000000)
156
#define GPIO_MODE_IT          ((uint32_t)0x00010000)
157
#define GPIO_MODE_EVT         ((uint32_t)0x00020000)
158
#define RISING_EDGE           ((uint32_t)0x00100000)
159
#define FALLING_EDGE          ((uint32_t)0x00200000)
160
#define GPIO_OUTPUT_TYPE      ((uint32_t)0x00000010)
161
 
162
#define GPIO_NUMBER           ((uint32_t)16)
163
 
164
/**
165
  * @}
166
  */
167
 
168
/* Private macro -------------------------------------------------------------*/
169
/* Private variables ---------------------------------------------------------*/
170
/* Private function prototypes -----------------------------------------------*/
171
/* Exported functions ---------------------------------------------------------*/
172
 
173
/** @addtogroup GPIO_Exported_Functions
174
  * @{
175
  */
176
 
177
/** @addtogroup GPIO_Exported_Functions_Group1
178
 *  @brief    Initialization and Configuration functions
179
 *
180
@verbatim    
181
 ===============================================================================
182
              ##### Initialization and Configuration functions #####
183
 ===============================================================================
184
 
185
@endverbatim
186
  * @{
187
  */
188
 
189
/**
190
  * @brief  Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init.
191
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral for STM32L1XX family devices
192
  * @param  GPIO_Init: pointer to a GPIO_InitTypeDef structure that contains
193
  *         the configuration information for the specified GPIO peripheral.
194
  * @retval None
195
  */
196
void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)
197
{
198
  uint32_t position = 0x00;
199
  uint32_t iocurrent = 0x00;
200
  uint32_t temp = 0x00;
201
 
202
  /* Check the parameters */
203
  assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
204
  assert_param(IS_GPIO_PIN(GPIO_Init->Pin));
205
  assert_param(IS_GPIO_MODE(GPIO_Init->Mode));
206
  assert_param(IS_GPIO_PULL(GPIO_Init->Pull));
207
 
208
  /* Configure the port pins */
209
  while (((GPIO_Init->Pin) >> position) != 0)
210
  {
211
    /* Get current io position */
212
    iocurrent = (GPIO_Init->Pin) & ((uint32_t)1 << position);
213
 
214
    if(iocurrent)
215
    {
216
      /*--------------------- GPIO Mode Configuration ------------------------*/
217
      /* In case of Alternate function mode selection */
218
      if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD))
219
      {
220
        /* Check the Alternate function parameters */
221
        assert_param(IS_GPIO_AF_INSTANCE(GPIOx));
222
        assert_param(IS_GPIO_AF(GPIO_Init->Alternate));
223
 
224
        /* Configure Alternate function mapped with the current IO */
225
        /* Identify AFRL or AFRH register based on IO position*/
226
        temp = GPIOx->AFR[position >> 3];
227
        CLEAR_BIT(temp, (uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ;      
228
        SET_BIT(temp, (uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4));      
229
        GPIOx->AFR[position >> 3] = temp;
230
      }
231
 
232
      /* Configure IO Direction mode (Input, Output, Alternate or Analog) */
233
      temp = GPIOx->MODER;
234
      CLEAR_BIT(temp, GPIO_MODER_MODER0 << (position * 2));  
235
      SET_BIT(temp, (GPIO_Init->Mode & GPIO_MODE) << (position * 2));
236
      GPIOx->MODER = temp;
237
 
238
      /* In case of Output or Alternate function mode selection */
239
      if ((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) ||
240
          (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD))
241
      {
242
        /* Check the Speed parameter */
243
        assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
244
        /* Configure the IO Speed */
245
        temp = GPIOx->OSPEEDR;
246
        CLEAR_BIT(temp, GPIO_OSPEEDER_OSPEEDR0 << (position * 2));
247
        SET_BIT(temp, GPIO_Init->Speed << (position * 2));
248
        GPIOx->OSPEEDR = temp;
249
 
250
        /* Configure the IO Output Type */
251
        temp = GPIOx->OTYPER;
252
        CLEAR_BIT(temp, GPIO_OTYPER_OT_0 << position) ;
253
        SET_BIT(temp, ((GPIO_Init->Mode & GPIO_OUTPUT_TYPE) >> 4) << position);
254
        GPIOx->OTYPER = temp;
255
      }
256
 
257
      /* Activate the Pull-up or Pull down resistor for the current IO */
258
      temp = GPIOx->PUPDR;
259
      CLEAR_BIT(temp, GPIO_PUPDR_PUPDR0 << (position * 2));
260
      SET_BIT(temp, (GPIO_Init->Pull) << (position * 2));
261
      GPIOx->PUPDR = temp;
262
 
263
      /*--------------------- EXTI Mode Configuration ------------------------*/
264
      /* Configure the External Interrupt or event for the current IO */
265
      if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE)
266
      {
267
        /* Enable SYSCFG Clock */
268
        __HAL_RCC_SYSCFG_CLK_ENABLE();
269
 
270
        temp = SYSCFG->EXTICR[position >> 2];
271
        CLEAR_BIT(temp, ((uint32_t)0x0F) << (4 * (position & 0x03)));
272
        SET_BIT(temp, (GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)));
273
        SYSCFG->EXTICR[position >> 2] = temp;
274
 
275
        /* Clear EXTI line configuration */
276
        temp = EXTI->IMR;
277
        CLEAR_BIT(temp, (uint32_t)iocurrent);
278
        if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT)
279
        {
280
          SET_BIT(temp, iocurrent);
281
        }
282
        EXTI->IMR = temp;
283
 
284
        temp = EXTI->EMR;
285
        CLEAR_BIT(temp, (uint32_t)iocurrent);      
286
        if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT)
287
        {
288
          SET_BIT(temp, iocurrent);
289
        }
290
        EXTI->EMR = temp;
291
 
292
        /* Clear Rising Falling edge configuration */
293
        temp = EXTI->RTSR;
294
        CLEAR_BIT(temp, (uint32_t)iocurrent);
295
        if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE)
296
        {
297
          SET_BIT(temp, iocurrent);
298
        }
299
        EXTI->RTSR = temp;
300
 
301
        temp = EXTI->FTSR;
302
        CLEAR_BIT(temp, (uint32_t)iocurrent);
303
        if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE)
304
        {
305
          SET_BIT(temp, iocurrent);
306
        }
307
        EXTI->FTSR = temp;
308
      }
309
    }
310
 
311
    position++;
312
  }
313
}
314
 
315
/**
316
  * @brief  De-initializes the GPIOx peripheral registers to their default reset values.
317
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral for STM32L1XX family devices
318
  * @param  GPIO_Pin: specifies the port bit to be written.
319
  *         This parameter can be one of GPIO_PIN_x where x can be (0..15).
320
  * @retval None
321
  */
322
void HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin)
323
{
324
  uint32_t position = 0x00;
325
  uint32_t iocurrent = 0x00;
326
  uint32_t tmp = 0x00;
327
 
328
  /* Check the parameters */
329
  assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
330
  assert_param(IS_GPIO_PIN(GPIO_Pin));
331
 
332
  /* Configure the port pins */
333
  while ((GPIO_Pin >> position) != 0)
334
  {
335
    /* Get current io position */
336
    iocurrent = (GPIO_Pin) & ((uint32_t)1 << position);
337
 
338
    if (iocurrent)
339
    {
340
      /*------------------------- GPIO Mode Configuration --------------------*/
341
      /* Configure IO Direction in Input Floting Mode */
342
      CLEAR_BIT(GPIOx->MODER, GPIO_MODER_MODER0 << (position * 2));
343
 
344
      /* Configure the default Alternate Function in current IO */
345
      CLEAR_BIT(GPIOx->AFR[position >> 3], (uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ;
346
 
347
      /* Configure the default value for IO Speed */
348
      CLEAR_BIT(GPIOx->OSPEEDR, GPIO_OSPEEDER_OSPEEDR0 << (position * 2));
349
 
350
      /* Configure the default value IO Output Type */
351
      CLEAR_BIT(GPIOx->OTYPER, GPIO_OTYPER_OT_0 << position) ;
352
 
353
      /* Deactivate the Pull-up oand Pull-down resistor for the current IO */
354
      CLEAR_BIT(GPIOx->PUPDR, GPIO_PUPDR_PUPDR0 << (position * 2));
355
 
356
      /*------------------------- EXTI Mode Configuration --------------------*/
357
      /* Clear the External Interrupt or Event for the current IO */
358
 
359
      tmp = SYSCFG->EXTICR[position >> 2];
360
      tmp &= (((uint32_t)0x0F) << (4 * (position & 0x03)));
361
      if(tmp == (GPIO_GET_INDEX(GPIOx) << (4 * (position & 0x03))))
362
      {
363
        tmp = ((uint32_t)0x0F) << (4 * (position & 0x03));
364
        CLEAR_BIT(SYSCFG->EXTICR[position >> 2], tmp);
365
 
366
        /* Clear EXTI line configuration */
367
        CLEAR_BIT(EXTI->IMR, (uint32_t)iocurrent);
368
        CLEAR_BIT(EXTI->EMR, (uint32_t)iocurrent);
369
 
370
        /* Clear Rising Falling edge configuration */
371
        CLEAR_BIT(EXTI->RTSR, (uint32_t)iocurrent);
372
        CLEAR_BIT(EXTI->FTSR, (uint32_t)iocurrent);
373
      }
374
    }
375
 
376
    position++;
377
  }
378
}
379
 
380
/**
381
  * @}
382
  */
383
 
384
/** @addtogroup GPIO_Exported_Functions_Group2
385
 *  @brief GPIO Read, Write, Toggle, Lock and EXTI management functions.
386
 *
387
@verbatim  
388
 ===============================================================================
389
                       ##### IO operation functions #####
390
 ===============================================================================  
391
 
392
@endverbatim
393
  * @{
394
  */
395
 
396
/**
397
  * @brief  Reads the specified input port pin.
398
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral for STM32L1XX family devices
399
  * @param  GPIO_Pin: specifies the port bit to read.
400
  *         This parameter can be GPIO_PIN_x where x can be (0..15).
401
  * @retval The input port pin value.
402
  */
403
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
404
{
405
  GPIO_PinState bitstatus;
406
 
407
  /* Check the parameters */
408
  assert_param(IS_GPIO_PIN(GPIO_Pin));
409
 
410
  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
411
  {
412
    bitstatus = GPIO_PIN_SET;
413
  }
414
  else
415
  {
416
    bitstatus = GPIO_PIN_RESET;
417
  }
418
  return bitstatus;
419
}
420
 
421
/**
422
  * @brief  Sets or clears the selected data port bit.
423
  * @note   This function uses GPIOx_BSRR register to allow atomic read/modify
424
  *         accesses. In this way, there is no risk of an IRQ occurring between
425
  *         the read and the modify access.
426
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral for STM32L1XX family devices
427
  * @param  GPIO_Pin: specifies the port bit to be written.
428
  *          This parameter can be one of GPIO_PIN_x where x can be (0..15).
429
  * @param  PinState: specifies the value to be written to the selected bit.
430
  *          This parameter can be one of the GPIO_PinState enum values:
431
  *            @arg GPIO_PIN_RESET: to clear the port pin
432
  *            @arg GPIO_PIN_SET: to set the port pin
433
  * @retval None
434
  */
435
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
436
{
437
  /* Check the parameters */
438
  assert_param(IS_GPIO_PIN(GPIO_Pin));
439
  assert_param(IS_GPIO_PIN_ACTION(PinState));
440
 
441
  if (PinState != GPIO_PIN_RESET)
442
  {
443
    GPIOx->BSRR = (uint32_t)GPIO_Pin;
444
  }
445
  else
446
  {
447
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16 ;
448
  }
449
}
450
 
451
/**
452
  * @brief  Toggles the specified GPIO pin
453
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral for STM32L1XX family devices
454
  * @param  GPIO_Pin: specifies the pins to be toggled.
455
  * @retval None
456
  */
457
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
458
{
459
  /* Check the parameters */
460
  assert_param(IS_GPIO_PIN(GPIO_Pin));
461
 
462
  GPIOx->ODR ^= GPIO_Pin;
463
}
464
 
465
/**
466
* @brief  Locks GPIO Pins configuration registers.
467
* @note   The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR,
468
*         GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH.
469
* @note   The configuration of the locked GPIO pins can no longer be modified
470
*         until the next reset.
471
* @note   Limitation concerning GPIOx_OTYPER: Locking of GPIOx_OTYPER[i] with i = 15..8
472
*         depends from setting of GPIOx_LCKR[i-8] and not from GPIOx_LCKR[i].
473
*         GPIOx_LCKR[i-8] is locking GPIOx_OTYPER[i] together with GPIOx_OTYPER[i-8].
474
*         It is not possible to lock GPIOx_OTYPER[i] with i = 15..8, without locking also
475
*         GPIOx_OTYPER[i-8].
476
*         Workaround: When calling HAL_GPIO_LockPin with GPIO_Pin from GPIO_PIN_8 to GPIO_PIN_15,
477
*         you must call also HAL_GPIO_LockPin with GPIO_Pin - 8.
478
*         (When locking a pin from GPIO_PIN_8 to GPIO_PIN_15, you must lock also the corresponding
479
*         GPIO_PIN_0 to GPIO_PIN_7).
480
* @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral for STM32L1XX family devices
481
* @param  GPIO_Pin: Specifies the port bit to be locked.
482
*         This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
483
* @retval None
484
*/
485
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
486
{
487
  __IO uint32_t tmp = GPIO_LCKR_LCKK;
488
 
489
  /* Check the parameters */
490
  assert_param(IS_GPIO_LOCK_INSTANCE(GPIOx));
491
  assert_param(IS_GPIO_PIN(GPIO_Pin));
492
 
493
  /* Apply lock key write sequence */
494
  SET_BIT(tmp, GPIO_Pin);
495
  /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */
496
  GPIOx->LCKR = tmp;
497
  /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */
498
  GPIOx->LCKR = GPIO_Pin;
499
  /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */
500
  GPIOx->LCKR = tmp;
501
  /* Read LCKK bit*/
502
  tmp = GPIOx->LCKR;
503
 
504
  if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET)
505
  {
506
    return HAL_OK;
507
  }
508
  else
509
  {
510
    return HAL_ERROR;
511
  }
512
}
513
 
514
/**
515
  * @brief  This function handles EXTI interrupt request.
516
  * @param  GPIO_Pin: Specifies the port pin connected to corresponding EXTI line.
517
  * @retval None
518
  */
519
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
520
{
521
  /* EXTI line interrupt detected */
522
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
523
  {
524
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
525
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
526
  }
527
}
528
 
529
/**
530
  * @brief  EXTI line detection callbacks.
531
  * @param  GPIO_Pin: Specifies the port pin connected to corresponding EXTI line.
532
  * @retval None
533
  */
534
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
535
{
536
  /* Prevent unused argument(s) compilation warning */
537
  UNUSED(GPIO_Pin);
538
 
539
  /* NOTE : This function Should not be modified, when the callback is needed,
540
            the HAL_GPIO_EXTI_Callback could be implemented in the user file
541
   */
542
}
543
 
544
/**
545
  * @}
546
  */
547
 
548
 
549
/**
550
  * @}
551
  */
552
 
553
#endif /* HAL_GPIO_MODULE_ENABLED */
554
/**
555
  * @}
556
  */
557
 
558
/**
559
  * @}
560
  */
561
 
562
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/