|
1. Ylä- ja alakerrosten yhdistäminen Edellisellä luennolla tutustuimme IAR:n CC2430-ohjelman perusprosessiin yksinkertaisen LED-vilkkumiskokeen avulla. Veitsi on joka tapauksessa teroitettu (vaikka hiomakiveni ei ole hyvä), ja nyt aloitan hyönteisten teurastuksen :). Seuraavaksi opitaan muutama peruskoe CC2430:sta. Jokainen pieni koe on jaettu kolmeen osaan: "Kokeen johdanto", "Ohjelman kaavio" ja "Kokeellinen lähdekoodi ja analyysi". Tämä artikkeli selittää ulkoisia keskeytyksiä. 2. Ulkoinen keskeytys(1) Johdanto kokeeseenKeskeytykset ovat sisäinen mekanismi, jonka avulla mikrokontrollerit käsittelevät sisäisiä tai ulkoisia tapahtumia reaaliajassa. Kun sisäinen tai ulkoinen tapahtuma tapahtuu, mikrokontrollerin keskeytysjärjestelmä pakottaa suorittimen pysäyttämään suoritusohjelman ja käsittelemään keskeytystapahtuman. Keskeytykset jaetaan ulkoisiin ja sisäisiin keskeytyksiin, ja CC2430 sisältää yhteensä 18 keskeytyslähdettä (tarkat keskeytyskuvaukset ja määritelmät keskeytysvektoreista katso "CC2430 Kiinan käsikirja》)。 Katsotaanpa nyt tämän kehityskortin piirikaaviota:
S1-painike on yhdistetty kehityskortin P0.1:een, ja tämän kokeen seurauksena se laukaisee P0.1:n keskeytyksen S1-painikkeen kautta ja ohjaa LED1:n päälle/pois -toimintoa keskeytyspalvelualaohjelmassa. (2) Kokeellinen periaate ja vuokaavioKokeellinen kaavio on seuraava:
(3) Kokeellinen lähdekoodi//头文件
#include
//延时子函数
#defineled1 P1_0
#defineLED2 P1_1
#defineled3 P1_2
#defineled4 P1_3
voidViive(Allekirjoittamatonn)
{
Allekirjoittamatontt;
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晶振初始化
voidxtal_init(void)
{ UNI &= ~0x04; //都上电
kun(! (UNI &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Valitse 32MHz:n kideoskillaattori UNI |=0x04;
}
//LED灯初始化
voidled_init(void)
{ P1SEL =0x00; P1 on tavallinen I/O-portti P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 ulostulo
led1 = 0; led2 = 0; led3 = 0; led4 = 0;
}
//io及外部中断初始化
voidio_init(void)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
KUVA |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
voidpää(void)
{ xtal_init(); led_init(); io_init();
kun(1); //等待中断
}
//中断服务子程序
#pragma vektori = P0INT_VECTOR
__interrupt voidP0_ISR(void)
{ EA =0; Portti keskeytyy
Viive(10000); Viive(10000); Viive(10000); Viive(10000); Viive(10000);
jos((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Aloita järjestelmän kellotaajuus: valitse 32 MHz:n kideoskillaattori. Sitten käynnistä LEDit: aseta P1 yleiseksi I/O-portiksi, aseta P1.0 ~ P1.3 -suunta ulostuloksi ja sammuta sitten 4 LED-valoa. Seuraavaksi konfiguroi asianmukaiset SFR-rekisterit ulkoisille keskeytyksille siten, että keskeytykset sallitaan kaikilla tasoilla, mukaan lukien 3 SFR:ää:EA、IEN1、PICTL(Lisätietoja jokaisesta SFR:stä löytyyCC2430 Kiinan käsikirja》): EA- Total interrupt enable; IEN1.5- P0-keskeytyksen mahdollistaminen; PICTL.3—— P0.1 porttikeskeytys aktivoitu; PICTL.0—— Aseta P0.1-portin sisääntulon pudotusreuna aiheuttamaan keskeytyksen laukaisun. Sitten käytä while(1) pääfunktiossa ja odota keskeytystä. CC2430-vinkit(1) Bittijakosyntaksin yhteenveto Monesti meidän täytyy määrittää bitti (0 tai 1) yhdelle SFR-tavulle, jotta laitteistoa voidaan hallita tarkasti. On SFRTukibittien osoitusEsimerkiksi TCON, P0 jne., tällä hetkellä vastapisteiden määrittäminen on hyvin yksinkertaista, kysy vain bittimääritelmä SFR Bit Access -osiosta ioCC2430.h-otsikkotiedostosta: P0_0 = 0; // määritetään 0 P0:n ensimmäiselle numerolle P0_0 = 1; // anna arvoksi 1 P0:n ensimmäiselle numerolle
Mutta jotkut SFR:t puuttuvatBittiosoitus ei ole tuettu, kuten tässä kokeessaPICTL, tässä vaiheessa haluat antaa arvon yhdelle niistä, syntaksi on seuraava: PICTL &= ~0x01; Anna ensimmäiselle numerolle arvo 0 PICTL |= 0x01; Anna ensimmäiselle numerolle arvo 1
Voit muistaa&= ~,|=Nämä kaksi yleisesti käytettyä bittimäärittelysyntaksia. (2) Keskeytyksen mahdollistamisen yhteenveto Kun ohjelmassa on keskeytys, se on otettava käyttöön ennen keskeytyksen käynnistymistä. C51-keskeytyksen käyttöjärjestelmän hierarkia on hyvin ilmeinen: Keskeytyspomo: EAon pomo, vastuullinenYleisetKeskeytyksen käyttöönotto: EA = 1;
Jokainen keskeytetty joukkueenjohtaja: Seuraava on jokaiselleToiminnalliset osat(kuten P0, ajastin 1 jne.), tällaiset SFR:t ovat yleensä bittiosoitettavia, ja nimi sisältää yleensä IE:n (Interrupt Enable): P0IE = 1;
Jokainen tiimin jäsen keskeytettiin: Joukkue Mutta koska jokaisessa ominaisuudessa on myös useita keskeytyksiä, viimeinen taso on tätä vartenJokainen keskeytysTämä SFR-tyyppi on yleensä bititön ja osoitekelvoton, ja sen nimessä on yleensä IE (Interrupt Enable) tai IM (Interrupt Mask): PICTL |=0x01;
Ei tarvitse keskeyttää SFR:ää, vaan ymmärrä sen hierarkia ja käytä aikaa ohjekirjan tai otsikkotiedoston etsimiseen. (3) Keskeyttää ohjelmien kirjoittaminen Keskeytysten käyttö ohjelmassa koostuu yleensä kahdesta osasta: keskeytyspalvelun aliohjelman kirjoittamisesta ja keskeytyksen käyttöönoton avaamisesta. Keskeytysfunktio on esitelty yllä, ja seuraavassa on lyhyt johdanto keskeytyspalvelun aliohjelman kirjoittamiseen: Määrittele ensinMurtovektori, jota voidaan hakea ioCC2430.h-otsikkotiedoston Keskeytysvektorit -osiossa seuraavalla syntaksilla: #pragma vektori = keskeytysvektori
Kirjoita sitten keskeytyskäsittelijä heti perään, joka on rakennettu seuraavasti: __interrupt void-funktion nimi (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. JohtopäätösTässä artikkelissa esitellään yksinkertaisten ulkoisten keskeytysten toteutusmenetelmä, joka perustuu CC2430:een, ja keskeytysten perustan jälkeen esittelemme toisen erittäin tärkeän moduulin – ajastimet. CC2430:ssa on yhteensä 4 ajastinta, jotka voidaan jakaa kolmeen kategoriaan: ajastin 1, ajastin 2, ajastin 3/4 (3 ja 4 ovat käytännössä sama käyttötarkoitus). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|