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