| I. 이전 글에서 계속 이어가기 이전 섹션에서는 간단한 외부 인터럽트 구현에 대해 함께 배웠습니다. 인터럽트에 대한 실무 경험을 쌓은 후 이번 섹션에서는 타이머 인터럽트에 대해 설명하겠습니다.CC2430에는 타이머가 4개 있으며, 타이머1, 타이머2, 타이머3/4(3과 4의 사용법은 동일)의 세 가지 범주로 나눌 수 있습니다. 필자도 CC2430을 막 만지고 있기 때문에 타이머 경험과 관련된 프로젝트는 기본적으로 0이므로 타이머에 대한 심층 분석을 할 의도가 없으며 도울 수도 없습니다. 이 글에서는 타이머 1 카운트 오버플로 인터럽트 사용법에 대해서만 간단한 실험적 탐색을 하고, 입력 캡처/출력 비교/PWM 기능은 생략합니다. 타이머 2와 타이머 3/4도 간략하게만 소개합니다. 저자의 실력이 일정 수준에 도달할 때까지 기다렸다가 지그비 전투 경험의 정점에 서서 이 글을 보완하겠습니다. 타이머 1 타이머1은 타이머/카운터/펄스 폭 변조 기능이 있는 16비트 타이머입니다. 개별적으로 프로그래밍 가능한 3개의 입력 캡처/출력 비교 채널이 있으며, 각 채널은 PWM 출력으로 사용하거나 입력 신호의 에지 시간을 캡처하는 데 사용할 수 있습니다(입력 캡처/출력 비교의 정의와 PWM 출력 구현 방법에 대한 자세한 내용은 CC2430의 중국어 설명서를 직접 참조할 수 있습니다). 타이머에는 작동 모드라는 매우 중요한 개념이 있습니다. 작동 모드에는 자유 실행, 모듈로 및 업다운이 포함됩니다. 다음은 CC2430 중국어 매뉴얼의 세 가지 모드에 대한 소개입니다:
세 가지 모드를 비교해보면, 자유 실행 모드의 오버플로 값은 0xFFFF로 변경할 수 없는 반면, 나머지 두 모드는 타이머의 오버플로 값을 정밀하게 제어하기 위해 T1CC0에 값을 할당하여 정밀하게 제어할 수 있음을 알 수 있습니다. 이 실험에서는 이 기능을 활용하여 타이머가 특정 T1CC0을 통해 1초마다 인터럽트를 트리거하도록 하여 LED 깜박임 간격을 1초로 정밀하게 제어합니다. (1) 실험 소개 타이머의 모듈로 모드에서 LED의 깜박임 간격은 1초로 정밀하게 제어됩니다. 즉, 밝음 0.5초 → 어두움 0.5초 → 밝음 0.5초 → 어두움 0.5초 ....... → 밝음 0.5초 → 어두움 0.5초(즉, 어두움에서 밝음으로 전환되는 순간은 1초). 밝음/어둠의 반전은 오버플로 인터럽트에 의해 실현됩니다. (2) 프로그램 흐름도 (3) 관련 계산 앞서 언급했듯이 LED의 상태는 밝음 0.5초 → 어두움 0.5초 → 밝음 0.5초 → 어두움 0.5초 ...... → 밝음 0.5초 → 어두움 0.5초로, 오버플로 인터럽트로 달성해야 하므로 타이머의 오버플로 주기는 0.5초가 필요합니다. 이를 위해 해당 오버플로 값을 계산해야 합니다(일시적으로 N으로 설정). 시스템 클럭 주파수는 32MHz로 선택되며 타이머에 제공되는 클럭 주파수는 기본적으로 16MHz입니다(둘 다 CC2430 중국어 매뉴얼에서 찾을 수 있는 특수 기능 레지스터 CLKCON으로 구성됩니다). 타이머 1의 경우 클럭 주파수를 128 분할로 설정합니다. 요약하면 공식은 다음과 같습니다:
c
N = 62500, 16진수는 0xF424, 즉 T1CC0H = 0xF4, T1CC0L = 0x24, 즉 를 설정해야 합니다.
(4) 실험 소스 코드 및 분석/* 실험 설명: 타이머1 실험, 타이머 카운트 오버플로우, LED1 깜박임 */ #include #define led1 P1_0 # define led2 P1_1 #define led3 P1_0 #define led3 P1_1
1 #define led3 P1_2 #define led4 P1_3 
n bsp; /* 시스템 클럭 초기화-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& nbsp; // 둘 다 전원을 켜는동안 (! (SLEEP & 0x40 )); //크리스탈 오실레이터 켜고 안정화 CLKCON &=~0x47; & ...
nbsp; //select 32MHz 크리스탈 발진기 SLEEP |=0x04; }/*LED 초기화-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1은 일반 I/O 포트 P1DIR |=0x0F; &... nbsp; //P1.0 P1.1 P1.2 P1.3 출력 led1 =1; & ?
led2 = 1; led3 =1; led4 =1; }/*T1 초기화---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; // 총 인터럽트 켜기 &. T 1IE=1; // T1 인터럽트 켜기OVFIM=1; // T1 오버플로우 켜기
인터럽트 T1CC0L=0x24; // 오버플로우 값 낮음 8비트 T1CC0H=0xF4; // 오버플로우 값 높음 8비트 & nbsp
T1CTL = 0x0e; //128 분할; 모듈로 모드(0x0000->T1CC0); 실행 시작;T1IF=0;  
nbsp; // 인터럽트 플래그 지우기 }/* 메인 함수-------------------------------------------------------*/void main( void
) { xtal_init(); led_init(); timer1_init();while ( 1 ); & ?
nbsp; //wait for overflow interrupt }/*T1 단말 서비스 서브루틴-------------------------------------------------------*/#pragma vector=T1_VECTOR__interrupt
v oid T1_ISR( void ) {EA=0; //오프 인터럽트 led1 = !
led1; //LED 반전EA=1; //온 인터럽트  
; T1CTL &=~0x10; // 인터럽트 플래그 지우기 } 좋아, 프로그램을 컴파일하고 온라인 디버깅을 하면 LED1의 개발 보드가 예상대로 점멸하고 약 1초의 점멸 간격을 느낍니다. 그러나 이것만으로는 실험의 성공을 증명하기에 충분하지 않습니다. 1초의 간격을 엄격하게 결정할 수 있다면 완벽 할 것입니다 ~ 그래서 WIN 7 시계 (작업 표시 줄 시간의 오른쪽을 클릭하면 될 수 있음)를 열었습니다. 초침을 보면서 깜빡이는 LED1를 한눈으로 흘끗 보았습니다. 그 결과 2분 안에 두 시계의 속도는 기본적으로 동일합니다(이 정확도는 허용될 수 있습니다~). 이쯤 되면 실험은 기본적으로 완료되었다고 할 수 있습니다. 셋째, 타이머 2 MAC 타이머라고도 하는 Timer2는 IEEE 802.15.4 MAC에서 이벤트 추적 프로토콜을 지원하도록 특별히 설계되었습니다. 이 타이머에는 발생한 사이클 수를 기록하는 데 사용할 수 있는 8비트 오버플로 카운터, 프레임 시작 구분자가 수신/전송된 정확한 시간 또는 전송이 완료된 정확한 시간을 기록하는 데 사용되는 16비트 캡처 레지스터, 특정 시간(수신 시작, 전송 시작 등)에 무선 모듈에 다양한 명령 선택적 통신 신호를 생성하는 데 사용되는 16비트 출력 비교 레지스터가 있습니다. 타이머 3/4 타이머 3/4는 타이머/카운터/PWM 기능이 있는 8비트 타이머입니다. t3/t4에는 두 개의 출력 비교 채널이 있으며, 각 채널은 PWM 출력으로 사용할 수 있습니다. V. 결론 이 섹션에서는 타이머 1의 오버플로 인터럽트를 카운트하는 방법을 배웠고 LED 깜박임 간격을 1초로 정밀하게 제어했습니다. 다른 타이머는 간략히 살펴본 다음 나중에 다시 추가하도록 하겠습니다. 다음 섹션에서는 CC2430 직렬 포트 통신에 대해 소개하겠습니다. |