|
1. A felső és alsó szintek összekapcsolása Ebben a cikkben a CC2430 alvási funkcióját és ébresztési módszerét tárgyaljuk. A tényleges használat során a CC2430 csomópontot általában akkumulátorokkal táplálják, így az energiafogyasztás szabályozása kulcsfontosságú. Az alábbiakban egy részlet található a CC2430 kínai kézikönyvéből, amely a CC2430 4 energiafogyasztási módjának bevezetéséhez szolgált:
Ahogy a fenti táblázatból is látható, a CC2430-nak összesen 4 teljesítménymódja van:PM0(teljesen ébren),PM1(kissé álmos),PM2(félig ébren, félig alvás),PM3(Nagyon mélyen alszik). Minél hátrébb haladunk, annál több funkció van kikapcsolva, és az energiafogyasztás egyre alacsonyabb. A konverziós kapcsolat közöttük a következő:
putPM1、PM2ÉbresztőPM0, három módja van: reset (reset rendszer) külső megszakítás, alvási időzítő megszakítása; De teddPM3ÉbresztőPM0, csak két módja van: reset és külső megszakítás (mert inPM3Minden oszcillátor leállt, és persze az alvásidőzítő ki volt kapcsolva~) Nézzünk egy kis kísérletet, hogy bemutassuk az alvó módba való belépést és hogyan ébredj felPM0állam. 2. Rendszerezett alvás és megszakított ébredési kísérletek(1) Bevezetés a kísérlethezRendszer inicializálása, inPM0
→ belépniPM1
→ Ébredj az alvásidőzítőnél 1 másodperc utánPM0
→ belépniPM2
→ 2 másodperc után az alvási időzítő ébresztette felPM0
→ belépniPM3
→ Várd meg, amíg az S1 gomb megnyomódik, ami külső megszakítást indít el és felébredjPM0
(2) Programáram
(Megjegyzés: A fenti képen látható lekerekített doboz a rendszer állapotát jelzi)
(3) Kísérleti forráskód és elemzés (A következő dobozokra kattintható~)Fejlécfájl és makrodefiníció[url=]
[/url]
/* Kísérleti leírás: Megszakított ébredési alvás kísérlet, amely három alvási módban vezeti be az ébrenlétet
*/
#include #define LED_ON 0 #define LED_OFF 1#defineled1 P1_0
#defineled2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3 [url=] [/url]
Alfunkciók[url=] [/url]
/*Rendszeróra inicializálása -------------------------------------------------------*/
Semmixtal_init(Semmi)
{ ALVÁS &= ~0x04; //Mindegyik motoros
miközben(! (ALVÁS &0x40)); //A kristályoszcillátor bekapcsolva és stabil
CLKCON &= ~0x47; //Válassz egy 32 MHz-es kristályoscillátort
ALVÁS |=0x04;
}
/*LED inicializáció -------------------------------------------------------*/
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 = LED_OFF; //Kapcsold ki az összes LED-et
led2 = LED_OFF; led3 = LED_OFF; led4 = LED_OFF;
}
/*Külső megszakítás inicializálása -------------------------------------------------------*/
Semmiio_init(Semmi)
{ P0INP &= ~0X02; //A P0.1-ben van húzódás és lehúzás
EA =1; //Teljes megszakítás engedélyezett
IEN1 |= 0X20; //P0IE = 1, P0 megszakítások engedélyezve vannak
PICTL |= 0X09; //A P0.1 lehetővé teszi a megszakításokat, a ledobott él triggereket
P0IFG &= ~0x02; //P0.1 Megszakítás jel clear0
}
/*Alvás időzítő megszakítás inicializálása -------------------------------------------------------*/
SemmisleepTimer_init(Semmi)
{ STIF=0; //Az alvási időzítő megszakítási jel tiszta 0
STIE=1; //Kapcsold be az alvási időzítőt megszakítva
EA=1; //Nyisd ki a teljes megszakítást
}
/*Állítsd be az alvási időzítő ütemezett intervallumát -------------------------------------------------------*/
SemmisetSleepTimer(nem aláírtintsec)
{ Aláírás nélkülhosszúsleepTimer =0;
sleepTimer |= ST0; //Szerezd meg az aktuális alvási időzítő számértékét
sleepTimer |= (nem aláírthosszú)ST1 <<8; sleepTimer |= (nem aláírthosszú)ST2 <<16;
sleepTimer += ((nem aláírthosszú)sec * (aláíratlanulhosszú)32768); //Plusz a szükséges időzítési idő
ST2 = (nem aláírtchar)(sleepTimer >>16); //Állítsd be az alvásidőzítő összehasonlítási értékét
ST1 = (nem aláírtchar)(sleepTimer >>8); ST0 = (aláíratlanchar)sleepTimer;
}
/*Válaszd ki az Erő Módot -------------------------------------------------------*/
SemmiPowerMode(nem aláírtcharmód)
{
ha(mód <4) { ALVÁS &=0xfc; //Töröld a SLEEP.MODE 0-ra
ALVÁS |= mód; //Válaszd ki az Erő Módot
PCON |=0x01; //Kapcsold be ezt a teljesítmény módot
}
}
/*Késleltetési függvény -------------------------------------------------------*/
SemmiKésleltetés(alárendellenintn)
{ Aláírás nélkülinti,j;
for(i=0; i<n; i++)
for(j=0; j <1000; j++);
}
[url=] [/url]
Fő funkció[url=] [/url]
/*Fő funkció -------------------------------------------------------*/
Semmimain(Semmi)
{ xtal_init(); led_init();
//PM0 állapot, lámpa ég és késleltetés
led1 = LED_ON; //A fényerő LED1 azt jelzi, hogy a rendszer PM0 módban működik
Késés(10);
//PM1 állapot, lámpák kikapcsolva
setSleepTimer(1); //Állítsd be az alvási időkorlátot 1s-re
sleepTimer_init(); //Kapcsold be az alvási időzítőt megszakítva
led1 = LED_OFF; PowerMode(1); //Állítsd be a teljesítmény módot PM1-re
//1 másodperc után a PM1 belép PM0-ba, felvillar és késlekedik
led1 = LED_ON; Késés(50);
//PM2, lekapcsolva a lámpák
setSleepTimer(2); //Állítsd be az alvási időkorlátot 2 másodpercre
led1 = LED_OFF; PowerMode(2); //Állítsd be a teljesítmény módot PM2-re
//2 másodperc után a PM2 belép PM0-ba, felvillar és késik
led1=0; Késés(50);
//PM3, világítás le
io_init(); //Külső megszakítások inicializálása
led1 = LED_OFF; PowerMode(3); //Állítsd be a teljesítménymódot PM3-ra
//Amikor külső megszakítás történik, a PM3 belép a PM0-ba és felvillan
led1 = LED_ON;
miközben(1);
}
[url=] [/url]
Megszakítási szolgáltatási eljárások[url=] [/url]
/*Külső megszakítási szolgáltatási program -------------------------------------------------------*/
#pragmavektor = P0INT_VECTOR __interruptSemmiP0_ISR(Semmi)
{ EA =0; //A kapu megszakítva van
Késés(50);
ha((P0IFG &0x02) >0) //A billentyűk megszakítva vannak
{ P0IFG &= ~0x02; //P0.1 Megszakítás jel clear0
} P0IF =0; //P0 megszakítás jel clear0
EA =1; //Nyílt megszakítás
}
/*Az alvási időzítő megszakítja a szolgáltatási programokat -------------------------------------------------------*/
#pragmavektor= ST_VECTOR __interruptSemmisleepTimer_IRQ(Semmi)
{ EA=0; //A kapu megszakítva van
STIF=0; //Az alvási időzítő megszakítási jel tiszta 0
EA=1; //Nyílt megszakítás
}
[url=] [/url]
Hogyan lehet használni az alvási időzítőt a rendszer felébresztéséhez, az alábbiakban összefoglalható:Nyisd ki az alvási időzítő megszakítást, → állítsd be az alvási időmérő időzítő intervallumát → beállítsuk az áramellátási módot (Megjegyzés: "Állítsd be az alvási időzítő intervallum" lépést a "Teljesítmény mód beállítása" előtt kell lennie, mert a rendszer nem folytatja a program futtatását alvó állapot után is) Ezután koncentráljunk arra az alfüggvényre, amely az alvási időzítő intervallumat állítja be:setSleepTimer Először is, egy rövid bevezetés az alvásidőzítőhöz: az tovább fut32.768kHzof24. helyIdőzítő, amikor a rendszer futA PM3 mellettMinden árammódban az alvó időzítő aMegszakítás nélküli működés。 Az alvó időzítők által használt regiszterek a következők:ST0,ST1,ST2。 Az alábbiakban részletes bevezetés található a CC2430 kínai kézikönyvéből a funkcióihoz:
Látható, hogy funkcióik két szempontból állnak:Olvasd el,írni。 Olvasd el: Az aktuális időzítő számértékének felolvasására, az olvasási sorrendre:Olvasd el ST0-t → Olvasd az ST1-et → Olvasd el ST2-t írni: Az időzítő összehasonlítási értékének beállításához (amikor az időzítő számértéke = összehasonlítási érték, megszakítás következik), az írási sorrendnek a következőképpen kell következnie:ST2-t írj → ST1-et → ST0-t írj Rendben, magyarázzuk el a forráskóddal együtt: (1) Először definiáljunk egy alárendellen hosszú változót (32 bites) sleepTimer-t, amely megkapja az alvó időzítő aktuális számértékét: Aláírás nélkülhosszúsleepTimer =0;
sleepTimer |= ST0; //Szerezd meg az aktuális alvási időzítő számértékét
sleepTimer |= (nem aláírthosszú)ST1 <<8; sleepTimer |= (nem aláírthosszú)ST2 <<16;
(2) Ezután adjuk össze a szükséges időintervallumot: sleepTimer += ((nem aláírthosszú)sec * (aláíratlanulhosszú)32768); //Plusz a szükséges időzítési idő
Íme egy kis magyarázat: Miért az 1-esek jelentik a 32768-at? Mivel az időzítő 32,768 kHz alatt működik, minden hozzáadott időzítő 1/32768 másodpercre van szükség; Add hozzá a 32768-at, és szükséged lesz 1-esekre; (3) Végül a sleepTimer értékét használják az időzítő összehasonlító értékeként: ST2 = (nem aláírtchar)(sleepTimer >>16); //Állítsd be az alvásidőzítő összehasonlítási értékét
ST1 = (nem aláírtchar)(sleepTimer >>8); ST0 = (aláíratlanchar)sleepTimer;
Így sikeresen beállíthatod az időzítő időzítését~ (Megjegyzés: A forráskód többi részével úgy gondolom, hogy részletes jegyzetekkel együtt könnyen megérthető, és itt nem ismétlem meg.) (4) Kísérleti eredményekProgramot futtatva, LED1 megfigyelésével a jelenség a következő:A LED1 villog (azaz egyszer be- > kikapcsol), 1 másodperc után újra villog, 2 másodperc után újra villog, majd kikapcsolva marad, majd megnyomja az S1-et, a LED1 felgyullad. A kísérleti jelenség teljesen összhangban van a várakozással, Over~
3. KövetkeztetésÓ~ Két nap szabadidőm után végre megkaptam ezt a naplót. Nagyon rájöttem, hogy blog írása, különösen egy "olvasóbarát" blogbejegyzés írása valóban fizikai feladat: szigorúság, esztétika, logika... Minden a megfontoláson múlik. Minden alkalommal, amikor feltöltöm a kódot, túl hosszúnak érzem, de vonakodom használni a blog kerthez tartozó hajtogató eszközt. Ezért ebben a blogbejegyzésben a szerző óvatosan hozzáadott néhány JQuery elemet, hogy sima hajtogatást érjen el a kódban, és még mindig van egy kis sikerélmény, hehe (JQuery újonc, ne nevess a mesteren~). De nem tudom, hogy ez valóban javítja-e a cikk olvashatóságát, és olvasók, barátok szívesen hozzászólhatnak :) Ebben a hónapban a szerző igazán úgy döntött, hogy gyökeret veli a blogkertben, így sok szabadidőmet töltöttem blogbejegyzések írásával. Amikor először írtam blogot, bár kevés hozzászólás volt, a legtöbb napló több mint 500 kattintással rendelkezett, ami egy kis bátorítás volt számomra! Bátorság kell mikrokontrollerekről írt tartalmat publikálni a blogkertben, de kitartok mellette~ A kilenc blogbejegyzés a kezdetektől napjainkig a CC2430 chip alapvető hardvermoduljainak használatára fókuszál. Eddig gyakorlatilag átnéztük a CC2430 legtöbb perifériáját, de még mindig vannak olyan dolgok, mint a Flash hozzáférés, véletlenszámgenerátor, AES koprocesszor, RF kommunikáció stb., amikről még nem beszéltünk. Azonban a Zigbee út még nem ért véget, és a szerző szelektíven kívánja kitölteni ezeket a hiányosságokat a következő témában (a Z-Stack protokoll megvalósítása). A következő blogbejegyzésben tervezem befejezni Zigbee első útját egy kicsit átfogóbb és hosszabb kísérlettel – a "hőmérséklet-megfigyelő rendszerrel", és elmagyarázom, hogyan lehet átfogóan alkalmazni a korábban megtanult tudáspontokat. Valójában nem alkalmas arra, hogy ""MagyarázatKezdőként a szerző csak abban reménykedik, hogy bátorítsa egymást, és együtt haladhasson előre a doktori cím megírásában! </n; i++)
|