상세 컨텐츠

본문 제목

[STM32]GPIO_Output/GPIO_Input/GPIO_EXTI & Systick

Firmware/STM

by StephanosJ 2022. 12. 9. 13:22

본문

반응형

1. GPIO_Output

1) ioc파일을 열고 output으로 설정할 Pin을 클릭하고 GPIO_Output을 선택한다. 

2) output으로 설정할 Pin을 오른 쪽 클릭하여 Label이름을 변경한다.

3) 저장을 하면 변경한 Label이름으로 Output pin이 설정되어 Code로 generate되는 것을 확인 할 수 있다.

main.c

static void MX_GPIO_Init(void)
{

...

  GPIO_InitStruct.Pin = LD3_Red_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

...

}

 

4) 해당 Pin을 High출력할지 Low출력할지 설정 할수있다.

- Low출력

HAL_GPIO_WritePin(GPIOB, LD3_Red_Pin, GPIO_PIN_RESET); 

- High출력

HAL_GPIO_WritePin(GPIOB, LD3_Red_Pin, GPIO_PIN_SET); 

 

2. GPIO_Input

1) ioc파일을 열고 input으로 설정할 Pin을 클릭하고 GPIO_Input을 선택한다. 

2) input으로 설정할 Pin을 오른 쪽 클릭하여 Label이름을 변경한다.

3) 저장을 하면 변경한 Label이름으로 Input pin이 설정되어 Code로 generate되는 것을 확인 할 수 있다.

main.c

static void MX_GPIO_Init(void)
{

...

  /*Configure GPIO pin : User_Btn_Pin */
  GPIO_InitStruct.Pin = User_Btn_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(User_Btn_GPIO_Port, &GPIO_InitStruct)

...

}

 

4) 해당 Pin을 High인지 Low인지 읽어올수있다.

GPIO_PinState user_btn_pin_value = HAL_GPIO_ReadPin(User_Btn_GPIO_Port, User_Btn_Pin );

-> User_Btn_Pin이 Low이면 GPIO_PIN_RESET (0) return

-> User_Btn_Pin이 High이면 GPIO_PIN_SET (1) return

 

3. Interrupt Input Pin 설정(GPIO_EXTI)

1) ioc파일을 열고 interrupt input으로 설정할 Pin을 클릭하고 GPIO_EXTI을 선택한다. 

2) interrupt input으로 설정할 Pin을 오른 쪽 클릭하여 Label이름을 변경한다.

3) GPIO Mode를 확인한다.

Rising edge를 인지하면 interrupt발생한다.

※ Falling edge일때 interrupt발생을 원하면 External Interrupt Mode with Falling edge trigger detection으로 변경한다.

 

4) Interrupt Control을 위해서 NVIC항목에서 해당 Interrupt를 Enable한다.

※ EXTI0 ~ EXTI4는 각각 제어하므로 EXTI line0 interrupt ~ EXTI line4 interrupt까지 항목중에 선택하여 사용합니다.

    EXTI5 ~ EXTI9는 하나의 그룹으로 제어하므로 EXTI line[9:5] interrupt 항목을 선택하여 사용합니다.

    EXTI10 ~ EXTI15도 그룹으로 제어하므로 EXTI line[15:10] interrupt 항목을 선택하여 사용합니다.

 

예제에서는 GPIO_EXTI pin을 PC13을 사용하므로 EXTI line[15:10] interrupt 항목을 Enable해줍니다.

 

5) 저장을 하면 변경한 Label이름으로 Input interrupt pin이 설정되어 Code로 generate되는 것을 확인 할 수 있다.

main.c

static void MX_GPIO_Init(void)
{

    ...

  /*Configure GPIO pin : User_Btn_IT_Pin */
  GPIO_InitStruct.Pin = User_Btn_IT_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(User_Btn_IT_GPIO_Port, &GPIO_InitStruct);

  ...

}

stm32f4xx_it.c 

/**
  * @brief This function handles EXTI line[15:10] interrupts.
  */
void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */

  /* USER CODE END EXTI15_10_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(User_Btn_IT_Pin);
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  /* USER CODE END EXTI15_10_IRQn 1 */
}

 

6) 원하는 파일에 Callback함수를 재정의하여 사용할 수 있다.

 

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{

    if(GPIO_Pin == GPIO_PIN_13 )
    {
    }

}

interrupt enable한 EXTI pin High될때 호출됨을 확인할 수 있다.

※ SysTick 설정 방법

1) stm32f4xx.it.c

    Systick_Handler함수에 HAL_SYSTICK_IRQHandler();를 추가한다.

2) 사용할 파일에 Callback함수를 재정의 하여 사용한다.

    1ms마다 함수가 호출된다.

void HAL_SYSTICK_Callback(void)
{

   HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);    //PB14 pin이 1ms주기로 toggle되는 것을 할 수 있다.

}

 

3) PB14 Pin이 High/Low 각각 1ms씩 유지되고

High/Low주기가 2ms임을 확인할 수 있다.

 

반응형

관련글 더보기