|
1. Conectarea nivelurilor superioare și inferioare În prelegerea anterioară, ne-am familiarizat cu procesul de bază al dezvoltării programului CC2430 prin IAR printr-un experiment simplu de blițare LED. Cuțitul a fost ascuțit oricum (deși piatra mea de ascuțit nu este bună), iar acum voi începe să sacrific insecte :). Apoi, să învățăm câteva experimente de bază cu CC2430. Fiecare mic experiment este împărțit în trei părți: "Introducere a experimentului", "Diagramă de flux a programului" și "Cod sursă experimental și analiză". Acest articol explică întreruperile externe. 2. Întrerupere externă(1) Introducere în experimentÎntreruperile sunt un mecanism intern prin care microcontrolerele pot procesa evenimente interne sau externe în timp real. Când apare un eveniment intern sau extern, sistemul de întreruperi al microcontrolerului va forța CPU-ul să oprească programul care rulează și, în schimb, va procesa evenimentul de întrerupere. Întreruperile sunt împărțite în întreruperi externe și interne, iar CC2430 conține un total de 18 surse de întreruperi (pentru descrieri și definiții specifice ale vectorilor de întrerupere, vă rugăm să consultați "Manualul chinezesc CC2430》)。 Acum să aruncăm o privire la schema circuitului acestei plăci de dezvoltare:
Butonul S1 a fost conectat la P0.1 pe placa de dezvoltare, iar efectul acestui experiment este de a declanșa întreruperea lui P0.1 prin butonul S1, apoi de a controla pornirea/oprirea LED1 în subprogramul de servicii de întrerupere. (2) Principiu experimental și diagramă de fluxDiagrama de flux experimentală este următoarea:
(3) Cod sursă experimental//头文件
#include
//延时子函数
#definea condus1 P1_0
#defineled2 P1_1
#defineled3 P1_2
#defineled4 P1_3
VoidÎntârziere(nesemnatn)
{
nesemnattt;
pentru(tt =0; TT<N; tt++);
pentru(tt =0; TT<N; tt++);
pentru(tt =0; TT<N; tt++);
pentru(tt =0; TT<N; tt++);
pentru(tt =0; TT<N; tt++);
}
//32M晶振初始化
Voidxtal_init(Void)
{ SOMN &= ~0x04; //都上电
în timp ce(! (SOMN &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Alege un oscilator cu cristal de 32MHz SLEEP |=0x04;
}
//LED灯初始化
Voidled_init(Void)
{ P1SEL =0x00; P1 este portul normal de I/O P1DIR |=0x0F; Ieșire P1.0 P1.1 P1.2 P1.3
a condus1 = 0; a condus2 = 0; a condus3 = 0; a condus4 = 0;
}
//io及外部中断初始化
Voidio_init(Void)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
Voidmain(Void)
{ xtal_init(); led_init(); io_init();
în timp ce(1); //等待中断
}
//中断服务子程序
#pragma vector = P0INT_VECTOR
__interrupt VoidP0_ISR(Void)
{ EA =0; Poarta este întreruptă
Întârziere(10000); Întârziere(10000); Întârziere(10000); Întârziere(10000); Întârziere(10000);
dacă((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 a condus1 = !a condus1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Mai întâi, inițializează ceasul sistemului: selectează un oscilator cu cristal de 32MHz. Apoi inițializează LED-urile: setează P1 ca port general de I/O, setează direcția P1.0 ~ P1.3 ca ieșire și apoi stinge cele 4 LED-uri. Apoi, configurați registrele SFR relevante pentru întreruperi externe pentru a permite întreruperile la toate nivelurile, implicând 3 SFR-uri:EA、IEN1、PICTL(Pentru detalii despre fiecare SFR, vă rugăm să consultațiManualul chinezesc CC2430》): EA- Activarea întreruperii totale; IEN1.5- Activarea întreruperii P0; PICTL.3—— P0.1 port întrerupere activată; PICTL.0—— Setează marginea de cădere a portului P0.1 pentru a provoca declanșarea întreruperii. Apoi folosește while(1) în funcția principală și așteaptă întreruperea. Sfaturi CC2430(1) Rezumat al sintaxei alocării biților De multe ori, trebuie să atribuim un bit (0 sau 1) unui singur octet de SFR pentru a controla precis dispozitivul hardware. Există SFRAdresarea biților de suportDe exemplu, TCON, P0 etc., în acest moment, atribuirea contrapunctelor este foarte simplă, pur și simplu interogați definiția bitului în secțiunea SFR Bit Access a fișierului de antet ioCC2430.h: P0_0 = 0; // atribuiți 0 primei cifre din P0 P0_0 = 1; // atribuiți o valoare de 1 primei cifre din P0
Dar unele SFR-uri nu existăAdresarea biților nu este suportată, ca în acest experimentPICTL, în acest moment, doriți să atribuiți o valoare uneia dintre ele, sintaxa este următoarea: PICTL &= ~0x01; Atribuiți o valoare de 0 primei cifre PICTL |= 0x01; Atribuiți valoarea de 1 primei cifre
Îți poți aminti&= ~,|=Aceste două sintaxe de alocare a biților sunt folosite frecvent. (2) Rezumat al activării întreruperii Când este implicată o întrerupere în program, aceasta trebuie activată înainte ca întreruperea să fie declanșată. Ierarhia sistemului de activare a întreruperilor C51 este foarte evidentă: Boss Întrerupere: EAeste șeful, responsabilGeneralActivarea întreruperii: EA = 1;
Fiecare lider de echipă întrerupt: Următorul este pentru fiecarePărți funcționale(cum ar fi P0, timer 1 etc.), astfel de SFR-uri sunt în general adresabile pe biți, iar denumirea conține în general IE (Interrupt Enable): P0IE = 1;
Fiecare membru al echipei a fost întrerupt: Squad Dar, deoarece fiecare caracteristică conține și mai multe întreruperi, ultimul nivel este pentru acestaFiecare întrerupereAcest tip de SFR este, în general, fără biți și neadresabil, și conține de obicei IE (Interrupt Enable) sau IM (Interrupt Mask) în denumire: PICTL |=0x01;
Nu este nevoie să faci SFR întreruperi mecanice, doar să înțelegi ierarhia și apoi să consulți manualul sau fișierul antet. (3) Întreruperea scrierii programelor Utilizarea întreruperilor într-un program include în general două părți: scrierea subprogramului serviciului de întreruperi și deschiderea activării întreruperii. Funcția de întrerupere a fost introdusă mai sus, iar următoarea este o scurtă introducere în scrierea subprogramului de serviciu de întrerupere: Specifică mai întâiVector de rupere, care poate fi interogat în secțiunea Vectori de Întrerupere a fișierului de antet ioCC2430.h, cu următoarea sintaxă: #pragma vector = vector de întrerupere
Apoi scrie handler-ul de întreruperi imediat după, care este structurat astfel: __interrupt numele funcției void (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. ConcluzieAcest articol introduce metoda de implementare a întreruperilor externe simple bazate pe CC2430, iar după baza întreruperilor, vom introduce un alt modul foarte important – timerele. CC2430 are în total 4 cronometre, care pot fi împărțite în trei categorii: cronometrul 1, cronometrul 2, cronometrul 3/4 (3 și 4 sunt practic aceeași utilizare). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|