본문 바로가기
Stm32/실제 구동(stm32cubeide)

GPIO 입출력 [HAL-DRIVER 이용]

by [Akashic Records] 개발의선지자 2024. 5. 1.

아래 글은 STM32F411RE User Manual, Datasheet, Reference Manual를 기준으로 작성되었습니다.

사용 IDE : STM32CubeIDE

STM32CubeIDE는 HAL Driver라는 ARM 용 API를 사용합니다.

 

GPIO 출력관련 HAL_DRIVER 함수는 stm32cubeide 프로젝트 생성시

STM32F4xx_HAL_Driver -> stm32f4xx_hal_gpio.c에서 확인할수 있다.

 

1) HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

->   GPIOx의 Pin의 상태를 설정한다.

매개변수 설명

- GPIOx : 포트 지정

- GPIO_Pin : 핀 번호 지정

- PinState : 핀 상태(SET or RESET)

 

2) HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

-> GPIO의 상태를 반전(Toggle)시킨다.

매개변수 설명

- GPIOx : 포트 지정

- GPIO_Pin : 핀 번호 지정

 

3)HAL_GPIO_ReadPin

 

※ 사용 핀

1. PA5 : USER LED(LD2)

2, PC13  : USER PUSH BUTTON

 

1). USER BUTTON에 따라 USER LED2 토글

HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
HAL_Delay(500);

 

2) USER BUTTON 클릭 시 입력 값에 따라 USER LED2 토글

GPIO_PinState isSet;
isSet =  HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);
if(isSet == GPIO_PIN_RESET) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);

 

위는 GPIO_PinState 구조체이다.

typedef enum
{
  GPIO_PIN_RESET = 0,
  GPIO_PIN_SET
}GPIO_PinState;

 

3) USER BUTTON 클릭 시  EXTI Interrupt 발생하여 USER LED2 토글

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_13){
		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
	}
}
/* USER CODE END 4 */

 

EXTI 인터럽트 발생 시 내부 인터럽트 핸들러(서비스 루틴) 발생 

해당 핸들러에서 EXTI 콜백 함수를 수행하여 해당 핀에 대한 인터럽트를 수행한다.

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}

#define UNUSED(X) (void)X      /* To avoid gcc/g++ warnings */

 

'Stm32 > 실제 구동(stm32cubeide)' 카테고리의 다른 글

ADC Multi Channel - Joy Stick  (0) 2024.07.10
UART 실습[2]  (0) 2024.06.30
Timer Interrupt  (0) 2024.06.18
UART (Polling, Interrupt , DMA) [HAL-DRIVER 이용]  (0) 2024.05.08
[1]GPIO 입출력 레지스터 직접 제어  (0) 2024.05.02