|
1. Ülemiste ja alumiste korruste ühendamine Eelnevas loengus tutvusime IAR-i CC2430 programmi arendamise põhiprotsessiga lihtsa LED-vilkumise katse abil. Nuga on niikuinii teritatud (kuigi mu lihvkivi pole hea), ja nüüd hakkan putukaid tapma :). Järgmisena õpime mõned CC2430 põhilised eksperimendid. Iga väike eksperiment jaguneb kolmeks osaks: "Eksperimendi sissejuhatus", "Programmi vooskeem" ja "Eksperimentaalne lähtekood ja analüüs". See artikkel selgitab väliseid katkestusi. 2. Väline katkestus(1) Sissejuhatus eksperimendileKatkestused on mikrokontrollerite sisemine mehhanism, mis töötleb sisemisi või väliseid sündmusi reaalajas. Kui toimub sisemine või väline sündmus, sunnib mikrokontrolleri katkestussüsteem protsessorit käivitava programmi pausile panema ja selle asemel katkestussündmust töötlema. Katkestused jagunevad välisteks ja sisemisteks katkestusteks ning CC2430 sisaldab kokku 18 katkestusallikat (spetsiifiliste katkestuste kirjelduste ja katkestusvektorite definitsioonide kohta vaadake palun "CC2430 Hiina käsiraamat》)。 Vaatame nüüd selle arendusplaadi skeemi:
S1 nupp on ühendatud arendusplaadil P0.1-ga ning selle katse tulemusena käivitatakse P0.1 katkestus nupu S1 kaudu ning seejärel juhitakse LED1 sisse/välja lülitamist katkestusteenuse alamprogrammis. (2) Eksperimentaalne põhimõte ja vooskeemEksperimentaalne vooskeem on järgmine:
(3) Eksperimentaalne lähtekood//头文件
#include
//延时子函数
#defineled1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3
tühiViivitus(Allkirjastamatan)
{
AllkirjastamataTT;
for(tt =0; tt<n; tt++);
for(tt =0; tt<n; tt++);
for(tt =0; tt<n; tt++);
for(tt =0; tt<n; tt++);
for(tt =0; tt<n; tt++);
}
//32M晶振初始化
tühixtal_init(tühi)
{ UNI &= ~0x04; //都上电
samal ajal(! (UNI &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Vali 32MHz kristall-ostsillaator UNI |=0x04;
}
//LED灯初始化
tühiled_init(tühi)
{ P1SEL =0x00; P1 on tavaline I/O port P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 väljund
led1 = 0; led2 = 0; led3 = 0; led4 = 0;
}
//io及外部中断初始化
tühiio_init(tühi)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
tühipea(tühi)
{ xtal_init(); led_init(); io_init();
samal ajal(1); //等待中断
}
//中断服务子程序
#pragma vektor = P0INT_VECTOR
__interrupt tühiP0_ISR(tühi)
{ EA =0; Värav on katkestatud
Viivitus(10000); Viivitus(10000); Viivitus(10000); Viivitus(10000); Viivitus(10000);
kui((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Esmalt initsialiseeri süsteemi kell: vali 32MHz kristall-ostsillaator. Seejärel initsialiseeri LED-id: määra P1 üldiseks I/O portiks, seadista väljundiks P1.0 ~ P1.3 suund ja seejärel lülita välja 4 LED-tuld. Järgmisena konfigureerige vastavad SFR-registrid väliste katkestuste jaoks, et need võimaldaksid katkestusi kõigil tasanditel, hõlmates 3 SFR-i:EA、IEN1、PICTL(Iga SFR-i üksikasjade kohta vaadake palunCC2430 Hiina käsiraamat》): EA- Täieliku katkestuse lubamine; IEN1.5- P0 katkestuse lubamine; PICTL.3—— P0.1 pordi katkestus lubab; PICTL.0—— Seadista P0.1 pordi sisendserv nii, et katkestus käivitub. Seejärel kasuta peafunktsioonis while(1) ja oota katkestust. CC2430 näpunäited(1) Bittide määramise süntaksi kokkuvõte Sageli tuleb määrata bitt (0 või 1) ühele SFR-i baidile, et täpselt riistvaraseadet juhtida. On olemas SFRToetusbitiaadressimineNäiteks TCON, P0 jne puhul on praegu vastupunktide määramine väga lihtne, lihtsalt pärige bittide definitsiooni SFR Bit Access sektsioonis ioCC2430.h päisfailis: P0_0 = 0; // määra P0 esimesele numbrile 0 P0_0 = 1; // määra P0 esimesele numbrile väärtuseks 1
Aga mõned SFR-id puuduvadBittiaadressimine ei ole toetatud, nagu selles eksperimendisPICTL, sel hetkel tahad määrata ühele neist väärtuse, süntaks on järgmine: PICTL &= ~0x01; Määra esimesele numbrile väärtus 0 PICTL |= 0x01; Määra esimesele numbrile väärtus 1
Sa võid mäletada&= ~,|=Need kaks sageli kasutatavat bittide määramise süntaks. (2) Katkestuste võimaldamise kokkuvõte Kui programmis on katkestus, tuleb see enne katkestuse käivitamist sisse lülitada. C51 katkestuste lubamise süsteemi hierarhia on väga ilmne: Interrupt Boss: EAon boss, vastutavÜldineInterrupt Enable: EA = 1;
Iga katkestatud rühmajuht: Järgmine on igaühe kohtaFunktsionaalsed osad(näiteks P0, taimer 1 jne), sellised SFR-id on tavaliselt bitiaadressitavad ning nimi sisaldab tavaliselt IE (Interrupt Enable): P0IE = 1;
Iga meeskonnaliige katkestati: Squad Kuid kuna igas funktsioonis on ka mitu katkestust, on viimane tase selle jaoksIga katkestusSee SFR tüüp on üldiselt bitita ja adresseerimatu ning sisaldab tavaliselt nimes IE (Interrupt Enable) või IM (Interrupt Mask): PICTL |=0x01;
Pole vaja SFR-i pähe katkestada, lihtsalt mõista selle hierarhiat ja võta aega, et otsida käsiraamatut või päise faili. (3) Katkestada programmide kirjutamine Katkestuste kasutamine programmis koosneb tavaliselt kahest osast: katkestusteenuse alamprogrammi kirjutamisest ja katkestuste lubamise avamisest. Katkestusfunktsioon on eespool tutvustatud ning järgnevalt on lühike sissejuhatus katkestusteenuse alamprogrammi kirjutamisse: Täpsusta esmalt.Murdevektor, mida saab pärida ioCC2430.h päisefaili katkestusvektorite sektsioonis järgmise süntaksiga: #pragma vektor = katkestusvektor
Seejärel kirjutan kohe pärast seda katkestuskäitleja, mis on üles ehitatud järgmiselt: __interrupt tühjuse funktsiooni nimi (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. KokkuvõteSee artikkel tutvustab lihtsate väliste katkestuste rakendusmeetodit, mis põhinevad CC2430-l, ning pärast katkestuste alust tutvustame veel üht väga olulist moodulit – taimereid. CC2430-l on kokku 4 taimerit, mida saab jagada kolmeks kategooriaks: taimer 1, taimer 2, taimer 3/4 (3 ja 4 on põhimõtteliselt sama kasutus). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|