|
어드레스 | 레지스터 이름 | 설명 | 리셋 초기값 |
0xE000 E100 | NVIC_ISER | Interrupt Set-Enable Register |
|
NVIC_ICER | Interrupt Clear-Enable Register | ||
NVIC_ISPR | Interrupt Set-Pending Register | ||
NVIC_ICPR | Interrupt Clear-Pending Register |
| |
| NVIC_IPR0 | Interrupt Priority Regster 0 | |
| ... |
|
|
| NVIC_IPR7 |
|
|
|
|
|
|
인터럽트가 발생되고 허용되어 CPU가 인터럽트 서비스 루틴을 실행하기 시작하면 인터럽트 대기상태(pending state)는 인터럽트 동작상태(active state)로 바뀌므로 사용자가 NVIC_ICPR 레지스터의 해당 비트를 1을 라이트하여 인터럽트 대기상태를 해제할 필요는 없다. 그러나, 이 인터럽트를 발생한 주변장치의 I/O 제어 레지스터에 있는 인터럽트 대기 비트(interrupt pending bit)는 인터럽트가 처리되는 동안에도 자동적으로 0이 되지 않으므로 인터럽트 서비스 루틴에서 사용자가 강제로 클리어시켜 주어야 한다. 이 인터럽트 대기 비트는 대부분 1을 라이트하여 클리어하게 되어 있는데 (rc_w1), 간혹 0을 라이트하여 클리어하는 (wc_w0) 레지스터도 있으니 주의해야 한다.
((주체가, I/O 제어 레지스터쪽에 있는 것을 세트한 것은 외부 인터럽트이기 때문에 ISR에서 클리어 해주고, CPU 내부에서 설정한 pending register 값은 ISR에서 클리어할 필요가 없다..)
확장 인터럽트 및 이벤트 제어기 (EXTI) 구조와 기능
확장 인터럽트 및 이벤트 제어기 (Extended Interrupt and Event Controller) 는 Cortex-M0의 코어가 아니라 MCU 주변장치에 해당하는 인터럽트 제어기이다. 이것은 소자 내부 또는 외부에서 입력되는 비동기 인터럽트/이벤트 신호를 인식하여 CPU의 인터럽트 제어기에 전달하거나 이벤트를 발생하고 전력 제어기에 wake-up 신호를 전달하기도 한다.
EXTI에 입력되는 신호는 21개의 외부 이벤트 신호와 7개의 내부 이벤트 신호를 포함하여 총 28개가 있으며, 이중에서 4개는 실제로 사용되지 않으므로 실질적으로는 24개의 인터럽트가 있다.
EXTI에 의하여 처리되는 28개의 인터럽트는 인터럽트 마스크 레지스터를 사용하여 각각 개별적으로 허용/금지 설정이 가능하다. 또한 각 인터럽트에 연결되는 외부 인터럽트 소스들은 SYSCFG_EXTICRx 레지스터를 사용하여 개별적으로 연결 여부를 설정할 수 있다. 그러나 MCU에서 사용하는 이들 28개의 인터럽트 중에서 GPIO 단자로 입력되는 16개의 외부 인터럽트 EXT0~EXT15는 모두 각각 독립적인 인터럽트 벡터를 가지고 처리되는 것이 아니라 단지 3개의 벡터를 중복하여 사용함에 주의해야 한다. 예를 들어 EXTI0 과 EXTI1은 모두 5번 인터럽트인 EXT0_1을 발생하며 이것은 0x0000 0054 번지의 인터럽트 처리 루틴으로 처리된다.
(그러면 핸들러에서 이것을 처리할 때에는 어떤 인터럽트로 인해 수행된 것인지 포트 상태나 레지스터 상태를 읽어서 확인?)
19개의 외부 인터럽트는 신호의 상승 또는 하강 에지 입력에 의하여 인터럽트 요청이 검출되고 인터럽트 대기 레지스터의 해당 비트가 1로 세트된다. 그러나, 내부 인터럽트는 항상 상승 에지로 인터럽트 요청이 검출되며 인터럽트 대기 레지스터에 해당하는 비트가 없다.
이렇게 요청된 인터럽트 신호가 NVIC로 전달되려면 인터럽트 마스크 레지스터 EXTI_IMR 의 해당 비트를 1로 세트하여 놓아야 한다.
이벤트를 사용하려면 인터럽트에서와 마찬가지로 신호 입력의 상승 에지를 사용할 것인지 하강 에지를 사용할 것인지를 설정하고 이벤트 마스크 레지스터 EXTI_IMR에서 해당 비트를 1로 세트 시켜 놓아야 한다. 이벤트 입력 신호가 검출되면 이벤트 펄스가 발생되지만 인터럽트 대기 레지스터의 해당 비트는 세트되지 않는다.
(인터럽트와 이벤트의 차이는 이벤트의 경우 인터럽트 대기 레지스터 해당 비트가 세트되지 않는다는 것)
USART, I2C, CEC 와 같은 몇 가지의 통신 주변장치는 실행 모드에 있을 때는 물론이고 정지모드에 있을 경우에도 이벤트를 발생하는 것이 가능하여 시스템이 정지모드로부터 깨어나도록 할 수 있다.
하드웨어 인터럽트를 발생시켜 사용하려면 다음 순서로 초기화 수행
1) EXTI_IMR 레지스터를 사용하여 해당 인터럽트 마스크를 해제한다.
2) EXTI_RTSR 및 EXTI_FTSR 레지스터를 사용하여 해당 인터럽트 입력 신호의 트리거 에지 방식 선택
3) NVIC_ISER 레지스터를 사용하여 해당하는 인터럽트를 허용상태로 설정한다.
하드웨어 이벤트를 발생시켜 사용하려면,
1) EXTI_EMR 레지스터를 사용하여 사용하려는 이벤트의 마스크를 해제한다.
2) EXTI_RTSR 및 EXTI_FTSR 레지스터를 사용하여 사용하려는 이벤트 입력 신호의 트리거 에지 방식을 선택한다.
확장 인터럽트 및 이벤트 제어기 관련 레지스터
어드레스 | 레지스터 이름 | 설명 | 리셋 초기값 |
0x4001 0400 | EXTI_IMR | Interrupt Mask Register |
|
| EXTI_EMR | Event Mask Register |
|
| EXTI_RTSR | Risingl Trigger Selection Register |
|
| EXTI_FTSR | Falling Trigger Selection Register |
|
| EXTI_SWIER | Software Interrupt and Event Register |
|
| EXTI_PR | Pending Register | |
|