|
1. 상하층 연결 이전 글에서는 간단한 외부 인터럽트의 구현에 대해 함께 배웠습니다. 인터럽트에 대한 실습 경험을 쌓았으니, 이 섹션에서는 타이머 인터럽트에 대해 이야기해 보겠습니다. CC2430에는 총 4개의 타이머가 있으며, 타이머 1, 타이머 2, 타이머 3/4(3과 4의 사용법은 동일)의 3가지 범주로 나눌 수 있습니다. 저자도 CC2430 초보이며 타이머 관련 프로젝트에 대한 실무 경험이 거의 없기 때문에, 타이머를 깊이 분석할 생각은 없고 할 수도 없습니다. 이 글에서는 카운트 오버플로우 인터럽트에서 타이머 1의 사용에 대한 간단한 실험적 탐구만 제공하며, 입력 캡처/출력 비교/PWM 기능에 대해서는 언급하지 않습니다. 타이머 2와 타이머 3/4는 단순한 함수 소개일 뿐입니다. 저자의 실력이 일정 수준에 도달하면, 저는 지그비의 실무 경험 정점에 서서 이 에세이를 개선하겠습니다. 2. 타이머 1타이머 1은 타이머/카운터/펄스 폭 변조가 가능한 16비트 타이머입니다. 3개의 개별 프로그래밍 가능한 입력 캡처/출력 비교 채널을 갖추고 있으며, 각각은 PWM 출력이나 입력 신호를 캡처하는 엣지 타임으로 사용할 수 있습니다(입력 캡처/출력 비교가 무엇인지, PWM 출력 구현 방법에 대해서는 CC2430 중국 매뉴얼을 참고할 수 있습니다). 타이머는 매우 중요한 개념을 가지고 있습니다:작동 방식。 작동 모드는 다음과 같습니다: 자유 작동 모드 (프리러닝몰드 모드 (모듈로) 및 양의 카운트다운 모드(업-다운)。 다음은 3가지 모드 도입을 위한 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입니다(두 주파수 모두 특수 기능 레지스터에 의해 결정됩니다).CLKCON자세한 내용은 CC2430 중국 매뉴얼을 참고하시기 바랍니다. 타이머 1의 경우, 시계 크로스오버를 128 디비전으로 설정하세요. 요약하자면, 목록은 다음과 같습니다:
N=62500을 찾으려면 16진수가 0xF424 되어 T1CC0H=0xF4, T1CC0L=0x24 를 설정해야 합니다. (4) 실험적 소스 코드 및 분석/*
실험 설명: 타이머 타이머 실험, 타이머 카운트 오버플로우, LED1 깜빡임
*/
#include
#define 이끄는 1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
공허xtal_init(공허)
{ 잠 &= ~0x04; //都上电
반면(! (잠 그리고0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; 32MHz 크리스털 발진기를 선택하세요 잠 |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
공허led_init(공허)
{ P1SEL =0x00; P1은 일반 I/O 포트입니다 P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 출력
LED1 =1; //关闭所有LED led2 =1; led3 =1; LED4 =1;
}
/*T1初始化
-------------------------------------------------------*/
공허timer1_init(공허)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM=1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; 128 크로스오버; 모듈로 모드(0x0000->T1CC0); 달리기 시작해; T1IF=0; 방해 표지판을 치워
}
/*主函数
-------------------------------------------------------*/
공허주요(공허)
{ xtal_init(); led_init(); timer1_init();
반면(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma 벡터=T1_VECTOR __interrupt공허T1_ISR(공허)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
좋아요, 프로그램을 컴파일하고 온라인으로 디버그하세요. 개발판의 LED1은 예정대로 깜빡이고, 깜빡임 간격이 약 1초 정도인 것 같습니다. 하지만 이것만으로는 실험의 성공을 증명하기에 부족합니다. 간격이 엄격히 1로 결정된다면 완벽할 것입니다~ 그래서 WIN 7의 시계를 켰습니다(작업 표시줄 오른쪽에 있는 시간을 클릭하세요). 초침을 보던 중, 그는 옆눈으로 LED1이 깜빡이는 것을 보았다. 결과: 2분 이내에 두 곡의 속도가 거의 똑같아집니다(이 정밀도는 참을 만합니다~). 이 시점에서 실험은 사실상 완료된 셈이죠, 헤헤~ 3. 타이머 2타이머 2라고도 불립니다MAC 타이머는 IEEE 802.15.4 MAC에서 이벤트 추적 프로토콜을 지원하도록 특별히 설계되었습니다. 타이머에는 발생한 사이클 수를 기록할 수 있는 8자리 오버플로우 카운터가 있습니다; 프레임이 수신/송수신을 시작하거나 전송이 완료되는 정확한 시간을 기록하는 16비트 캡처 레지스터가 있습니다. 또한 특정 시점에 무선 모듈로 다양한 명령 게이팅 신호(수신 시작, 전송 시작 등)를 생성하는 16비트 출력 비교 레지스터가 포함되어 있습니다. 4. 타이머 3/4타이머 3/4는 타이머/카운터/PWM 기능을 갖춘 8비트 타이머입니다. T3/T4는 2개의 출력 비교 채널을 가지고 있으며, 각각 PWM 출력으로 사용할 수 있습니다. 5. 결론이 섹션에서는 주로 타이머 1의 카운트 오버플로우 인터럽트 방법을 배우고, LED 점멸 간격 1의 정밀한 제어를 구현합니다. 몇 개의 타이머는 그냥 한 번의 일이고, 나중에 다시 추가할게요. 다음 섹션에서는 CC2430 직렬 포트 통신을 소개하겠습니다.
|