2023. 4. 15. 13:22ㆍ[Harman] 세미콘(semiconductor) 아카데미-반도체설계/임베디드 시스템을 위한 SW 구조설계
STM32F411RE보드를 이용하여 LED점등, 소등 중 인터럽트 발생시켰다 .
- 단축키
Window - Preference - keys = STM32CubeIDE의 단축키 설정창이 나온다.
Ctrl + space -> 해당 코드에 관련된 함수 찾기 기능
- 소스코드
STM32CubeIDE에선 Project Explorer에서 관련 소스코드들을 찾을 수 있다. 구성은 Core, Drivers, Debug등 3가지 폴더로 구성되어있다.
- Core = 우리가 사용하는 MCU(STM32F411RE)와 관련된 폴더, 기본 소스코드인 main.c파일이 존재하는 폴더, 또한 main.h에서 우리가 사용하는 보드와 관련된 변수들이 무엇인지 볼 수 있다.
- Drivers = GPIO, UART, EXTI, DMA등의 우리가 사용하는 입,출력, 인터럽트, 통신들과 관련된 헤더파일들이 존재하는 폴더
- ioc 파일
- 인터럽트(Interrupt)
인터럽트는 특정한 상황에서 실행되고 있는 메인 프로그램을 중단하고, Handler라고 불리는 함수를 호출하여 이를 실행시키는 기능이다. 즉,
- 인터럽트 = 기존에 while문에 내용을 반복중인 코드에서 돌발상황이 발생
- Handler = 그 돌발상황을 처리하는 행위
라 볼 수 있다.
Interrupt가 발생되면, 메인문은 중단되고 Interrupt Handler가 실행된다. Interrupt Handler가 끝나면 중단된 메인문으로 돌아온다.
인터럽트는 1) 일정 주기마다 발생되는 인터럽트, 2) 리셋되면 발생되는 인터럽트, 3) 설정된 핀의 상태에 따라 발생되는 인터럽트 등이 있다.
STM32에는 Interrupt Vector Table이라는 개념이 있다. Interrupt Vector Table은 Handler 함수들의 주소를 담고 있는 테이블이다.
우리가 사용할 인터럽트 관련된 Handler 함수들의 주소값을 볼 수 있다.
- 외부 인터럽트(EXTI / External Interrupt)
외부 인터럽트는 CPU(프로세스)가 프로그램을 실행하고 있을 때 입출력 하드웨어 장치 등에서 예외상황이 발생하여 처리가 필요한 경우 프로세서에게 알려 처리할 수 있도록 하는 기능이다.
우리가 사용하는 STM32F411RE의 EXTI 구조는 다음과 같다. 각각의 PA0~PH0 핀이 EXTI0연결되어 있고, PA1~PH1 = EXTI1에, PA2~PH2 = EXTI2에 연결이 되어있다 -> 각 핀의 자리수가 같으면 동시에 외부인터럽트 사용이 불가하다.
우리가 설정할 인터럽트는 EXTI13으로 PC13 핀에 인터럽트를 넣을 것으로 SYSCFG_EXTICR4의 EXTI13레지스터에 0010이 들어가게 되는 것을 확인할 수 있다.
외부 인터럽트를 설정하기 위해서는 먼저 해당 프로젝트의 ioc로 들어가 인터럽트를 설정할 핀에 EXTI(외부 인터럽트)를 설정한다.
핀에서 외부 인터럽트 설정 후 NVIC(Nested vector interrupt control / 하드웨어)에서 인터럽트 부분을 Enable 시켜준다.
그 후 GPIO에서 인터럽트를 넣을 스위치인 PC13의 모드를 "External Interrupt Mode with Rising edge trigger detection"로 하여 버튼이 눌렀다 땠을 때의 신호에 동작하도록 설정한다. (버튼을 누를 시 PC13이 LOW상태 -> 버튼 때면 PC13 HIGH상태로 Rising edge가 들어가게 된다.)
디지털 신호는 HIGH값과 LOW값이 존재한다. 디지털 신호에선 HIGH -> LOW / LOW -> HIGH로 바뀌게 되는데 이 시점을 edge라 한다.
상승 에지(Rising edge) = LOW 상태에서 HIGH 상태로 변화하는 순간
하강 에지(Rising edge) = HIGH 상태에서 LOW 상태로 변화하는 순간

인터럽트를 설정할 때 자신이 원하는 edge를 설정하면 된다.
현재 우리가 설정한 인터럽트는 푸쉬버튼으로, 푸쉬버튼은 스위치 접점이 닫히거나 열리는 순간 기계적인 진동에 의해 10ms 이내에 열림과 닫힘이 수 회 반복되는 현상이 발생할 수 있는데 이 현상을 "채터링(chattering)" 이라 한다.

푸쉬버튼의 채터링 현상은 디버깅을 통해 채터링 현상이 발생하는지 확인해 보도록 한다.
ioc에서 외부 인터럽트 핀 설정을 완료하면 이제 소스코드상에서 인터럽트 코드를 작성해주면 된다.
인터럽트 함수는 GPIO헤더파일의 HAL_GPIO_EXTI_Callback함수를 사용하면 된다.
void 앞의 __wear은 함수가 여러개 존재할 때 _weak있는 함수는 무시해라는 뜻이다. 중복되는 함수에 weak라는 의사 명령어를 준다 (__weak 라고 되어있는 것은 사용자가 재정의 하여 사용하라는 의미이다.)
그 후 해당 함수를 main문에 추가한 후 버튼을 눌러 인터럽트 이벤트를 발생시키면 main문의 while에서 잠시 벗어나 해당 Callback함수 내의 코드가 수행되게 된다.
해당 코드로 실행한 결과, 정상적으로 인터럽트가 발생하는 것을 확인할 수 있다.
=> 인터럽트는 메인문과는 독립적으로 수행 가능한 것을 확인
'[Harman] 세미콘(semiconductor) 아카데미-반도체설계 > 임베디드 시스템을 위한 SW 구조설계' 카테고리의 다른 글
임베디드 시스템을 위한 SW 구조설계 6 (3) | 2023.04.18 |
---|---|
임베디드 시스템을 위한 SW 구조설계 5 (1) | 2023.04.16 |
임베디드 시스템을 위한 SW 구조설계 3 (0) | 2023.04.12 |
임베디드 시스템을 위한 SW 구조설계 2 (0) | 2023.04.08 |
임베디드 시스템을 위한 SW 구조설계 1.2 (0) | 2023.04.08 |