|
1. Povezava zgornje in spodnje ravni Na prejšnjem predavanju smo se seznanili z osnovnim postopkom IAR razvoja programa CC2430 preko preprostega eksperimenta z LED utripanjem. Nož je bil tako ali tako naostren (čeprav moj brusni kamen ni dober), zdaj pa bom začel klanjati žuželke :). Nato se naučimo nekaj osnovnih eksperimentov CC2430. Vsak majhen eksperiment je razdeljen na tri dele: "Uvod v eksperiment", "Diagram poteka programa" in "Eksperimentalna izvorna koda in analiza". Ta članek pojasnjuje zunanje motnje. 2. Zunanja prekinitev(1) Uvod v eksperimentPrekinitve so notranji mehanizem, s katerim mikrokrmilniki v realnem času obdelujejo notranje ali zunanje dogodke. Ko pride do notranjega ali zunanjega dogodka, sistem prekinitev mikrokrmilnika prisili procesor, da začasno ustavi izvajanje programa in namesto tega obdela dogodek prekinitve. Prekinitve so razdeljene na zunanje in notranje prekinitve, CC2430 pa vsebuje skupno 18 virov prekinitev (za specifične opise in definicije vektorjev prekinitev glejte "CC2430 Kitajski priročnik》)。 Zdaj si poglejmo shemo vezja te razvojne plošče:
Gumb S1 je bil povezan s P0.1 na razvojni plošči, učinek tega eksperimenta pa je sprožil prekinitev P0.1 preko gumba S1 in nato nadzoroval vklop/izklop LED1 v podprogramu storitve prekinitev. (2) Eksperimentalni princip in diagram potekaEksperimentalni diagram poteka je naslednji:
(3) Eksperimentalna izvorna koda//头文件
#include
//延时子函数
#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3
prazninaZakasnitev(nepodpisanon)
{
nepodpisanott;
za(tt =0; tt<n; tt++);
za(tt =0; tt<n; tt++);
za(tt =0; tt<n; tt++);
za(tt =0; tt<n; tt++);
za(tt =0; tt<n; tt++);
}
//32M晶振初始化
prazninaxtal_init(praznina)
{ SPANJE &= ~0x04; //都上电
medtem ko(! (SPANJE &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Izberite 32MHz kristalni oscilator SPANJE |=0x04;
}
//LED灯初始化
prazninaled_init(praznina)
{ P1SEL =0x00; P1 je običajen vhodno-izhodni priključek P1DIR |=0x0F; izhod P1.0 P1.1 P1.2 P1.3
led1 = 0; led2 = 0; led3 = 0; led4 = 0;
}
//io及外部中断初始化
prazninaio_init(praznina)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
prazninamain(praznina)
{ xtal_init(); led_init(); io_init();
medtem ko(1); //等待中断
}
//中断服务子程序
#pragma vektor = P0INT_VECTOR
__interrupt prazninaP0_ISR(praznina)
{ EA =0; Vrata so prekinjena
Zakasnitev(10000); Zakasnitev(10000); Zakasnitev(10000); Zakasnitev(10000); Zakasnitev(10000);
če((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Najprej inicializirajte sistemski takt: izberite 32MHz kristalni oscilator. Nato inicializiraj LED: nastavi P1 kot splošni I/O priključek, nastavi smer P1.0 ~ P1.3 kot izhod in nato ugasni 4 LED lučke. Nato konfigurirajte ustrezne SFR registre za zunanje prekinitve, da omogočite prekinitve na vseh ravneh, vključno s 3 SFR-ji:EA、IEN1、PICTL(Za podrobnosti o vsakem SFR glejteCC2430 Kitajski priročnik》): EA- Popolno omogočanje prekinitve; IEN1.5- P0 omogoča prekinitev; SLIKA.3—— P0.1 omogoča prekinitev vrat; SLIKA 0—— Nastavi vhodni rob P0.1 priključka za sprožitev prekinitve. Nato uporabite while(1) v glavni funkciji in počakajte na prekinitev. Nasveti za CC2430(1) Povzetek sintakse dodelitve bitov Velikokrat moramo dodeliti bit (0 ali 1) enemu bajtu SFR, da natančno nadzorujemo strojno napravo. Obstaja SFRNaslavljanje podpornih bitovNa primer, TCON, P0 itd., trenutno je dodeljevanje protitočk zelo preprosto, samo poizvedite po definiciji bita v razdelku SFR Bit Access v datoteki glave ioCC2430.h: P0_0 = 0; // dodeli 0 prvi števki P0 P0_0 = 1; // dodelimo vrednost 1 prvi števki P0
A nekaterih SFR-jev niBitno naslavljanje ni podprto, kot v tem eksperimentuPICTL, v tem trenutku želite enemu od njih dodeliti vrednost, sintaksa je naslednja: PIKTL &= ~0x01; Prvi številki dodelimo vrednost 0 PICTL |= 0x01; Prvo števko dodelimo vrednost 1
Lahko se spomniš&= ~,|=Ti dve pogosto uporabljeni sintaksi dodeljevanja bitov. (2) Povzetek omogočanja prekinitve Ko je v programu vključena prekinitev, jo je treba omogočiti, preden se prekinitev sproži. Hierarhija sistema za omogočanje prekinitev C51 je zelo očitna: Interrupt Boss: EAje šef, odgovorenSplošnoOmogočite prekinitev: EA = 1;
Vsak prekinjen vodja skupine: Naslednje je za vsakegaFunkcionalni deli(kot so P0, časovnik 1 itd.), so takšni SFR-ji običajno bitno naslovljivi, ime pa običajno vsebuje IE (Interrupt Enable): P0IE = 1;
Vsak član ekipe je bil prekinjen: Ekipa Ker pa vsaka funkcija vsebuje tudi več prekinitev, je zadnja stopnja namenjena temuVsaka prekinitevTa vrsta SFR je običajno brez bitov in nenaslovljiva ter običajno vsebuje IE (Interrupt Enable) ali IM (Interrupt Mask) v imenu: PICTL |=0x01;
Ni potrebe po ponavljanju prekinitev SFR, samo razumite njegovo hierarhijo in si vzemite čas za iskanje ročne ali glavne datoteke. (3) Prekinitev pisanja programov Uporaba prekinitev v programu običajno vključuje dva dela: pisanje podprograma za storitev prekinitev in začetek omogočanja prekinitve. Funkcija prekinitve je bila uvedena zgoraj, spodaj pa je kratek uvod v pisanje podprograma storitve prekinitve: Najprej določitePrelomni vektor, ki ga je mogoče poizvedovati v razdelku Interrupt Vectors v datoteki glave ioCC2430.h z naslednjo sintakso: #pragma vektor = vektor prekinitve
Nato takoj zatem zapišemo obdelovalnik prekinitve, ki je strukturiran takole: __interrupt ime funkcije praznine (praznina) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. ZaključekTa članek predstavlja metodo implementacije preprostih zunanjih prekinitev, ki temeljijo na CC2430, in po osnovi prekinitev bomo predstavili še en zelo pomemben modul – časovnike. CC2430 ima skupaj 4 časovnike, ki jih lahko razdelimo v tri kategorije: časovnik 1, časovnik 2, časovnik 3/4 (3 in 4 sta v bistvu enaka uporaba). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|