|
1. Viršutinio ir apatinio lygių sujungimas Ankstesnėje paskaitoje susipažinome su pagrindiniu IAR CC2430 programos kūrimo procesu atlikdami paprastą LED mirksėjimo eksperimentą. Peilis vis tiek buvo pagaląstas (nors mano akmuo nėra geras), o dabar aš pradėsiu skersti vabzdžius :). Toliau sužinokime keletą pagrindinių CC2430 eksperimentų. Kiekvienas nedidelis eksperimentas yra padalintas į tris dalis: "Eksperimento įvadas", "Programos eigos schema" ir "Eksperimentinis šaltinio kodas ir analizė". Šiame straipsnyje paaiškinami išoriniai pertraukimai. 2. Išorinis pertraukimas(1) Įvadas į eksperimentąPertraukimai yra vidinis mikrovaldiklių mechanizmas, skirtas apdoroti vidinius ar išorinius įvykius realiuoju laiku. Įvykus vidiniam ar išoriniam įvykiui, mikrovaldiklio pertraukimo sistema privers procesorių pristabdyti vykdančią programą ir apdoroti pertraukimo įvykį. Pertraukimai skirstomi į išorinius ir vidinius, o CC2430 iš viso yra 18 pertraukimo šaltinių (konkrečius pertraukimo aprašymus ir pertraukimo vektorių apibrėžimus rasite "CC2430 kinų kalbos vadovas》)。 Dabar pažvelkime į šios kūrimo plokštės schemą:
Mygtukas S1 buvo prijungtas prie P0.1 kūrimo plokštėje, o šio eksperimento poveikis yra suaktyvinti P0.1 pertraukimą mygtuku S1, o tada valdyti LED1 įjungimą / išjungimą pertraukimo paslaugos paprogramėje. (2) Eksperimentinis principas ir struktūrinė schemaEksperimentinė schema yra tokia:
(3) Eksperimentinis šaltinio kodas//头文件
#include
//延时子函数
#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3
tuščiaVėlavimas(nepasirašytasn)
{
nepasirašytastt;
dėl(tt =0; tt<n; tt++);
dėl(tt =0; tt<n; tt++);
dėl(tt =0; tt<n; tt++);
dėl(tt =0; tt<n; tt++);
dėl(tt =0; tt<n; tt++);
}
//32M晶振初始化
tuščiaxtal_init (tuščia)
{ MIEGAS &= ~0x04; //都上电
Nors(! (MIEGO IR0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Pasirinkite 32 MHz kristalinį osciliatorių MIEGO REŽIMAS |=0x04;
}
//LED灯初始化
tuščialed_init (tuščia)
{ P1SEL =0x00; P1 yra įprastas įvesties / išvesties prievadas P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 išėjimas
LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 0;
}
//io及外部中断初始化
tuščiaio_init(tuščia)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
tuščiapagrindinis(tuščia)
{ xtal_init (); led_init (); io_init ();
Nors(1); //等待中断
}
//中断服务子程序
#pragma vektorius = P0INT_VECTOR
__interrupt tuščiaP0_ISR(tuščia)
{ EA =0; Vartai nutraukiami
Vėlavimas(10000); Vėlavimas(10000); Vėlavimas(10000); Vėlavimas(10000); Vėlavimas(10000);
jei((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Pirmiausia inicijuokite sistemos laikrodį: pasirinkite 32 MHz kristalinį osciliatorių. Tada inicijuokite šviesos diodus: nustatykite P1 kaip bendrą įvesties / išvesties prievadą, nustatykite P1.0 ~ P1.3 kryptį kaip išvestį ir išjunkite 4 LED lemputes. Tada sukonfigūruokite atitinkamus SFR registrus išoriniams pertraukimams, kad įgalintumėte pertraukimus visais lygiais, įskaitant 3 SFR:EA、IEN1、PICTL(Išsamesnė informacija apie kiekvieną SFR pateikiamaCC2430 kinų kalbos vadovas》): EA- Visiško pertraukimo įjungimas; IEN1.5- P0 pertraukimo įjungimas; PICTL.3—— P0.1 prievado pertraukimo įjungimas; PICTL.0—— Nustatykite P0.1 prievado įvesties nuleidžiamąjį kraštą, kad suveiktų pertraukimas. Tada naudokite while (1) pagrindinėje funkcijoje ir palaukite pertraukos. CC2430 patarimai(1) Bitų priskyrimo sintaksės santrauka Daug kartų turime priskirti bitą (0 arba 1) vienam SFR baitui, kad galėtume tiksliai valdyti aparatūros įrenginį. Yra SFRPalaikykite bitų adresavimąPavyzdžiui, TCON, P0 ir kt., Šiuo metu kontrapunktų priskyrimas yra labai paprastas, tiesiog užklauskite bitų apibrėžimo ioCC2430.h antraštės failo SFR bitų prieigos skyriuje: P0_0 = 0; // priskirti 0 pirmajam P0 skaitmeniui P0_0 = 1; // pirmajam P0 skaitmeniui priskirkite reikšmę 1
Tačiau kai kurių SFR nėraBitų adresavimas nepalaikomas, kaip ir šiame eksperimentePICTL, šiuo metu norite priskirti reikšmę vienam iš jų, sintaksė yra tokia: PICTL &= ~0x01; Pirmajam skaitmeniui priskirkite reikšmę 0 PICTL |= 0x01; Pirmajam skaitmeniui priskirkite 1 reikšmę
Galite prisiminti&= ~,|=Šios dvi dažniausiai naudojamos bitų priskyrimo sintaksės. (2) Pertraukimo įgalinimo santrauka Kai programoje yra pertraukimas, jis turi būti įjungtas prieš suaktyvinant pertraukimą. C51 pertraukimo įjungimo sistemos hierarchija yra labai akivaizdi: Pertraukti bosas: EAyra viršininkas, atsakingasBendraPertraukti įgalinti: EA = 1;
Kiekvienas pertrauktas būrio vadas: Kitas skirtas kiekvienamFunkcinės dalys(pvz., P0, 1 laikmatis ir kt.), tokie SFR paprastai yra adresuojami bitais, o pavadinime paprastai yra IE (Interrupt Enable): P0IE = 1;
Kiekvienas komandos narys buvo nutrauktas: Būrys Bet kadangi kiekvienoje funkcijoje taip pat yra keli pertraukimai, paskutinis lygis skirtas šiamKiekvienas pertraukimasŠio tipo SFR paprastai yra be bitų ir neadresuojamas, o pavadinime paprastai yra IE (Interrupt Enable) arba IM (Interrupt Mask): PICTL |=0x01;
Nereikia rote pertraukti SFR, tiesiog suprasti jo hierarchiją ir tada imtis laiko ieškoti vadovo arba antraštės failą. (3) Nutraukti programų rašymą Pertraukimų naudojimas programoje paprastai susideda iš dviejų dalių: pertraukimo paslaugos poprogramės rašymo ir pertraukimo įjungimo atidarymo. Pertraukimo funkcija buvo pristatyta aukščiau, o toliau pateikiamas trumpas įvadas į pertraukimo paslaugos poprogramės rašymą: Pirmiausia nurodykitePertraukos vektorius, kurio užklausą galima pateikti ioCC2430.h antraštės failo skyriuje Pertraukimo vektoriai, naudojant tokią sintaksę: #pragma vektorius = pertraukimo vektorius
Tada iškart po to parašykite pertraukimo apdorojimo programą, kurios struktūra yra tokia: __interrupt anuliuoti funkcijos pavadinimą (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. IšvadaŠiame straipsnyje pristatomas paprastų išorinių pertraukimų, pagrįstų CC2430, įgyvendinimo metodas, o po pertraukų pagrindo pristatysime dar vieną labai svarbų modulį - laikmačius. CC2430 iš viso turi 4 laikmačius, kuriuos galima suskirstyti į tris kategorijas: 1 laikmatis, 2 laikmatis, 3/4 laikmatis (3 ir 4 iš esmės yra tas pats naudojimas). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|