| I. Perėjimas nuo ankstesnio prie kito Ankstesnėje paskaitoje susipažinome su pagrindiniu CC2430 programų kūrimo IAR programoje procesu, atlikdami nedidelį eksperimentą su paprasčiausiu šviesos diodo mirksėjimu. Peilis bent jau buvo pagaląstas (nors man nelabai sekasi tas galandimo akmuo), o dabar metas pradėti mėsinėti klaidas :). Toliau išmoksime keletą pagrindinių CC2430 eksperimentų. Kiekvienas nedidelis eksperimentas, suskirstytas į "eksperimentinio įvado", "programos srauto diagramos", "eksperimentinio šaltinio kodo ir analizės" tris aprašymo dalis. Šiame straipsnyje paaiškinamas išorinis pertraukimas. Antra, išorinis pertraukimas(1) Eksperimento įvadas Pertrauka - tai realaus laiko mikrovaldiklis, skirtas vidiniams arba išoriniams įvykiams, vidiniam mechanizmui, spręsti. Įvykus kokiam nors vidiniam ar išoriniam įvykiui, mikrovaldiklio pertraukimo sistema privers procesorių pristabdyti vykdomą programą, bet pereiti prie pertraukimo įvykio apdorojimo, pertraukimo apdorojimas bus baigtas, o tada grįžti, kad būtų nutraukta programa, toliau vykdyti. Pertraukikliai skirstomi į išorinius ir vidinius pertraukiklius, CC2430 iš viso yra 18 pertraukimo šaltinių (konkretų pertraukimo aprašymą ir pertraukimo vektoriaus apibrėžtį galite rasti " CC2430 kinų vadove "). Dabar pažvelkime į šios kūrimo plokštės principinę schemą:
Plėtros plokštė buvo prijungta prie mygtuko S1 ir P0.1, efektas, kurį norima pasiekti šiuo eksperimentu, yra sukelti P0.1 pertraukimą paspaudus mygtuką S1, o tada pertraukimo aptarnavimo paprogramėje valdyti LED1 šviesą/išjungimą. (2) Eksperimento principas ir srauto diagrama Eksperimento srauto diagrama pateikta toliau:
c
(3) Eksperimentinis išeities kodas// antraštės failas#include // delay subfunkcija#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 kristalo inicializacijavoid xtal_init( void ) { SLEEP &=~0x04; & nbsp; //viso maitinimo įjungimaswhile (! (SLEEP & 0x40 )); //kristalinis osciliatorius įjungtas ir stabilus CLKCON &=~0x47; &
nbsp; /Pasirinkite 32 MHz kristalinį osciliatorių SLEEP |=0x04; }//LED inicializacijavoid led_init( void ) { P1SEL =0x00;  
; //P1 yra įprastas įvesties/išvesties prievadas P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Išvestis
led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//io ir išorinio pertraukimo inicializacijavoid io_init( void ) { P0INP &=~0X02;
/ /P0.1 turi ištraukimo ir ištraukimo funkciją EA =1; //Bendras pertraukimo įjungimas P0IE =1; &
nbsp; //P0 pertraukimo įjungimas PICTL |=0X09; //P0.1 prievado pertraukimo įjungimas, krintančio krašto trigeris P0IFG &=~0x02
; //P0.1 pertrūkio vėliava išvalyta 0 };//main functionvoid main( void ) { xtal_init(); led_init();
io_init();while ( 1); //laukia pertraukimo }//pertraukimo aptarnavimo paprogramė#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;
/ / Išjungti pertraukimo uždelsimą
( 10000 ); Delay(10000); Delay(10000 ); Delay(10000 ); Delay(10000 ); Delay(10000 ); &
nbsp; if ((P0IFG & 0x02 ) >0 ) //key interrupt { P0IFG &=~0x02; &
nbsp; //P0.1 pertraukimo vėliavėlės išvalymas 0 led1 = !led1; } P0IF =0; &
nbsp; //P0 pertraukimo vėliavėlės išvalymas 0 EA =1; & nbsp; // įjungti pertraukimą } Pirmiausia inicializuokite vieningą laikrodį: pasirinkite 32 MHz kristalinį osciliatorių. Tada inicializuokite šviesos diodus: nustatykite P1 kaip bendrosios paskirties įvesties / išvesties prievadą, nustatykite P1.0 ~ P1.3 kryptį kaip išvestį, tada išjunkite 4 šviesos diodus. Tada sukonfigūruokite atitinkamus SFR registrus išoriniams pertraukimams ir įjunkite pertraukimo įjungimą visuose lygiuose, įskaitant 3 SFR: EA, IEN1, PICTL (išsamų kiekvieno SFR aprašymą rasite " CC2430 kinų kalbos vadove "): EA -- bendras pertraukimo įjungimas; IEN1.5 -- P0 pertraukimo įjungimas; PICTL.3 -- P0.1 prievado pertraukimo įjungimas; PICTL.0 -- nustatyti, kad P0.1 prievado įvesties krintantis kraštas sukeltų pertraukos suveikimą. Tada pagrindinėje funkcijoje naudokite while(1), kad lauktumėte pertraukos. CC2430 patarimai(1) Bitų priskyrimo sintaksės santrauka Labai dažnai, norėdami tiksliai valdyti aparatinį įrenginį, turime vieno baito SFR bitui priskirti reikšmę (0 arba 1). K ai kurie SFR palaiko bitų adresavimą, pavyzdžiui, TCON, P0 ir t. t., šiuo metu bito priskyrimas yra labai paprastas, tereikia užklausti ioCC2430.h antraštinio failo SFR bitų prieigos dalies bitų apibrėžties: P0_0 = 0; // P0 pirmasis bitas, kuriam priskiriama 0 reikšmė P0_0 = 1; / / / P0 pirmasis bitas, kuriam priskiriama 1 reikšmė Tačiau yra SFR, kurie nepalaiko bitų adresavimo , pvz. Tačiau kai kurie SFR nepalaiko bitų adresavimo, pavyzdžiui, šiame eksperimente PICTL, kai norite priskirti reikšmę vienam iš jų, sintaksė yra tokia: PICTL &= ~0x01; //priskirti pirmajam bitui 0 reikšmę PICTL |= 0x01; //priskirti pirmajam bitui 1 reikšmę Galite prisiminti, kad & amp;= ~, |= ~, |= ~, |= ~, |= ~, |= P0_0 = 1; //priskirti pirmajam P0 bitui 1 reikšmę . amp;= ~, |= tai dvi įprastos bitų priskyrimo sintaksės. (2) Pertraukimo įjungimo santrauka Kai programoje dalyvauja pertraukimas, prieš sukeliant pertraukimą jis turi būti įjungtas. C 51 pertraukos įjungimo sistema, jos hierarchinė struktūra labai akivaizdi: pertraukos viršininkas: EA yra viršininkas, atsakingas už bendrą pertraukos įjungimą: EA = 1; pertraukos atskyrimo kapitonas: toliau yra kiekvieno funkcinio komponento (pvz., P0, 1 laikmačio ir t. t.) įjungimo valdymas, toks SFR paprastai adresuojamas bitu, pavadinime paprastai yra IE (pertraukos įjungimas): P0IE = 1; pertraukos komandos nariai: atskyrimas, tačiau dėl programospertraukimo pertrauką reikia įjungti prieš sukeliant pertrauką.
k iekvieno pertraukimo komandos nariai: komanda, bet kadangi kiekviename funkciniame komponente taip pat yra keletas pertraukimų, todėl paskutinis lygis skirtas kiekvieno pertraukimo įjungimo valdymui, toks SFR paprastai nėra bitų adresuojamas, pavadinime paprastai būna IE (Interrupt Enable) arba IM (Interrupt Mask): PICTL | = 0x01; nereikia įsiminti pertraukimo SFR Nereikia įsiminti pertraukimo SFR, jei suprantate jų hierarchiją, o tada, kai juos naudojate, susipažinkite su vadovu arba antraštės failais. (3) Pertraukimo programų rašymas Pertraukimų naudojimas programoje paprastai susideda iš dviejų dalių: pertraukimo aptarnavimo paprogramės rašymo ir pertraukimo leidimo atidarymo. P ertraukimo įgalinimas buvo pristatytas pirmiau, toliau trumpai pristatomas pertraukimo aptarnavimo paprogramės rengimas: Pirmiausia nurodykite pertraukimo vektorių, jis gali būti ioCC2430.h antraštinio failo užklausos dalyje Interrupt Vectors (pertraukimo vektoriai), sintaksė tokia: # pragma vector = Interrupt Vectors (# pragma vektorius = pertraukimo vektoriai ), po to rengiama pertraukimo tvarkyklė, jos struktūra tokia: ___ interrupt void Function Name (___)
i nterrupt void funkcijos pavadinimas(void) { //įjungtas pertraukimas //pertraukimo tvarkymas //pertraukimo vėliavėlė clear 0 //išjungtas pertraukimas } III. Išvada Šiame straipsnyje pristatomas paprastas išorinio pertraukimo įgyvendinimo metodas, pagrįstas CC2430, kurio pagrindas yra pertraukimas, tada pristatome kitą labai svarbų modulį - laikmatį. CC2430 iš viso turi keturis laikmačius, kuriuos galima suskirstyti į tris kategorijas: 1 laikmatis, 2 laikmatis, 3/4 laikmatis (3 ir 4 naudojami tie patys pagrindiniai). tas pats). </n;tt++). </n;tt++);. </n;tt++). </n;tt++); </n;tt++); </n;tt++); </n;tt++); </n;tt++). </n;tt++). |