이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 7368|회답: 0

지그비 여정 (3): 여러 중요한 CC2430 기본 실험 - 외부 중단

[링크 복사]
게시됨 2014. 10. 30. 오후 11:16:46 | | | |
1. 상하층 연결

이전 강의에서는 간단한 LED 플래싱 실험을 통해 IAR이 CC2430 프로그램을 개발하는 기본 과정을 익혔습니다. 어쨌든 칼은 이미 갈렸고(숫돌은 별로지만), 이제 :) 곤충을 도살하기 시작할 거야. 다음으로 CC2430의 몇 가지 기본 실험을 살펴보겠습니다. 각 작은 실험은 "실험 소개", "프로그램 플로우 차트", "실험 소스 코드 및 분석" 세 부분으로 나뉩니다.

이 글은 외부 중단에 대해 설명합니다.

2. 외부 중단(1) 실험 소개

인터럽트는 마이크로컨트롤러가 내부 또는 외부 이벤트를 실시간으로 처리하는 내부 메커니즘입니다. 내부 또는 외부 이벤트가 발생하면, 마이크로컨트롤러의 인터럽트 시스템은 CPU가 실행 중인 프로그램을 일시정지하고 대신 인터럽트 이벤트를 처리하도록 강제합니다.

인터럽트는 외부 인터럽트와 내부 인터럽트로 나뉘며, CC2430에는 총 18개의 인터럽트 소스가 포함되어 있습니다(인터럽트 벡터의 구체적인 설명과 정의는 "CC2430 중국 매뉴얼》)。

이제 이 개발 보드의 회로도를 살펴보겠습니다:

S1 버튼은 개발 보드의 P0.1에 연결되어 있으며, 이 실험의 효과는 S1 버튼을 통해 P0.1의 인터럽트를 트리거하고, 인터럽트 서비스 서브프로그램에서 LED1의 온/오프를 제어하는 것입니다.

(2) 실험 원리 및 흐름도

실험 흐름도는 다음과 같습니다:


(3) 실험적 소스 코드//头文件
#include

//延时子函数
#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3

공허지연(서명 없음n)   
{
  서명 없음tt;
  에 대해(tt =0; tt<n; tt++);
  에 대해(tt =0; tt<n; tt++);
  에 대해(tt =0; tt<n; tt++);
  에 대해(tt =0; tt<n; tt++);
  에 대해(tt =0; tt<n; tt++);
}

//32M晶振初始化
공허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 = 0;
  led2 = 0;
  led3 = 0;
  led4 = 0;
}

//io及外部中断初始化
공허io_init(공허)
{
    P0INP &= ~0X02;   //P0.1有上拉、下拉

    EA =1;           //总中断使能
   
    P0IE =1;   //P0中断使能
   
    PICTL |=  0X09;   //P0.1口中断使能,下降沿触发
   
    P0IFG &= ~0x02;   //P0.1中断标志清0
};

//主函数
공허주요(공허)   
{
  xtal_init();
  led_init();  
  io_init();

  반면(1);   //等待中断
}

//中断服务子程序
#pragma 벡터 = P0INT_VECTOR
__interrupt 공허P0_ISR(공허)
{
  EA =0;                        문이 끊긴다  

  지연(10000);  
  지연(10000);
  지연(10000);
  지연(10000);
  지연(10000);

  만약((P0IFG &0x02) >0)         //按键中断
  {
    P0IFG &= ~0x02;               //P0.1中断标志清0
    led1 = !led1;
  }
  P0IF =0;                       //P0中断标志清0

  EA =1;                        //开中断
}

먼저, 시스템 클럭을 초기화합니다: 32MHz 크리스털 발진기를 선택합니다.

그 다음 LED를 초기화합니다: P1을 일반 I/O 포트로 설정하고, P1.0 ~ P1.3 방향을 출력으로 설정한 뒤, 4개의 LED 조명을 끕니다.

다음으로, 외부 인터럽트용 SFR 레지스터를 설정하여 3개의 SFR을 포함하는 모든 레벨에서 인터럽트를 활성화합니다:EAIEN1픽틀(각 SFR에 대한 자세한 내용은 다음을 참조하시기 바랍니다.CC2430 중국 매뉴얼》):

EA- 완전 인터럽트 가능

    IEN1.5- P0 인터럽트 활성화;

    PICTL.3—— P0.1 포트 인터럽트 활성화;

    픽틀.0—— P0.1 포트 입력 드롭 엣지를 인터럽트 트리거로 설정하세요.

그 다음 메인 함수에서 while(1)을 사용하고 인터럽트를 기다리세요.

CC2430 팁
(1) 비트 할당 구문 요약
많은 경우, 하드웨어 장치를 정밀하게 제어하기 위해 SFR의 한 바이트에 비트(0 또는 1)를 할당해야 합니다.
SFR이 있습니다지지 비트 주소 지정예를 들어, TCON, P0 등은 현재 counterpoint의 할당이 매우 간단하며, ioCC2430.h 헤더 파일의 SFR 비트 접근 섹션에서 비트 정의를 조회하면 됩니다:
P0_0 = 0; // P0의 첫 자리에 0을 할당한다
P0_0 = 1; // P0의 첫 자리에 값을 1로 할당합니다  

하지만 일부 SFR은 없습니다비트 주소 지정 기능은 지원되지 않습니다, 이 실험에서처럼,픽틀이 시점에서 그들 중 하나에 값을 할당하고 싶습니다. 문법은 다음과 같습니다:
PICTL &= ~0x01;   첫 번째 숫자에 0을 할당합니다
PICTL |= 0x01;     첫 번째 숫자에 값을 1로 할당합니다

기억할 수 있잖아&= ~|=이 두 가지 비트 할당 문법이 일반적으로 사용됩니다.
(2) 중단 실현 요약
프로그램에 인터럽트가 개입될 경우, 인터럽트가 트리거되기 전에 반드시 인터럽트가 활성화되어야 합니다.
C51 인터럽트 활성화 시스템의 계층 구조는 매우 명확합니다:
인터럽트 보스: EA사장님, 책임자입니다일반인터럽트 활성화:
EA = 1;

  각 분대장은 말을 끊었다: 다음은 각 명단에 해당됩니다기능적 구성 요소(예: P0, 타이머 1 등), 이러한 SFR은 일반적으로 비트 주소 지정 가능하며, 이름에는 일반적으로 IE(인터럽트 활성화)가 포함됩니다:
P0IE = 1;

  각 팀원이 방해받았다: 분대. 하지만 각 특징 내에 여러 인터럽트도 포함되어 있기 때문에, 마지막 단계는 이 용도입니다모든 방해가이 유형의 SFR은 일반적으로 비트가 없고 주소 지정이 불가능하며, 이름에 IE(인터럽트 활성화) 또는 IM(인터럽트 마스크)가 포함되어 있습니다:
PICTL |=0x01;

인터럽트 SFR을 반복할 필요는 없고, 계층 구조를 이해한 후 매뉴얼이나 헤더 파일을 찾아보는 데 시간을 투자하면 됩니다.
(3) 프로그램 작성 중단
프로그램에서 인터럽트의 사용은 일반적으로 두 부분으로 구성됩니다: 인터럽트 서비스 서브프로그램의 작성과 인터럽트 활성화의 열기입니다. 인터럽트 함수는 위에서 소개되었으며, 다음은 인터럽트 서비스 서브프로그램 작성에 대한 간략한 소개입니다:
먼저 명시하세요브레이크 벡터ioCC2430.h 헤더 파일의 인터럽트 벡터 섹션에서 다음과 같은 구법으로 쿼리할 수 있습니다:
#pragma 벡터 = 인터럽트 벡터

그 다음 바로 이어서 인터럽트 핸들러를 작성하는데, 구조는 다음과 같습니다:
__interrupt void 함수 이름 (void)
  {
    //开中断
    //中断处理
    //中断标志清0
    //关中断
  }



3. 결론

이 글에서는 CC2430을 기반으로 한 단순 외부 인터럽트 구현 방법을 소개하며, 인터럽트의 기본 개념 다음에 또 다른 매우 중요한 모듈인 타이머를 소개하겠습니다. CC2430에는 총 4개의 타이머가 있으며, 타이머 1, 타이머 2, 타이머 3/4(3과 4는 기본적으로 동일한 사용법)의 세 가지 범주로 나눌 수 있습니다.


</n; tt++);
</n; tt++);
</n; tt++);
</n; tt++);
</n; tt++);




이전의:지그비 저니 (2): 첫 번째 CC2430 프로그램 - LED 조명 깜박임 실험
다음:지그비 여정 (4): 여러 중요한 CC2430 기본 실험 - 타이머 중단
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com