EXTI가 무엇일까?
EXTI를 왜 써야할까?
궁금한 점을 파헤치면서 실습까지 가보자
EXTI는 외부 인터럽트 ( External Interrupt )라고 한다.
우리는 외부에서 GPIO로 신호가 들어오면 그것을 가지고 어떠한 동작을 한다.
하지만 이때 어떻게 그 신호를 알아차리는가?
여러 방법이 있다.
1. While 방식
2. Timer기반 방식
3. EXTI(외부인터럽트)방식
설명 | |
While 방식 | 지속적으로 GPIO 핀의 상태를 읽어 특정 조건을 만족하면 동작을 수행 |
Timer 방식 | 타이머로 주기적으로 GPIO 상태를 체크 |
EXTI 방식 | GPIO 핀의 Rising Edge, Falling Edge, 또는 Both Edges를 감지해 인터럽트를 발생시킴 |
장단점을 알아보겠다.
장점 | 단점 | |
While 방식 | 코드가 단순하고 설정이 필요 없음 | CPU 리소스를 많이 소모하며, 신호를 놓치기 쉬움 |
Timer 방식 | while 루프보다 효율적이고, 타이머 주기를 조정하여 신호 감지 가능 | 타이머 주기가 너무 길면 신호를 놓칠 수 있음 |
EXTI 방식 | 가장 효율적이며, 신호를 놓치지 않고 즉각 반응 | GPIO 핀 설정과 인터럽트 설정이 필요 |
알아보았으니 설정을해보자
PA6,7에 LED D2, D3가 있어 output으로 설정해주고, PE3,4를 EXTI로 설정해준다.
여기서 버튼들이 PE3, 4이고, 버튼은 풀업저항으로 설정해두었기 때문에 밑에 GPIO Mode에서 Rising 말고 Faling으로 바꾸어 준다.
조금 자세하게 설명하면
GPIO를 풀업, 풀다운 둘중 하나를 설정해줘야한다.
이유는 풀업, 풀다운을 설정하지 않으면 GPIO 핀이 떠 있는 상태(floating)라면 정확한 High/Low 신호를 감지하지 못한다.
따라서 둘중 하나를 설정해줘야하는데 이때의 GPIO모드도 같이 달라져야한다.
풀업 : HIGH상태를 유지
풀다운 : LOW 상태 유지
따라서 풀업으로 설정하면 HIGH에서 버튼을 눌렀을 때 LOW로 변함으로 Falling edge로 설정해야한다.
풀다운은 LOW에서 HIGH로 변함으로 올라가는 신호를 읽는게 좋음으로 Rasing edge로 설정해주면 정상 동작한다.
이후 NVIC에서 우리가 설정한 값을 활성화 해줘야한다.
이후 코드는 다음과 같다.
uint8_t flag = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == EXTI3_K1_Pin){
flag = 1;
}else if(GPIO_Pin == EXTI4_K0_Pin){
flag = 2;
}else {
flag = 0;
}
}
.
.
.
while (1)
{
if(flag == 1){
HAL_GPIO_TogglePin(GPIOA, GPIO_PA6_D2_Pin);
HAL_Delay(100);
}else if(flag == 2){
HAL_GPIO_TogglePin(GPIOA, GPIO_PA7_D3_Pin);
HAL_Delay(100);
}else{
HAL_GPIO_WritePin(GPIOA, GPIO_PA6_D2_Pin | GPIO_PA7_D3_Pin, 0);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
위 코드의 동작은 버튼 k0와 k1이 있는데 k0을 누르면 D3번을 껏다 켰다하고, k1를 누르면 D2번을 껏다 켰다하는 코드이다.
아래는 영상이다.
https://youtube.com/shorts/vIm0KkECAOU?feature=share
다음 포스팅에서 USART에 대해 알아보고 실습해보자
'STM32' 카테고리의 다른 글
STM32F407VE - 기초 4) USART-2 (0) | 2024.11.22 |
---|---|
STM32F407VE - 기초 3) USART (0) | 2024.11.21 |
STM32F103C6T6A - 다루기 (0) | 2024.11.17 |
STM32F407VE - 기초 1) (1) | 2024.11.16 |
STM32으로 Fan을 제어해보자 2) (0) | 2024.11.12 |