|
1. A felső és alsó szintek összekapcsolása Az előző előadáson megismerkedtünk az IAR CC2430 program fejlesztésének alapvető folyamatával egy egyszerű LED villogó kísérlet révén. A kést úgyis élesítették (bár a fenyőkövem nem jó), és most elkezdem :) rovarokat vágni. Ezután tanuljunk meg néhány alapvető kísérletet a CC2430-ról. Minden kis kísérlet három részre oszlik: "Kísérlet bevezetése", "Program folyamatábra" és "Kísérleti forráskód és elemzés". Ez a cikk a külső megszakításokat magyarázza. 2. Külső megszakítás(1) Bevezetés a kísérlethezA megszakítások belső mechanizmusok, amelyek a mikrokontrollerek valós időben feldolgozására szolgálnak belső vagy külső eseményeket. Amikor belső vagy külső esemény történik, a mikrokontroller megszakítási rendszere arra kényszeríti a CPU-t, hogy állítsa le a végrehajtó programot, és ehelyett feldolgozza a megszakítási eseményt. A megszakítások külső és belső megszakításokra vannak osztva, és a CC2430 összesen 18 megszakítási forrást tartalmaz (a megszakításvektorok konkrét leírásaiért és definícióiért kérjük, lásd a "CC2430 kínai kézikönyv》)。 Most nézzük meg ennek a fejlesztő lapnak az áramköri rajzát:
Az S1 gombot csatlakoztatták a fejlesztő panel P0.1-éhez, és ennek a kísérletnek az eredménye, hogy a P0.1 megszakítását az S1 gombon keresztül aktiválja, majd a megszakítási szolgáltatás alprogramban a LED1 be- és kikapcsolását irányítja. (2) Kísérleti elv és folyamatábraA kísérleti folyamatábra a következő:
(3) Kísérleti forráskód//头文件
#include
//延时子函数
#defineled1 P1_0
#defineled2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3
SemmiKésés(Aláírás nélküln)
{
Aláírás nélkültt;
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晶振初始化
Semmixtal_init(Semmi)
{ ALVÁS &= ~0x04; //都上电
miközben(! (ALVÁS &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Válassz egy 32 MHz-es kristályoscillátort ALVÁS |=0x04;
}
//LED灯初始化
Semmiled_init(Semmi)
{ P1SEL =0x00; A P1 a normál I/O port P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 kimenet
led1 = 0; led2 = 0; led3 = 0; led4 = 0;
}
//io及外部中断初始化
Semmiio_init(Semmi)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
Semmimain(Semmi)
{ xtal_init(); led_init(); io_init();
miközben(1); //等待中断
}
//中断服务子程序
#pragma vektor = P0INT_VECTOR
__interrupt SemmiP0_ISR(Semmi)
{ EA =0; A kapu megszakítva van
Késés(10000); Késés(10000); Késés(10000); Késés(10000); Késés(10000);
ha((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Először inicializáld a rendszer órajelét: válassz egy 32 MHz-es kristályoszcillátort. Ezután inicializáld a LED-eket: állítsd be a P1-et általános I/O portnak, állítsd be a P1.0 ~ P1.3 irányt kimenetként, majd kapcsold le a 4 LED lámpát. Ezután konfiguráljuk a külső megszakítások megfelelő SFR regisztereit, hogy minden szinten engedélyezzék a megszakításokat, három SFR-t érintve:EA、IEN1、PICTL(Az egyes SFR-ek részleteiért kérjük, lásd aCC2430 kínai kézikönyv》): EA- Teljes megszakítás engedélyezése; IEN1.5- P0 megszakítás engedélyezi; PICTL.3—— P0.1 port megszakítás engedélyezi; PICTL.0—— Állítsuk be a P0.1 port bemeneti drop élét, hogy megszakítást indítson el. Ezután használd a while(1)-et a fő funkcióban, és várd meg a megszakítást. CC2430 tippek(1) Bit-hozzárendelési szintaxisának összefoglalása Sokszor egy bitet (0 vagy 1) kell rendelnünk egyetlen bájthoz SFR-hez, hogy pontosan irányítsuk a hardvereszközt. Van SFRTámogató bitcímezésPéldául TCON, P0 stb., jelenleg az ellenpontok hozzárendelése nagyon egyszerű, csak kérdezd le a bitdefiníciót az ioCC2430.h fejlécfájl SFR Bit Access szakaszában: P0_0 = 0; // 0-t rendelünk a P0 első számjegyéhez P0_0 = 1; // 1 értéket rendelünk a P0 első számjegyéhez
De néhány SFR-ek nincs ottA bitcímezés nem támogatott, mint ebben a kísérletbenPICTL, ekkor az egyiküknek értéket kell rendelni, a szintaxis a következő: PICTL &= ~0x01; Rendelj 0 értéket az első számjegyhez PICTL |= 0x01; Rendelj 1-es értéket az első számjegyhez
Emlékszel&= ~,|=Ez a két leggyakrabban használt bithozzárendelési szintaxis. (2) A megszakítás engedélyezésének összefoglalása Ha megszakítás van a programban, azt engedélyezni kell a megszakítás aktiválása előtt. A C51 megszakítás engedélyező rendszer hierarchiája nagyon nyilvánvaló: Megszakító főellenség: EAa főnök, felelősÁltalánosMegszakítás engedélyezése: EA = 1;
Minden megszakított szakaszvezető: A következő mindegyikhez szólFunkcionális alkatrészek(például P0, 1-es időzítő stb.), az SFR-ek általában bitcímezhetők, és a név általában tartalmazza az IE (Interrupt Enable) funkciót: P0IE = 1;
Minden csapattagot megszakítottak: Osztag De mivel minden funkcióban több megszakítás is van, az utolsó szint erre szólMinden megszakításEz a fajta SFR általában bitmentes és címezhetetlen, és általában IE (Interrupt Enable) vagy IM (Interrupt Mask) néven szerepel: PICTL |=0x01;
Nem kell automatikusan megszakítani az SFR-t, csak értsd meg a hierarchiáját, és szánj időt arra, hogy utánanézz a kézikönyvnek vagy a fejlécnek fájlnak. (3) Megszakítani a programok írását A megszakítások használata egy programban általában két részből áll: a megszakítási szolgáltatás alprogram megírásáról és a megszakítás engedélyezésének megnyitásáról. A megszakítás függvényt fentebb bemutattuk, és az alábbiakban rövid bevezetés a megszakítás szolgáltatás alprogram írásába: Először megadja a megTörésvektor, amely az ioCC2430.h fejlécfájl Megszakítási vektorok szakaszában lekérdezhető a következő szintaxissal: #pragma vektor = megszakítási vektor
Ezután azonnal írjuk meg a megszakítási kezelőt, amely a következőképpen van felépítve: __interrupt void függvény neve (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. KövetkeztetésEz a cikk bemutatja az egyszerű külső megszakítások megvalósítási módszerét a CC2430 alapján, és a megszakítások alapja után bemutatunk egy másik nagyon fontos modult – az időzítőket. A CC2430-nak összesen 4 időzítője van, amelyek három kategóriába sorolhatók: 1-es, 2-es, 3/4-es időzítő (a 3 és 4 gyakorlatilag ugyanaz a használat). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|