stm32f469/stm32f469i-disco/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c
Go to the documentation of this file.
1 
107 /* Includes ------------------------------------------------------------------*/
108 #include "stm32f4xx_hal.h"
109 
119 #ifdef HAL_GPIO_MODULE_ENABLED
120 
121 /* Private typedef -----------------------------------------------------------*/
122 /* Private define ------------------------------------------------------------*/
126 #define GPIO_MODE 0x00000003U
127 #define EXTI_MODE 0x10000000U
128 #define GPIO_MODE_IT 0x00010000U
129 #define GPIO_MODE_EVT 0x00020000U
130 #define RISING_EDGE 0x00100000U
131 #define FALLING_EDGE 0x00200000U
132 #define GPIO_OUTPUT_TYPE 0x00000010U
133 
134 #define GPIO_NUMBER 16U
135 
138 /* Private macro -------------------------------------------------------------*/
139 /* Private variables ---------------------------------------------------------*/
140 /* Private function prototypes -----------------------------------------------*/
141 /* Private functions ---------------------------------------------------------*/
142 /* Exported functions --------------------------------------------------------*/
171 void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
172 {
173  uint32_t position;
174  uint32_t ioposition = 0x00U;
175  uint32_t iocurrent = 0x00U;
176  uint32_t temp = 0x00U;
177 
178  /* Check the parameters */
180  assert_param(IS_GPIO_PIN(GPIO_Init->Pin));
181  assert_param(IS_GPIO_MODE(GPIO_Init->Mode));
182  assert_param(IS_GPIO_PULL(GPIO_Init->Pull));
183 
184  /* Configure the port pins */
185  for(position = 0U; position < GPIO_NUMBER; position++)
186  {
187  /* Get the IO position */
188  ioposition = 0x01U << position;
189  /* Get the current IO position */
190  iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition;
191 
192  if(iocurrent == ioposition)
193  {
194  /*--------------------- GPIO Mode Configuration ------------------------*/
195  /* In case of Output or Alternate function mode selection */
196  if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) ||
197  (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD))
198  {
199  /* Check the Speed parameter */
200  assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
201  /* Configure the IO Speed */
202  temp = GPIOx->OSPEEDR;
203  temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U));
204  temp |= (GPIO_Init->Speed << (position * 2U));
205  GPIOx->OSPEEDR = temp;
206 
207  /* Configure the IO Output Type */
208  temp = GPIOx->OTYPER;
209  temp &= ~(GPIO_OTYPER_OT_0 << position) ;
210  temp |= (((GPIO_Init->Mode & GPIO_OUTPUT_TYPE) >> 4U) << position);
211  GPIOx->OTYPER = temp;
212  }
213 
214  /* Activate the Pull-up or Pull down resistor for the current IO */
215  temp = GPIOx->PUPDR;
216  temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U));
217  temp |= ((GPIO_Init->Pull) << (position * 2U));
218  GPIOx->PUPDR = temp;
219 
220  /* In case of Alternate function mode selection */
221  if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD))
222  {
223  /* Check the Alternate function parameter */
224  assert_param(IS_GPIO_AF(GPIO_Init->Alternate));
225  /* Configure Alternate function mapped with the current IO */
226  temp = GPIOx->AFR[position >> 3U];
227  temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ;
228  temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U));
229  GPIOx->AFR[position >> 3U] = temp;
230  }
231 
232  /* Configure IO Direction mode (Input, Output, Alternate or Analog) */
233  temp = GPIOx->MODER;
234  temp &= ~(GPIO_MODER_MODER0 << (position * 2U));
235  temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U));
236  GPIOx->MODER = temp;
237 
238  /*--------------------- EXTI Mode Configuration ------------------------*/
239  /* Configure the External Interrupt or event for the current IO */
240  if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE)
241  {
242  /* Enable SYSCFG Clock */
244 
245  temp = SYSCFG->EXTICR[position >> 2U];
246  temp &= ~(0x0FU << (4U * (position & 0x03U)));
247  temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U)));
248  SYSCFG->EXTICR[position >> 2U] = temp;
249 
250  /* Clear EXTI line configuration */
251  temp = EXTI->IMR;
252  temp &= ~((uint32_t)iocurrent);
253  if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT)
254  {
255  temp |= iocurrent;
256  }
257  EXTI->IMR = temp;
258 
259  temp = EXTI->EMR;
260  temp &= ~((uint32_t)iocurrent);
261  if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT)
262  {
263  temp |= iocurrent;
264  }
265  EXTI->EMR = temp;
266 
267  /* Clear Rising Falling edge configuration */
268  temp = EXTI->RTSR;
269  temp &= ~((uint32_t)iocurrent);
270  if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE)
271  {
272  temp |= iocurrent;
273  }
274  EXTI->RTSR = temp;
275 
276  temp = EXTI->FTSR;
277  temp &= ~((uint32_t)iocurrent);
278  if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE)
279  {
280  temp |= iocurrent;
281  }
282  EXTI->FTSR = temp;
283  }
284  }
285  }
286 }
287 
296 void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
297 {
298  uint32_t position;
299  uint32_t ioposition = 0x00U;
300  uint32_t iocurrent = 0x00U;
301  uint32_t tmp = 0x00U;
302 
303  /* Check the parameters */
305 
306  /* Configure the port pins */
307  for(position = 0U; position < GPIO_NUMBER; position++)
308  {
309  /* Get the IO position */
310  ioposition = 0x01U << position;
311  /* Get the current IO position */
312  iocurrent = (GPIO_Pin) & ioposition;
313 
314  if(iocurrent == ioposition)
315  {
316  /*------------------------- EXTI Mode Configuration --------------------*/
317  tmp = SYSCFG->EXTICR[position >> 2U];
318  tmp &= (0x0FU << (4U * (position & 0x03U)));
319  if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))))
320  {
321  /* Clear EXTI line configuration */
322  EXTI->IMR &= ~((uint32_t)iocurrent);
323  EXTI->EMR &= ~((uint32_t)iocurrent);
324 
325  /* Clear Rising Falling edge configuration */
326  EXTI->RTSR &= ~((uint32_t)iocurrent);
327  EXTI->FTSR &= ~((uint32_t)iocurrent);
328 
329  /* Configure the External Interrupt or event for the current IO */
330  tmp = 0x0FU << (4U * (position & 0x03U));
331  SYSCFG->EXTICR[position >> 2U] &= ~tmp;
332  }
333 
334  /*------------------------- GPIO Mode Configuration --------------------*/
335  /* Configure IO Direction in Input Floating Mode */
336  GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2U));
337 
338  /* Configure the default Alternate Function in current IO */
339  GPIOx->AFR[position >> 3U] &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ;
340 
341  /* Deactivate the Pull-up and Pull-down resistor for the current IO */
342  GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U));
343 
344  /* Configure the default value IO Output Type */
345  GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ;
346 
347  /* Configure the default value for IO Speed */
348  GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U));
349  }
350  }
351 }
352 
377 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
378 {
379  GPIO_PinState bitstatus;
380 
381  /* Check the parameters */
382  assert_param(IS_GPIO_PIN(GPIO_Pin));
383 
384  if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
385  {
386  bitstatus = GPIO_PIN_SET;
387  }
388  else
389  {
390  bitstatus = GPIO_PIN_RESET;
391  }
392  return bitstatus;
393 }
394 
412 void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
413 {
414  /* Check the parameters */
415  assert_param(IS_GPIO_PIN(GPIO_Pin));
416  assert_param(IS_GPIO_PIN_ACTION(PinState));
417 
418  if(PinState != GPIO_PIN_RESET)
419  {
420  GPIOx->BSRR = GPIO_Pin;
421  }
422  else
423  {
424  GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;
425  }
426 }
427 
435 void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
436 {
437  /* Check the parameters */
438  assert_param(IS_GPIO_PIN(GPIO_Pin));
439 
440  if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin)
441  {
442  GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER;
443  }
444  else
445  {
446  GPIOx->BSRR = GPIO_Pin;
447  }
448 }
449 
461 HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
462 {
463  __IO uint32_t tmp = GPIO_LCKR_LCKK;
464 
465  /* Check the parameters */
466  assert_param(IS_GPIO_PIN(GPIO_Pin));
467 
468  /* Apply lock key write sequence */
469  tmp |= GPIO_Pin;
470  /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */
471  GPIOx->LCKR = tmp;
472  /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */
473  GPIOx->LCKR = GPIO_Pin;
474  /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */
475  GPIOx->LCKR = tmp;
476  /* Read LCKR register. This read is mandatory to complete key lock sequence */
477  tmp = GPIOx->LCKR;
478 
479  /* Read again in order to confirm lock is active */
480  if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET)
481  {
482  return HAL_OK;
483  }
484  else
485  {
486  return HAL_ERROR;
487  }
488 }
489 
495 void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
496 {
497  /* EXTI line interrupt detected */
498  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
499  {
500  __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
501  HAL_GPIO_EXTI_Callback(GPIO_Pin);
502  }
503 }
504 
510 __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
511 {
512  /* Prevent unused argument(s) compilation warning */
513  UNUSED(GPIO_Pin);
514  /* NOTE: This function Should not be modified, when the callback is needed,
515  the HAL_GPIO_EXTI_Callback could be implemented in the user file
516  */
517 }
518 
528 #endif /* HAL_GPIO_MODULE_ENABLED */
529 
537 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
GPIO_TypeDef::LCKR
__IO uint32_t LCKR
Definition: stm32f407xx.h:536
assert_param
#define assert_param(expr)
Include module's header file.
Definition: stm32f407/stm32f407g-disc1/Inc/stm32f4xx_hal_conf.h:353
HAL_GPIO_EXTI_Callback
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
GPIO_OSPEEDER_OSPEEDR0
#define GPIO_OSPEEDER_OSPEEDR0
Definition: stm32f407xx.h:8347
__IO
#define __IO
Definition: imxrt1050/imxrt1050-evkb/CMSIS/core_cm7.h:237
GPIO_MODE_AF_PP
#define GPIO_MODE_AF_PP
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:122
HAL_StatusTypeDef
HAL_StatusTypeDef
HAL Status structures definition
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:40
GPIO_MODE_OUTPUT_OD
#define GPIO_MODE_OUTPUT_OD
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:121
GPIO_TypeDef::MODER
__IO uint32_t MODER
Definition: stm32f407xx.h:529
GPIO_InitTypeDef
GPIO Init structure definition
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:47
IS_GPIO_PULL
#define IS_GPIO_PULL(PULL)
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:280
GPIO_MODER_MODER0
#define GPIO_MODER_MODER0
Definition: stm32f407xx.h:8035
IS_GPIO_AF
#define IS_GPIO_AF(AF)
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio_ex.h:356
GPIO_InitTypeDef::Alternate
uint32_t Alternate
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:61
GPIO_PIN_SET
@ GPIO_PIN_SET
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:71
HAL_ERROR
@ HAL_ERROR
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:43
IS_GPIO_MODE
#define IS_GPIO_MODE(MODE)
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:266
GPIO_TypeDef::BSRR
__IO uint32_t BSRR
Definition: stm32f407xx.h:535
HAL_GPIO_ReadPin
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
GPIO_TypeDef::IDR
__IO uint32_t IDR
Definition: stm32f407xx.h:533
HAL_OK
@ HAL_OK
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h:42
HAL_GPIO_Init
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
UNUSED
#define UNUSED(x)
Definition: porcupine/demo/c/dr_libs/old/dr.h:92
GPIO_InitTypeDef::Mode
uint32_t Mode
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:52
GPIO_InitTypeDef::Pull
uint32_t Pull
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:55
IS_GPIO_ALL_INSTANCE
#define IS_GPIO_ALL_INSTANCE(INSTANCE)
Definition: stm32f407xx.h:15118
__HAL_RCC_SYSCFG_CLK_ENABLE
#define __HAL_RCC_SYSCFG_CLK_ENABLE()
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h:599
HAL_GPIO_DeInit
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
RESET
@ RESET
Definition: stm32f407/stm32f407g-disc1/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h:187
GPIO_InitTypeDef::Speed
uint32_t Speed
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:58
SYSCFG
#define SYSCFG
Definition: stm32f407xx.h:1098
__HAL_GPIO_EXTI_GET_IT
#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__)
Checks whether the specified EXTI line is asserted or not.
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:192
GPIO_PIN_RESET
@ GPIO_PIN_RESET
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:70
__HAL_GPIO_EXTI_CLEAR_IT
#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__)
Clears the EXTI's line pending bits.
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:200
GPIO_TypeDef
General Purpose I/O.
Definition: stm32f407xx.h:527
IS_GPIO_SPEED
#define IS_GPIO_SPEED(SPEED)
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:278
GPIO_TypeDef::ODR
__IO uint32_t ODR
Definition: stm32f407xx.h:534
GPIO_MODE_AF_OD
#define GPIO_MODE_AF_OD
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:123
GPIO_OTYPER_OT_0
#define GPIO_OTYPER_OT_0
Definition: stm32f407xx.h:8247
HAL_GPIO_EXTI_IRQHandler
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
GPIO_LCKR_LCKK
#define GPIO_LCKR_LCKK
Definition: stm32f407xx.h:8893
GPIO_GET_INDEX
#define GPIO_GET_INDEX(__GPIOx__)
Definition: stm32h735/stm32h735g-dk/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio_ex.h:440
GPIO_PinState
GPIO_PinState
GPIO Bit SET and Bit RESET enumeration.
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:68
GPIO_TypeDef::OSPEEDR
__IO uint32_t OSPEEDR
Definition: stm32f407xx.h:531
IS_GPIO_PIN
#define IS_GPIO_PIN(PIN)
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:265
IS_GPIO_PIN_ACTION
#define IS_GPIO_PIN_ACTION(ACTION)
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:264
GPIO_MODE_OUTPUT_PP
#define GPIO_MODE_OUTPUT_PP
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:120
GPIO_TypeDef::AFR
__IO uint32_t AFR[2]
Definition: stm32f407xx.h:537
EXTI
#define EXTI
Definition: stm32f407xx.h:1099
GPIO_PUPDR_PUPDR0
#define GPIO_PUPDR_PUPDR0
Definition: stm32f407xx.h:8479
HAL_GPIO_TogglePin
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
GPIO_TypeDef::PUPDR
__IO uint32_t PUPDR
Definition: stm32f407xx.h:532
GPIO_TypeDef::OTYPER
__IO uint32_t OTYPER
Definition: stm32f407xx.h:530
HAL_GPIO_LockPin
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
HAL_GPIO_WritePin
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
GPIO_InitTypeDef::Pin
uint32_t Pin
Definition: stm32f407/stm32f407g-disc1/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h:49


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:14:52