- 인터럽트가 필요한 이유는 무엇입니까?
- MSP430의 인터럽트 유형
- MSP430의 인터럽트 프로그램 제어
- GPIO 인터럽트 테스트를위한 MSP430 회로
- 인터럽트를위한 MSP430 프로그래밍
- CCS에서 MSP430으로 프로그램 업로드
- MSP430의 인터럽트 프로그램
시간을 표시하도록 프로그래밍 된 간단한 디지털 시계를 생각해보십시오. 이제 시간대를 변경하고 싶다고 상상해보십시오. 당신은 무엇을 하시겠습니까? 시간대를 변경할 수있는 메뉴로 변경되는 버튼을 누르기 만하면됩니다. 여기서 시스템은 시간 유지 프로세스에 대한 외부 인터럽트를 예측할 수 없으며 시계의 초 값을 증가시키는 데 바쁘기 때문에 대기하도록 요청할 수 없습니다. 이것은 인터럽트가 유용한 곳입니다.
인터럽트는 항상 외부 일 필요는 없습니다. 내부적 일 수도 있습니다. 임베디드 인터럽트에서 대부분의 시간은 또한 CPU의 두 주변 장치 간의 통신을 용이하게합니다. 미리 설정된 타이머가 재설정되고 시간이 타이머 레지스터의 값에 도달하면 인터럽트가 트리거되는 것을 고려하십시오. 인터럽트 처리기를 사용하여 DMA와 같은 다른 주변 장치를 시작할 수 있습니다.
이 튜토리얼에서는 MSP430 의 외부 인터럽트를 사용하여 다른 LED를 토글했습니다. 푸시 버튼을 사용하여 상태를 변경하여 외부 인터럽트가 주어지면 제어가 ISR로 전송 (선점)되고 필요한 작업을 수행합니다. MSP430G2 런치 패드에 대한 CCS 환경 설정과 같은 기본 사항을 알려면이 튜토리얼에서 자세히 다루지 않을 것이므로 CCS를 사용하여 MSP430 시작하기 링크를 따르십시오. 또한 링크를 따라 Energia IDE 및 CCS를 사용하는 다른 MSP430 기반 자습서를 확인하십시오.
인터럽트가 필요한 이유는 무엇입니까?
임베디드 시스템에서 폴링 오버 헤드를 저장하려면 인터럽트가 필요합니다. 현재 실행중인 작업을 선점하여 우선 순위가 높은 작업을 실행해야 할 때 호출됩니다. 또한 저전력 모드에서 CPU를 깨울 때도 사용할 수 있습니다. GPIO 포트를 통한 외부 신호의 에지 전환에 의해 깨어 나면 ISR이 실행되고 CPU는 다시 저전력 모드로 돌아갑니다.
MSP430의 인터럽트 유형
MSP430 의 인터럽트 는 다음 유형에 속합니다.
- 시스템 재설정
- 차폐 불가능 인터럽트
- 마스크 가능한 인터럽트
- 벡터 및 비 벡터 인터럽트
시스템 재설정:
공급 전압 (Vcc)과 리셋 모드가 선택된 RST / NMI 핀의 낮은 신호로 인해 발생할 수 있으며 워치 독 타이머 오버플로 및 보안 키 위반 과 같은 이유로 발생할 수도 있습니다.
차폐 불가능 인터럽트:
이러한 인터럽트는 CPU 명령에 의해 마스킹 될 수 없습니다. 일반 인터럽트가 활성화되면 마스크 불가능한 인터럽트를 처리에서 전환 할 수 없습니다. 이것은 오실레이터 오류와 같은 소스와 RST / NMI (NMI 모드에서)에 수동으로 지정된 에지에 의해 생성됩니다.
마스크 가능한 인터럽트:
인터럽트가 발생하고 CPU 명령에 의해 마스킹 될 수있는 경우 마스킹 가능한 인터럽트입니다. 항상 외부적일 필요는 없습니다. 또한 주변 장치와 기능에 따라 달라집니다. 여기에서 사용되는 외부 포트 인터럽트는이 범주에 속합니다.
벡터 인터럽트 및 비 벡터 인터럽트:
벡터화: 이 경우 인터럽트하는 장치는 인터럽트 벡터 주소를 전달하여 인터럽트의 소스를 제공합니다. 여기서 ISR 의 주소가 고정 되고 제어가 해당 주소로 전송되고 나머지는 ISR이 처리합니다.
비 벡터: 여기서 모든 인터럽트는 공통 ISR을 갖습니다. 벡터화되지 않은 소스에서 인터럽트가 발생하면 제어는 벡터화되지 않은 모든 인터럽트가 공유하는 공통 주소로 전송됩니다.
MSP430의 인터럽트 프로그램 제어
인터럽트가 발생하면 MCLK가 ON되고 CPU는 OFF 상태에서 콜백됩니다. 인터럽트 발생 후 프로그램의 제어가 ISR 주소로 전송됨에 따라 프로그램 카운터 및 상태 레지스터의 값이 스택으로 이동됩니다.
연속적으로 상태 레지스터가 지워 지므로 GIE가 지워지고 저전력 모드가 종료 됩니다. 프로그램 카운터에 인터럽트 벡터 주소를 배치하여 우선 순위가 가장 높은 인터럽트를 선택하고 실행합니다. MSP430 GPIO 인터럽트 예제 코드에 도달하기 전에 관련된 포트 레지스터의 작동을 이해하는 것이 중요합니다.
MSP430에서 GPIO 제어를위한 포트 레지스터:
PxDIR: 포트 방향 제어 레지스터입니다. 프로그래머가 0 또는 1을 작성하여 특정 기능을 선택할 수 있도록합니다. 핀이 1로 선택되면 출력으로 작동합니다. 포트 1을 8 비트 포트로 간주하고 핀 2와 3을 출력 포트로 할당하려면 P1DIR 레지스터를 0x0C 값으로 설정해야합니다.
PxIN: 읽기 전용 레지스터 이며이 레지스터를 사용하여 포트의 현재 값을 읽을 수 있습니다.
PxOUT: 이 특정 레지스터를 사용하여 포트에 직접 값을 쓸 수 있습니다. 이는 풀업 / 풀다운 레지스터가 비활성화 된 경우에만 가능합니다.
PxREN: 풀업 / 풀다운 레지스터를 활성화 또는 비활성화하는 데 사용되는 8 비트 레지스터입니다. 핀이 PxREN 및 PxOUT 레지스터 모두에서 1로 설정되면 특정 핀이 풀업됩니다.
PxDIR |
PxREN |
PxOUT |
I / O 구성 |
0 |
0 |
엑스 |
저항이 비활성화 된 입력 |
0 |
1 |
0 |
내부 풀다운이 활성화 된 입력 |
0 |
1 |
1 |
내부 풀업이 활성화 된 입력 |
1 |
엑스 |
엑스 |
출력 – PxREN은 효과가 없습니다. |
PxSEL 및 PxSEL2: MSP430의 모든 핀이 다중화되어 있으므로 사용하기 전에 특정 기능을 선택해야합니다. 특정 핀에 대해 PxSEL 및 PxSEL2 레지스터가 모두 0으로 설정되면 범용 I / O가 선택됩니다. PxSEL이 1로 설정되면 기본 주변 장치 기능이 선택되는 식입니다.
PxIE: 포트 x의 특정 핀에 대한 인터럽트를 활성화하거나 비활성화합니다.
PxIES: 인터럽트가 생성되는 에지를 선택합니다. 0의 경우 상승 에지가 선택되고 1의 경우 하강 에지가 선택됩니다.
GPIO 인터럽트 테스트를위한 MSP430 회로
MSP430 인터럽트 예제 코드 를 테스트하는 데 사용 된 MSP430 회로 는 다음과 같습니다.
보드의 접지는 LED와 버튼을 모두 접지하는 데 사용됩니다. 푸시 버튼의 대각선 반대쪽은 일반적으로 열린 단자이며 푸시 버튼을 누르면 연결됩니다. LED에 의한 높은 전류 소비를 피하기 위해 LED 앞에 저항이 연결됩니다. 일반적으로 100ohm – 220ohm 범위의 낮은 저항이 사용됩니다.
포트 인터럽트를 더 잘 이해하기 위해 3 가지 다른 코드를 사용합니다. 처음 두 코드는 회로도 1과 동일한 회로를 사용합니다. 코드에 대해 자세히 살펴 보겠습니다. 연결이 완료된 후 설정은 다음과 같습니다.
인터럽트를위한 MSP430 프로그래밍
전체 MSP430 인터럽트 프로그램 은이 페이지 하단에서 찾을 수 있으며 코드에 대한 설명은 다음과 같습니다.
아래 줄은 워치 독 타이머 작동을 중지합니다. 워치 독 타이머는 일반적으로 두 가지 작업을 수행합니다. 하나는 컨트롤러를 재설정하여 컨트롤러의 무한 루프를 방지하는 것이고 다른 하나는 내장 타이머를 사용하여주기적인 이벤트를 트리거하는 것입니다. 마이크로 컨트롤러가 재설정 (또는 전원이 켜짐)되면 타이머 모드가되고 32 밀리 초 후에 MCU를 재설정하는 경향이 있습니다. 이 라인은 컨트롤러가 그렇게하는 것을 중지합니다.
WDTCTL = WDTPW + WDTHOLD;
설정 P1DIR의 값 0x07 값 세트로서 출력 pin0, 핀 1 및 PIN2 방향을 등록한다. 설정 P1OUT을 는 0x30로를 구성하고 내부 풀업 저항을 갖는 입력 핀 4 및 PIN5 활성화. P1REN 을 0x30으로 설정 하면 이러한 핀에서 내부 풀업이 활성화됩니다. P1IE 는 인터럽트를 활성화합니다. 여기서 P1IES는 이러한 핀의 인터럽트 에지로 하이에서 로우로 전환을 선택합니다.
P1DIR-= 0x07; P1OUT = 0x30; P1REN-= 0x30; P1IE-= 0x30; P1IES-= 0x30; P1IFG & = ~ 0x30;
다음 라인은 저전력 모드를 활성화 하고 상태 레지스터에서 GIE 를 활성화 하여 인터럽트를 수신 할 수 있도록합니다.
__bis_SR_register (LPM4 비트 + GIE)
프로그램 카운터는 매크로를 사용하여 포트 1 벡터의 주소로 설정됩니다.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
아래 코드는 pin0, pin1, pin2에 연결된 각 LED를 하나씩 토글합니다.
if (count % 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } else if (count % 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; count ++; }
회로도 2:
마찬가지로 개념을 훨씬 더 잘 이해하기 위해 다른 핀을 사용해 보겠습니다. 따라서 여기서 푸시 버튼은 핀 1.5 대신 핀 2.0에 연결됩니다. 수정 된 회로는 다음과 같습니다. 다시이 회로는 MSP430 버튼 인터럽트 프로그램 을 테스트하는 데 사용됩니다.
여기서 포트 2는 입력에 사용됩니다. 따라서 다른 인터럽트 벡터를 사용해야합니다. P1.4 및 P2.0 은 입력을받습니다.
포트 2는 입력에만 사용되므로 P2DIR은 0으로 설정됩니다. 내부 풀업 저항이 활성화 된 상태에서 포트 2의 핀 0을 입력으로 설정하려면 레지스터 P2OUT 및 P2REN을 1의 값으로 설정해야합니다. 포트 2의 pin0에서 인터럽트하고 인터럽트의 에지를 선택하기 위해 P2IE 및 P2IES는 값 1로 설정됩니다. 포트 2의 플래그를 재설정하려면 P2IFG가 지워 지므로 플래그가 다시 설정 될 수 있습니다. 인터럽트 발생.
P2DIR-= 0x00; P2OUT = 0x01; P2REN-= 0x01; P2IE-= 0x01; P2IES-= 0x01; P2IFG & = ~ 0x01;
인터럽트 소스가 포트 1에서 나오면 포트 1의 핀 1에 연결된 LED가 켜집니다. 인터럽트 소스가 포트 2에 속하면 포트 1의 핀 2에 연결된 LED가 켜집니다.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; for (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; for (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
CCS에서 MSP430으로 프로그램 업로드
프로젝트를 런치 패드에로드하고 디버그하려면 프로젝트를 선택하고 도구 모음에서 디버그 아이콘을 클릭하십시오. 또는 F11을 누르거나 RunàDebug를 클릭하여 디버그 모드로 들어갑니다.
디버그 모드로 들어가면 녹색 실행 버튼을 눌러 MCU에로드 된 코드를 자유롭게 실행합니다. 이제 푸시 버튼을 누르면 에지 변경에 의해 인터럽트가 트리거되어 LED 상태 변경을 프롬프트합니다.
MSP430의 인터럽트 프로그램
코드가 성공적으로 업로드되면 푸시 버튼을 사용하여 테스트 할 수 있습니다. 푸시 버튼을 사용하여 인터럽트가 주어질 때마다 LED 패턴이 프로그램에 따라 변경됩니다.
전체 작업은 아래 링크 된 비디오에서 찾을 수 있습니다. 튜토리얼을 즐겁게 읽고 유용한 것을 배웠기를 바랍니다. 질문이 있으시면 댓글 섹션에 남겨 두거나 다른 기술 질문에 대한 포럼을 사용하십시오.