| I. 이전 강의에서 다음 강의로 이어가기 이전 강의에서는 가장 간단한 LED 깜빡임을 이용한 작은 실험을 통해 IAR에서 CC2430 프로그램을 개발하는 기본 과정을 익혔습니다. 칼은 적어도 날카롭게 다듬어졌으니(제가 숫돌을 잘 다루지는 못하지만), 이제 버그를 도살할 시간입니다 :). 다음으로 몇 가지 기본적인 CC2430 실험을 배워 보겠습니다. 각각의 작은 실험은 "실험 소개", "프로그램 흐름도", "실험 소스 코드 및 분석"의 세 부분으로 나누어 설명합니다. 이 글에서는 외부 인터럽트에 대해 설명합니다. 둘째, 외부 인터럽트(1) 실험 소개 인터럽트는 내부 또는 외부 이벤트를 처리하기 위한 실시간 마이크로컨트롤러로, 내부 메커니즘입니다. 어떤 종류의 내부 또는 외부 이벤트가 발생하면 마이크로 컨트롤러 인터럽트 시스템은 CPU가 실행중인 프로그램을 일시 중지하도록 강제하지만 인터럽트 이벤트 처리로 이동하여 인터럽트 처리가 완료된 다음 프로그램에 의해 인터럽트되도록 반환하고 계속 실행합니다. 인터럽트는 외부 인터럽트와 내부 인터럽트로 구분되며, CC2430에는 총 18개의 인터럽트 소스가 있습니다(구체적인 인터럽트 설명 및 인터럽트 벡터 정의는 " CC2430 중국어 매뉴얼 "을 참조할 수 있습니다). 이제 이 개발 보드의 회로도를 살펴보겠습니다:
개발 보드에는 S1 버튼과 P0.1이 연결되어 있으며, 이 실험에서 얻고자 하는 효과는 S1 키를 눌러 P0.1의 인터럽트를 트리거한 후 인터럽트 서비스 서브루틴에서 LED1을 점/소등하는 제어를 하는 것입니다. (2) 실험 원리 및 순서도 실험의 흐름도는 다음과 같습니다:
c
(3) 실험용 소스 코드// 헤더 파일#include // 지연 서브 함수#define led1 P1_0#define led2 P1_1#define led3 P1_2#define led4 P1_3void Delay( unsigned n) { &&.
nbsp; unsigned tt;for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); & &...
f or (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); }//32M 크리스탈 초기화void xtal_init( void ) { SLEEP &=~0x04; &... nbsp; //모든 전원을 켜는동안 (! (SLEEP & 0x40 )); //크리스털 발진기 켜고 안정화 CLKCON &=~0x47; & ?
nbsp; //Select 32MHz 크리스탈 발진기 SLEEP |=0x04; }//LED 초기화void led_init( void ) { P1SEL =0x00;  
; //P1은 일반 I/O 포트 P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 출력
LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 0; }//IO 및 외부 인터럽트 초기화void io_init( void ) { P0INP &=~0X02;
/ /P0.1에는 풀업과 풀다운이 있습니다 EA =1; //총 인터럽트 활성화 P0IE =1; &
nbsp; //P0 인터럽트 활성화 PICTL |=0X09; //P0.1 포트 인터럽트 활성화, 폴링 엣지 트리거 P0IFG &=~0x02
; //P0.1 인터럽트 플래그 클리어 0 };//main functionvoid main( void ) { xtal_init(); led_init();
io_init();while ( 1 ); //wait for interrupt }//인터럽트 서비스 서브루틴#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;
/ / 인터럽트 끄기 Delay
( 10000 ); Delay(10000 ); Delay(10000 ); Delay(10000 ); Delay(10000 ); &...
i f ((P0IFG & 0x02 ) >0 ) //키 인터럽트 { P0IFG &=~0x02; &...
nbsp; //P0.1 인터럽트 플래그 클리어 0 led1 = !led1; } P0IF =0; & ...
nbsp; //P0 인터럽트 플래그 클리어 0 EA =1; & ... nbsp; // 인터럽트 켜기 } 먼저 Unity 클록을 초기화합니다: 32MHz 크리스탈 오실레이터를 선택합니다. 그런 다음 LED를 초기화합니다. P1을 범용 I/O 포트로 설정하고 P1.0 ~ P1.3 방향을 출력으로 설정한 다음 4개의 LED를 끕니다. 그런 다음 외부 인터럽트를 위해 관련 SFR 레지스터를 구성하고 EA, IEN1, PICTL 등 3개의 SFR을 포함한 모든 레벨에서 인터럽트 활성화(각 SFR에 대한 자세한 설명은 " CC2430 중국어 매뉴얼 "을 참조하세요)를 켭니다: EA - 전체 인터럽트 활성화; IEN1.5 - P0 인터럽트 활성화; PICTL.3 - P0.1 포트 인터럽트 활성화; PICTL.0 - 인터럽트 트리거를 발생시키기 위해 P0.1 포트 입력 하강 엣지를 설정합니다. 그런 다음 메인 함수에서 while(1)을 사용하여 인터럽트를 기다립니다. CC2430 팁(1) 비트 할당 구문 요약 하드웨어 장치를 정밀하게 제어하기 위해 단일 바이트 SFR의 비트에 값(0 또는 1)을 할당해야 하는 경우가 매우 많습니다. T CON, P0 등과 같이 비트 어드레싱을 지원하는 SFR도 있는데, 이때 비트 할당은 매우 간단하며, 비트 정의의 ioCC2430.h 헤더 파일에서 SFR 비트 액세스 부분을 쿼리하면 됩니다: P0_0 = 0; // P0 값의 첫 비트 할당 P0_0 = 1; / / P0 값의 첫 비트 할당 1 그러나 첫 비트의 첫 비트의 첫 비트의 첫 비트의 값의 할당과 같이 비트 어드레싱을 지원하지 않는 SFR도 존재하며, 이는 두 번째 비트의 첫 비트의 경우와 같습니다. 그러나 이 실험의 PICTL과 같이 비트 주소 지정을 지원하지 않는 SFR도 있는데, 이 중 하나에 값을 할당하려는 경우 구문은 다음과 같습니다: PICTL &= ~0x01; //첫 번째 비트에 0 값 할당 PICTL |= 0x01; //첫 번째 비트에 1 값 할당 & amp;= ~, |= ~, |= ~, |= P0_0 = 1; //P0의 첫 비트에 1 값 할당 기억하시면 될 것 같습니다 . amp;= ~, |= 이 두 가지 일반적인 비트 할당 구문입니다. (2) 인터럽트 활성화 요약 인터럽트가 프로그램에 포함된 경우, 인터럽트가 트리거되기 전에 활성화되어야 합니다. C 51 인터럽트 활성화 시스템의 계층 구조는 매우 분명합니다: 인터럽트 보스: EA는전체 인터럽트 활성화를 담당하는 보스입니다: EA = 1; 인터럽트 분리 캡틴: 다음은 각 기능 구성 요소 (예: P0, 타이머 1 등) 활성화 제어, 이러한 SFR은 일반적으로 비트 주소 지정 가능, 이름에는 일반적으로 IE(인터럽트 활성화): P0IE = 1; 인터럽트 팀 멤버: 분리이지만 프로그램중단으로 인해 인터럽트를 트리거하기 전에 인터럽트가 활성화되어 있어야 합니다.
각 인터럽트 팀원 : 팀이지만 각 기능 구성 요소에도 여러 인터럽트가 포함되어 있으므로 마지막 레벨은 각 인터럽트 활성화 제어를 위한 것이므로 이러한 SFR은 일반적으로 비트 주소 지정이 불가능하며 일반적으로 IE(인터럽트 활성화) 또는 IM(인터럽트 마스크): PICTL | = 0x01; 인터럽트 SFR을 암기할 필요가 없습니다 . 인터럽트 SFR은 계층 구조를 이해한 다음 사용할 때 매뉴얼이나 헤더 파일을 참조하기만 하면 외울 필요가 없습니다. (3) 인터럽트 프로그램 작성하기 프로그램에서 인터럽트를 사용하는 것은 일반적으로 인터럽트 서비스 서브루틴 작성과 인터럽트 활성화의 두 부분으로 구성됩니다. 인터럽트 활성화는 위에서 소개했으며, 다음은 인터럽트 서비스 서브루틴 준비에 대한 간략한 소개입니다: 먼저 인터럽트 벡터를 지정하고, 쿼리의 인터럽트 벡터 부분의 ioCC2430.h 헤더 파일에 있을 수 있으며, 구문은 다음과 같습니다: # pragma vector = 인터럽트 벡터 그리고 이어서 인터럽트 핸들러를 준비하면 구조는 다음과 같습니다: ___ interrupt void 함수 이름 (___)
인터럽트 void 함수명(void) { //온 인터럽트 //인터럽트 처리 //인터럽트 플래그 클리어 0 //오프 인터럽트 } III. 결론 이 기사에서는 인터럽트를 기반으로 CC2430을 기반으로 간단한 외부 인터럽트 구현 방법을 소개 한 다음 매우 중요한 또 다른 모듈 인 타이머를 소개합니다. CC2430에는 총 4 개의 타이머가 있으며 타이머 1, 타이머 2, 타이머 3/4 (동일한 기본 사용의 3과 4)의 세 가지 범주로 나눌 수 있습니다. 동일). </n;TT++). </n;TT++);. </n;TT++). </n;TT++); </n;TT++); </n;TT++); </n;TT++). </n;tt++). |