외부 인터럽트 사용법을 배워보자. 우선 인터럽트란 무엇일까?
주변장치와 입출력장치는 CPU나 메모리와 다르게 인터럽트(Interrupt)라는 것을 통해서 관리된다. Interrupt의 영단어 뜻은 중단, 새치기란 뜻으로 예외상황이 발생하여 필요한 경우 마이크로 프로세서에 알려 처리할 수 있게 하는 기능이다.(ISR, Interrupt Service Routine)
인터럽트는 하드웨어 인터럽트, 소프트웨어 인터럽트 즉 두가지로 나뉜다.
하드웨어 인터럽트는 전자적 신호가 프로세서에 직접 전달되는 방식을 의미하며 쉬운 예로 스위치나 키보드, 마우스의 모든 동작들이 하드웨어 인터럽트에 해당된다.
소프트웨어 인터럽트는 이와 반대로 프로세서 자체에서 발생하는 인터럽트로 쉬운 예로는 프로그래밍 할때 0으로 나누면 발생하는 divide-by-zero exception 이 있다.
이와 반대로 폴링(Polling)이 있는데 이는 주변장치나 입출력장치를 주기적으로 감시하여 상황이 발생할 때 처리 루틴을 발생시킨다. 하지만 이 방식은 마이크로프로세서의 자원이 낭비된다는 문제점이 있다.
인터럽트를 사용한다는 것은 ISR 혹은 Interrupt handler을 사용한다는 것과 동일하다. 인터럽트가 발생하였을때, 마이크로컨트롤러가 ISR을 실행한다.
모든 인터럽트는 메모리상 할당된 공간이 있다. 이 공간을 뜻하는 단어는 Interrupt Vector Table이라 한다.
사진에서는 M0+으로 나와있지만 Nucleo F103RB는 Cortex M3를 사용한다.
이번 포스팅에서 할 것은 Nucleo보드에 내장된 LED를 제어하는 것을 해볼 것이다. 그렇다면 이제 STM32 CUBE IDE로 들어가보자
여기서 STM32 Project를 클릭하면 된다.
이 창에서 지금 사용할 Nucleo-F103RB보드를 선택해준다. 자주 사용할 예정이기 떄문에 즐겨찾기인 별표를 클릭해놓았다.
프로젝트명은 원하는대로 입력하면 된다. 입력하고 시간을 기다리면 다음과 같은 창이 뜬다.
그렇다면 좌측의 SYS창을 클릭하여 Debug선택지의 Serial Wire을 클릭해준다.
다음은 초록색 LED를출력하기위한 설정을 해줄것이다. 우측에 보이는 STM32F103RBTx의 PA5를 찾아서 좌클릭 해준다음 GPIO_OUTPUT을 선택해준다.
그다음에 해당 핀에 대한 변수를 지정하는과정은 GPIO_OUTPUT을 할당한 핀을 우클릭하면 된다.
Enter User Label을 통해서 다음과 같이 변경하였다.
다른 핀을 찾아보는것은 일일히 찾는 방법도 있지만 우측 하단의 검색창으로도 찾을 수 있다.
이번에는 PC13포트를 GPIO_EXTI13으로 설정해준다.
전과 똑같이 Label을 설정해준다. 나는 BLUE_BUTTON으로 설정하였다.
여기까지 설정하였으면 이제 System Core창의 GPIO를 클릭한다. 클릭하면 다음과 같은 화면을 볼 수 있다.
PA5가 아닌 PC13을 클릭하면 다음과 같은 창이 뜨게된다. 하하단의 GPIO mode에서 External Interrupt Mode with Falling edge trigger detection로 설정한다.
그리고 PA5의 GPIO output level은 High로 설정한다.
여기까지 설정하였으면 인터럽트를 사용하도록 설정하여야한다. 같은 창 상단 SYS오른쪽에 있는 NVIC를 클릭한다.
Enabled창을 선택한다. 이것을 선택하면 좌측의 NVIC창에서도 외부인터럽트가 설정되었다는것을 알 수 있다.
이제 지금까지 설정한것을 바탕으로 자동으로 코드를 생성한다. 그냥 저장버튼인 Ctrl + S를 눌러주면 된다.
Yes 누르면 끝!
그렇다면 이제 좌측 창의 Core\Src\main.c로 가준다.
이제 설정한 변수에 대해 설정해줘야한다.
Private variables 아래 써있는 곳에 원하는변수를 입력해준다.
uint8_t flag=0;
Ctrl + Space를 사용하면 다음과 같이 쉽게 입력할 수 있다.
여기까지는 LED를 설정하긴 했는데... 이제 인터럽트를 설정할 시간이다. 인터럽트는 stm32f1xx_it.c 파일내에 설정되어있다.
EXTI15_10_IRQHandler(void)는 말그대로 IRQ(Interrupt ReQuest)를 Handling하는것이다. 즉 외부인터럽트를 요청하는 함수!
EXTI15_10_IRQHandler(void)는 다음과 같이 설정되어있다.
만약 0x00u의 값이 외부 인터럽트에서 받아들인것과 다르다면 외부 인터럽트를 Clear 하고 다시 Callback 해주는 함수이다.
하단의 HAL_GPIO_EXTI_Callback함수를 복사해서 main.c에 붙여넣고 다음과 같이 입력한다.
그다음 Build!!
망치 클릭하여 Build ! 그러면 다음과 같이 나오게 된다. 이제 디버깅을 해보자.
그리고
OK 클릭! 그다음은 Resume을 클릭한다.
Resume을 누르면 보드상에서 프로그램이 동작하게된다.
'Embedded > STM32' 카테고리의 다른 글
STM32 Timer, PWM, HAL Control (0) | 2021.03.01 |
---|---|
STM32F103RB 시작하기 (Cortex-M3) (0) | 2021.03.01 |