| I. Edellisestä seuraavaan jatkaminen Edellisellä luennolla tutustuimme CC2430-ohjelmien kehittämisen perusprosessiin IAR:ssä pienen kokeilun avulla, jossa oli yksinkertaisin LEDin vilkkuminen. Veitsi on ainakin teroitettu (vaikken olekaan kovin hyvä tässä teroituskivessä), ja nyt on aika alkaa teurastamaan bugeja :). Seuraavaksi opetellaan muutama perus CC2430-kokeilu. Jokainen pieni kokeiluja, jaettu "kokeellinen johdanto", "ohjelman vuokaavio", "kokeellinen lähdekoodi ja analyysi" kolme osaa kuvauksen. Tässä artikkelissa selitetään ulkoinen keskeytys. Toiseksi, ulkoinen keskeytys(1) Johdanto kokeeseen Keskeytys on reaaliaikainen mikrokontrolleri sisäisten tai ulkoisten tapahtumien käsittelemiseksi, sisäinen mekanismi. Kun jonkinlainen sisäinen tai ulkoinen tapahtuma tapahtuu, mikrokontrollerin keskeytysjärjestelmä pakottaa suorittimen keskeyttämään suoritettavan ohjelman, mutta mennä keskeytystapahtuman käsittelyyn, keskeytyskäsittely on valmis ja palaa sitten ohjelman keskeyttämiseen, jatka suorittamista. Keskeytykset on jaettu ulkoisiin keskeytyksiin ja sisäisiin keskeytyksiin, CC2430 sisältää yhteensä 18 keskeytyslähdettä (erityinen keskeytyskuvaus ja keskeytysvektorin määritelmä, voit tutustua " CC2430 Kiinan käsikirjaan "). Katsotaanpa nyt tämän kehityslevyn piirikaaviota:
Kehityslevy on kytketty S1-painikkeeseen ja P0.1, vaikutus, jonka tämä kokeilu haluaa saavuttaa, on laukaista P0.1: n keskeytys painamalla näppäintä S1 ja sitten ohjata LED1-valoa / sammutusta keskeytyspalvelun aliohjelmassa. (2) Kokeellinen periaate ja vuokaavio Kokeen vuokaavio on seuraava:
c
(3) Kokeellinen lähdekoodi// otsikkotiedosto#include // delay-alatoiminto#define led1 P1_0#define led2 P1_1#define led3 P1_2#define led4 P1_3void Delay( unsigned n) { & & &
nbsp; unsigned tt;for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); &
nbsp; for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); }//32M kiteen alustaminenvoid xtal_init( void ) { SLEEP &=~0x04; & nbsp; //kaikki virrat päällewhile (! (SLEEP & 0x40 )); //kideoskillaattori päällä ja vakaa CLKCON &=~0x47; &
nbsp; //Valitaan 32 MHz:n kideoskillaattori SLEEP |=0x04; }//LED:n alustaminenvoid led_init( void ) { P1SEL =0x00;  
; //P1 on normaali I/O-portti P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Lähtö.
led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//io ja ulkoisen keskeytyksen alustaminenvoid io_init( void ) { P0INP &=~0X02;
/ /P0.1:ssä on pull-up ja pull-down EA =1; //Kokonaan keskeytyksen aktivointi P0IE =1; &
nbsp; //P0 keskeytyksen aktivointi PICTL |=0X09; //P0.1 portin keskeytyksen aktivointi, laskevan reunan laukaisu P0IFG &=~0x02
; //P0.1 interrupt flag clear 0 };//main functionvoid main( void ) { xtal_init(); led_init();
io_init();while ( 1 ); //odota keskeytystä }//keskeytyspalvelun aliohjelma#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;
/ / keskeytyksen sammuttaminen Viive
( 10000 ); Delay(10000 ); Delay(10000 ); Delay(10000); Delay(10000 ); &
nbsp; if ((P0IFG & 0x02 ) >0 ) //näppäinkeskeytys { P0IFG &=~0x02; &
nbsp; //P0.1 keskeytyslippu tyhjä 0 led1 = !led1; } P0IF =0; &
nbsp; //P0 keskeytyslippu tyhjä 0 EA =1; & nbsp; // kytke keskeytys päälle } Alusta ensin Unity Clock: valitse 32 MHz:n kideoskillaattori. Alusta sitten LEDit: aseta P1 yleiskäyttöiseksi I/O-portiksi, aseta P1.0 ~ P1.3 suunta ulostuloksi ja sammuta sitten 4 LEDiä. Määritä sitten asiaankuuluvat SFR-rekisterit ulkoisia keskeytyksiä varten ja kytke keskeytyksen aktivointi päälle kaikilla tasoilla, joihin kuuluu 3 SFR-rekisteriä: EA, IEN1, PICTL (kunkin SFR-rekisterin yksityiskohtainen kuvaus on " CC2430 Chinese Manual " -julkaisussa): EA -- keskeytyksen kokonaisaktivointi; IEN1.5 -- P0-keskeytyksen aktivointi; PICTL.3 -- P0.1-portin keskeytyksen aktivointi; PICTL.0 -- asettaa P0.1 portin tulon laskevan reunan aiheuttamaan keskeytyslaukaisun. Odota keskeytystä while(1):n avulla pääfunktiossa. CC2430-vihjeitä(1) Bittimäärityksen syntaksi Yhteenveto Hyvin usein meidän on annettava arvo (0 tai 1) yhden tavun SFR:ssä olevalle bitille, jotta voimme tarkasti ohjata laitteistolaitetta. J otkut SFR:t tukevat bittiosoitteita, kuten TCON, P0 jne., Tällä hetkellä bitin osoittaminen on hyvin yksinkertaista, kysy vain ioCC2430.h-otsikkotiedoston SFR Bit Access -osassa bitin määritelmä voi olla: P0_0 = 0; // P0 ensimmäinen bitti arvon 0 osoittamisesta P0_0 = 1; / / / / P0 ensimmäinen bitti arvon 1 osoittamisesta On kuitenkin olemassa SFR:iä, jotka eivät tue bittiosoitteita, kuten esim . Jotkut SFR:t eivät kuitenkaan tue bittiosoitteistusta, kuten tässä kokeessa PICTL, kun haluat antaa arvon jollekin niistä, syntaksi on seuraava: PICTL &= ~0x01; //antaa arvoksi 0 ensimmäiselle bitille PICTL |= 0x01; //antaa arvoksi 1 ensimmäiselle bitille Voit muistaa, että & amp;= ~, |= ~, |= ~, |= ~, |= P0_0 = 1; //antaa arvoksi 1 P0:n ensimmäiselle bitille . amp;= ~, |= nämä kaksi yleistä bittimäärityssyntaksia. (2) Keskeytyksen aktivointi Yhteenveto Kun keskeytys on mukana ohjelmassa, se on aktivoitava ennen keskeytyksen laukeamista. C 51-keskeytyksen mahdollistava järjestelmä, sen hierarkkinen rakenne on hyvin ilmeinen: keskeytyspomo: EA on pomo, joka on vastuussa koko keskeytyksen mahdollistamisesta: EA = 1; keskeytys irrotus kapteeni: seuraava on kunkin toiminnallisen komponentin (kuten P0, ajastin 1 jne.) mahdollistava ohjaus, kuten SFR yleensä bittiosoitteellinen, nimeäminen sisältää yleensä IE (Interrupt Enable): P0IE = 1; keskeytysryhmän jäsenet: irrotus, mutta ohjelmankeskeytyksen vuoksi keskeytys on otettava käyttöön ennen keskeytyksen laukaisemista.
k ukin keskeytysryhmän jäsenet: tiimi, mutta koska jokainen toiminnallinen komponentti sisältää myös useita keskeytyksiä, joten viimeinen taso on kunkin keskeytyksen käyttöönoton ohjausta varten, tällainen SFR ei yleensä ole bittiosoitteistettavissa, nimitys sisältää yleensä IE (Interrupt Enable) tai IM (Interrupt Mask): PICTL | = 0x01; ei tarvitse tallentaa keskeytys-SFR:iä muistiin. Keskeytys-SFR:iä ei tarvitse tallentaa muistiin, kunhan ymmärrät niiden hierarkian ja katsot sitten käsikirjaa tai otsikkotiedostoja, kun käytät niitä. (3) Keskeytysohjelmien kirjoittaminen Keskeytysten käyttö ohjelmassa koostuu yleensä kahdesta osasta: keskeytyspalvelualiohjelman kirjoittamisesta ja keskeytyksen aktivoinnin avaamisesta. K eskeytyksen mahdollistaminen on esitelty edellä, seuraavassa on lyhyt johdanto keskeytyspalvelun aliohjelman valmisteluun: Määritä ensin keskeytysvektori, voi olla ioCC2430.h-otsikkotiedostossa kyselyn Interrupt Vectors -osassa, syntaksi on seuraava: # pragma vector = Interrupt Vectors ja sitten seuraa keskeytyksen käsittelijän valmistelu, rakenne on seuraava: ___ keskeytys void Function Name (___)
i nterrupt void function name(void) { //on interrupt //interrupt handling //interrupt flag clear 0 //off interrupt } III. Johtopäätös Tässä artikkelissa esitellään yksinkertainen ulkoisen keskeytyksen toteutusmenetelmä, joka perustuu CC2430: een, keskeytyksen perusteella, sitten esittelemme toisen erittäin tärkeän moduulin - ajastimen. CC2430: ssä on yhteensä neljä ajastinta, jotka voidaan jakaa kolmeen luokkaan: ajastin 1, ajastin 2, ajastin 3/4 (3 ja 4 saman perusosan käytöstä). sama). </n;tt++). </n;tt++);. </n;tt++). </n;tt++); </n;tt++); </n;tt++); </n;tt++). </n;tt++). |