MCU - 인터럽트 (2)
MCU - 인터럽트 (1)
https://coderdocument.tistory.com/entry/MCU-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8
- 인터럽트 우선 순위
인터럽트는 비동기적으로 발생하기 때문에 여러 개가 인터럽트를 요청하는 경우가 발생할 수 있다.
이 경우, 마이크로컨트롤러는 한번에 여러 개의 인터럽트를 처리할 수 없기 때문에 순차적으로 처리할 필요가 있다.
순차적으로 처리하기 위해 인터럽트의 우선순위를 정하게 된다.
우선순위는 마이크로컨트롤러 내부에 미리 결정되어 있으며, 미리 결정된 인터럽트 우선 순위를 변경하기 위해서는 인터럽트 우선순위를 지정하는 레지스터를 변경하면 된다.
마이크로컨트롤러에 따라 우선순위가 정해져 있어 변경하지 못하는 경우도 존재한다.
- 인터럽트 처리 절차
인터럽트 벡터 테이블은 각 인터럽트에 대해 ISR의 주소로 점프하여 ISR 프로그램을 처리 할 수 있도록 점프 명령과 점프할 ISR 주소를 담고 있다.
인터럽트 서비스 루틴(ISR)은 각 인터럽트가 발생하였을 때, 수행할 프로그램이 정의된다.
- 전체 동작 순서
1. main 프로그램 실행됨.
2. 인터럽트 발생
2-1. main 프로그램에서 현재 명령어 수행 완료
3. main 프로그램 중단
3-1. 스택에 PC 저장 (ISR을 마치고 돌아올 포인트 저장)
3-2.범용 레지스터, 인터럽트 상태 저장
3-3. 다른 인터럽트 블로킹
4. 해당 인터럽트에 따른 인터럽트 백터 테이블 참조
4-1. ISR 벡터 주소를 PC에 적재
5. 해당 ISR 주소로 점프
6. 인터럽트 프로그램(ISR) 수행
7. 인터럽트 프로그램 종료 후, RETI 명령어 수행 (인터럽트로부터 main 프로그램으로 복귀)
7-1. 스택에 저장된 main 프로그램의 PC, 레지스터, 인터럽트 상태의 이전 값을 복원
8. 중단된 main 프로그램 진행
- 인터럽트 종류
1. Reset
1) 외부 핀
2) 전원 투입 리셋
3) 저전압 검출 리셋
4) 워치독 리셋
2. 외부 인터럽트
3. 타이머/카운터 인터럽트
4. SPI 인터럽트
5. USART 인터럽트
6. ADC 인터럽트
7. EEPROM 인터럽트
8. I2C 인터럽트
... 등
- 인터럽트의 형태
1. 인터럽트 발생 시, 관련 플래그 비트를 1로 세팅하여 트리거
프로그램 카운터가 실제 인터럽트 벡터로 지정되어 ISR이 수행된 경우, 해당 플래그를 클리어(0으로 세팅) 시키는 구조임.
클리어 시킬 경우, 수동으로 해당 비트에 0을 써넣는 방법과 ISR 수행 시 하드웨어적으로 자동 클리어 되는 형식이 존재함.
인터럽트가 발생했을 때, 인터럽트 마스크 레지스터나 인터럽트 전체 허가가 되어있지 않은 경우, 인터럽트 대기상태로 존재하다가 인터럽트 허가 상태로 변경한 경우에 해당 인터럽트가 처리되는 방식이다.
2. 인터럽트 조건 발생 시에만 관련 플래그 트리거
인터럽트 발생 조건이 사라지면 해당 인터럽트 요청이 사라지는 구조임.
이 경우, 인터럽트 발생 조건이 사라진 후, 인터럽트가 허가되면 ISR이 불리지 않는다.'
- 인터럽트 허가
전체 인터럽트 허가 플래그와 각각의 기능에 따라 인터럽트 허가 플래그가 존재한다.
전체 인터럽트 플래그가 비활성화된 경우, 각각의 인터럽트 플래그를 활성화하더라도 인터럽트가 발생하지 않는다.
MCU마다 인터럽트가 발생했을 때, 인터럽트 서비스루틴을 수행하고,
인터럽트 플래그가 자동 클리어되는 경우도 존재하고 수동으로 클리어 해주어야 하는 경우도 존재한다.
수동으로 클리어해주어야 하는 경우, 클리어를 해주지 않으면 계속 인터럽트 서비스루틴이 불려 동작이 정상적으로 수행되지 않을 수 있으므로 주의해야 한다.