| I. Trecerea de la lecția anterioară la următoarea În prelegerea anterioară, ne-am familiarizat cu procesul de bază de dezvoltare a programelor CC2430 în IAR prin intermediul unui mic experiment cu cel mai simplu LED care clipește. Cuțitul a fost cel puțin ascuțit (deși nu prea mă pricep la piatra asta de ascuțit), iar acum este timpul să începem să măcelărim gândaci :). În continuare, să învățăm câteva experimente de bază CC2430. Fiecare experimente mici, împărțite în "introducere experimentală", "diagrama de flux a programului", "codul sursă experimental și analiza" trei părți ale descrierii. Acest articol explică întreruperea externă. În al doilea rând, întreruperea externă(1) Introducere în experiment Întreruperea este un microcontroler în timp real pentru a face față evenimentelor interne sau externe, un mecanism intern. Atunci când apare un anumit tip de eveniment intern sau extern, sistemul de întrerupere al microcontrolerului va forța CPU să întrerupă programul în curs de execuție, dar să meargă la procesarea evenimentului de întrerupere, procesarea întreruperii este completă și apoi se întoarce pentru a fi întreruptă de program, continuă să execute. Întreruperile sunt împărțite în întreruperi externe și întreruperi interne, CC2430 conține un total de 18 surse de întrerupere (descrierea specifică a întreruperii și definirea vectorului de întrerupere, puteți consulta " Manualul chinez CC2430 "). Acum să aruncăm o privire la schema de circuit a acestei plăci de dezvoltare:
Placa de dezvoltare a fost conectată la tasta S1 și la P0.1. Efectul pe care acest experiment dorește să îl obțină este declanșarea întreruperii lui P0.1 prin apăsarea tastei S1, iar apoi controlul aprinderii/stingerii LED1 în subrutina de serviciu de întrerupere. (2) Principiul experimental și diagrama de flux Diagrama de flux a experimentului este după cum urmează:
c
(3) Cod sursă experimental// fișier header#include // subfuncția delay#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++); }//inițializare cristal 32Mvoid xtal_init( void ) { SLEEP &=~0x04; & nbsp; //alimentarea tuturorwhile (! (SLEEP & 0x40 )); //oscilatorul cu cristal pornit și stabil CLKCON &=~0x47; &
nbsp; //Selectează oscilatorul cu cristal de 32MHz SLEEP |=0x04; }//Inițializarea LED-urilorvoid led_init( void ) { P1SEL =0x00;  
; //P1 este un port I/O normal P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Ie șire
led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//inițializare io și întrerupere externăvoid io_init( void ) { P0INP &=~0X02;
/ /P0.1 are pull-up și pull-down EA =1; //Total interrupt enable P0IE =1; &
nbsp; //P0 activare întrerupere PICTL |=0X09; //P0.1 activare întrerupere port, declanșare front descendent P0IFG &=~0x02
; //P0.1 interrupt flag clear 0 };//main functionvoid main( void ) { xtal_init(); led_init();
io_init();while ( 1 ); //așteaptă întreruperea }//subrutină de serviciu de întrerupere#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;
/ / dezactivează întreruperea Delay
( 10000 ); Delay(10000 ); Delay(10000 ); Delay(10000 ); Delay(10000 ); &
nbsp; if ((P0IFG & 0x02 ) >0 ) //key interrupt { P0IFG &=~0x02; &
nbsp; //P0.1 interrupt flag clear 0 led1 = !led1; } P0IF =0; &
nbsp; //P0 întrerupere flag clar 0 EA =1; & nbsp; // activează întreruperea } Mai întâi inițializați ceasul unitar: alegeți un oscilator cu cristal de 32MHz. Apoi inițializați LED-urile: setați P1 ca port I/O de uz general, setați direcția P1.0 ~ P1.3 ca ieșire și apoi opriți cele 4 LED-uri. Apoi configurați registrele SFR relevante pentru întreruperi externe și activați activarea întreruperii la toate nivelurile, implicând 3 SFR-uri: EA, IEN1, PICTL (pentru descrierea detaliată a fiecărui SFR, consultați " CC2430 Chinese Manual "): EA -- activarea totală a întreruperii; IEN1.5 -- activare întrerupere P0; PICTL.3 -- activare întrerupere port P0.1; PICTL.0 -- setează frontul descendent al intrării portului P0.1 pentru a provoca declanșarea întreruperii. Apoi utilizați while(1) în funcția principală pentru a aștepta întreruperea. Sfaturi CC2430(1) Sintaxa de atribuire a biților Rezumat Foarte des, trebuie să atribuim o valoare (0 sau 1) unui bit dintr-un SFR cu un singur octet pentru a controla cu precizie un dispozitiv hardware. U nele SFR-uri acceptă adresarea bitului, cum ar fi TCON, P0 etc., în acest moment, atribuirea bitului este foarte simplă, doar interogați fișierul de antet ioCC2430.h în partea SFR Bit Access a definiției bitului poate fi: P0_0 = 0; // P0 primul bit al atribuirii valorii de 0 P0_0 = 1; / / / P0 primul bit al atribuirii valorii de 1 Cu toate acestea, există SFR-uri nu acceptă adresarea bitului, ca în cazul primului bit al atribuirii valorii primului bit al primului bit al primului bit al primului bit al celui de-al doilea bit . Cu toate acestea, unele SFR-uri nu suportă adresarea biturilor, cum ar fi PICTL din acest experiment, atunci când doriți să atribuiți o valoare unuia dintre ele, sintaxa este următoarea: PICTL &= ~0x01; //atribuiți o valoare de 0 primului bit PICTL |= 0x01; //atribuiți o valoare de 1 primului bit Vă puteți aminti că & amp;= ~, |= ~, |= ~, |= P0_0 = 1; //atribuiți o valoare de 1 primului bit din P0 . amp;= ~, |= aceste două sintagme comune de atribuire a biților. (2) Rezumatul activării întreruperii Atunci când o întrerupere este implicată într-un program, aceasta trebuie activată înainte ca întreruperea să fie declanșată. S istemul de activare a întreruperii C51, structura sa ierarhică este foarte evidentă: șeful întreruperii: EA este șeful, responsabil pentru activarea totală a întreruperii: EA = 1; căpitanul detașării întreruperii: următorul este pentru fiecare componentă funcțională (cum ar fi P0, temporizatorul 1 etc.) permite controlul, cum ar fi SFR în general bit adresabil, denumirea conține în general IE (Interrupt Enable): P0IE = 1; membrii echipei de întrerupere : detașare, dar datorită întreruperiiprogramului , întreruperea trebuie activată înainte de declanșarea întreruperii.
f iecare membru al echipei de întreruperi: echipă, dar deoarece fiecare componentă funcțională conține, de asemenea, mai multe întreruperi, astfel încât ultimul nivel este pentru fiecare control de activare a întreruperii, astfel de SFR nu este, în general, adresabil prin bit, numit în general conține IE (Interrupt Enable) sau IM (Interrupt Mask): PICTL | = 0x01; nu este necesar să se memoreze SFR-urile de întrerupere Nu este necesar să memorați SFR-urile de întrerupere, atâta timp cât înțelegeți ierarhia și apoi consultați manualul sau fișierele de antet atunci când le utilizați. (3) Scrierea programelor de întrerupere Utilizarea întreruperilor într-un program constă în general din două părți: scrierea subrutinei de serviciu de întrerupere și deschiderea activării întreruperii. A ctivarea întreruperii a fost introdusă mai sus, în cele ce urmează este prezentată pe scurt pregătirea subprogramului de serviciu de întrerupere: Mai întâi de toate, specificați vectorul de întrerupere, poate fi în fișierul antet ioCC2430.h în partea Interrupt Vectors a interogării, sintaxa este următoarea: # pragma vector = Interrupt Vectors și apoi urmează pregătirea gestionarului de întrerupere, structura este următoarea: ___ interrupt void Function Name (___)
i nterrupt void function name(void) { //on interrupt //interrupt handling //interrupt flag clear 0 //off interrupt } III. Concluzie Acest articol introduce o metodă simplă de implementare a întreruperii externe bazată pe CC2430, cu baza întreruperii, apoi introducem un alt modul foarte important - temporizator. CC2430 are un total de patru temporizatoare, care pot fi împărțite în trei categorii: temporizator 1, temporizator 2, temporizator 3/4 (3 și 4 din utilizarea aceluiași de bază). aceluiași). </n;tt++). </n;tt++);. </n;tt++). </n;tt++); </n;tt++); </n;tt++); </n;tt++). </n;tt++). |