| I. Passaggio dalla lezione precedente a quella successiva Nella lezione precedente abbiamo familiarizzato con il processo di base dello sviluppo di programmi CC2430 in IAR attraverso un piccolo esperimento con il più semplice lampeggiamento di un LED. Il coltello è stato almeno affilato (anche se non sono molto bravo con questa pietra per affilare) e ora è il momento di iniziare a macellare gli insetti :). Quindi, impariamo alcuni esperimenti di base con il CC2430. Ogni piccolo esperimento è suddiviso in "introduzione sperimentale", "diagramma di flusso del programma", "codice sorgente sperimentale e analisi", tre parti della descrizione. Questo articolo spiega l'interrupt esterno. Secondo, l'interrupt esterno(1) Introduzione all'esperimento L'interrupt è un microcontrollore in tempo reale che si occupa di eventi interni o esterni, un meccanismo interno. Quando si verifica un qualche tipo di evento interno o esterno, il sistema di interruzione del microcontrollore costringe la CPU a mettere in pausa il programma in esecuzione, ma per andare all'elaborazione dell'evento di interruzione, l'elaborazione dell'interruzione è completa, e poi tornare ad essere interrotto dal programma, continuare ad eseguire. Gli interrupt si dividono in interrupt esterni e interrupt interni; il CC2430 contiene un totale di 18 sorgenti di interrupt (per la descrizione specifica degli interrupt e la definizione dei vettori di interrupt, consultare il " Manuale cinese del CC2430 "). Ora diamo un'occhiata allo schema elettrico di questa scheda di sviluppo:
La scheda di sviluppo è stata collegata al tasto S1 e a P0.1; l'effetto che questo esperimento vuole ottenere è quello di attivare l'interrupt di P0.1 premendo il tasto S1, per poi controllare l'accensione/spegnimento del LED1 nella subroutine del servizio di interrupt. (2) Principio sperimentale e diagramma di flusso Il diagramma di flusso dell'esperimento è il seguente:
c
(3) Codice sorgente sperimentale// file header#include // sottofunzione 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++); }//inizializzazione del cristallo 32Mvoid xtal_init( void ) { SLEEP &=~0x04; & nbsp; //l'accensione è completamentre (! (SLEEP & 0x40 )); // oscillatore a cristallo acceso e stabile CLKCON &=~0x47; &
nbsp; //Seleziona l'oscillatore a cristallo a 32 MHz SLEEP |=0x04; }//Inizializzazione del LEDvoid led_init( void ) { P1SEL =0x00;  
; //P1 è una normale porta di I/O P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Uscita
led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//inizializzazione I/O e interrupt esternivoid io_init( void ) { P0INP &=~0X02;
/ /P0.1 ha pull-up e pull-down EA =1; //Abilitazione totale dell'interrupt P0IE =1; &
nbsp; //P0 abilita l'interrupt PICTL |=0X09; //P0.1 abilita l'interrupt della porta, innesco del fronte di discesa P0IFG &=~0x02
/ /P0.1 interrupt flag clear 0 };//funzione principalevoid main( void ) { xtal_init(); led_init();
io_init();while ( 1 ); //attende l'interrupt }//subroutine di servizio per l'interrupt#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;
/ / disattiva l'interrupt Ritardo
( 10000 ); Ritardo(10000 ); Ritardo(10000 ); Ritardo(10000 ); Ritardo(10000 ); &
nbsp; if ((P0IFG & 0x02 ) >0 ) //interruzione del tasto { P0IFG &=~0x02; &
nbsp; //P0.1 flag di interrupt clear 0 led1 = !led1; } P0IF =0; &
nbsp; //P0.1 flag di interrupt clear 0 EA =1; & nbsp; // attiva l'interrupt } Per prima cosa inizializzare l'Unity Clock: scegliere un oscillatore a cristallo da 32 MHz. Quindi inizializzare i LED: impostare P1 come porta di I/O generica, impostare la direzione di P1.0 ~ P1.3 come uscita e spegnere i 4 LED. Configurare quindi i registri SFR pertinenti per gli interrupt esterni e attivare l'abilitazione degli interrupt a tutti i livelli, coinvolgendo 3 SFR: EA, IEN1, PICTL (per la descrizione dettagliata di ciascun SFR, consultare il " Manuale cinese del CC2430 "): EA -- abilitazione totale all'interrupt; IEN1.5 -- abilitazione interrupt P0; PICTL.3 -- abilitazione dell'interrupt della porta P0.1; PICTL.0 -- imposta il fronte di discesa dell'ingresso della porta P0.1 per causare l'attivazione dell'interrupt. Utilizzare quindi while(1) nella funzione principale per attendere l'interrupt. Suggerimenti CC2430(1) Sintesi della sintassi di assegnazione dei bit Molto spesso è necessario assegnare un valore (0 o 1) a un bit in un SFR a singolo byte per controllare con precisione un dispositivo hardware. A lcuni SFR supportano l'indirizzamento dei bit, come TCON, P0 e così via; in questo momento, l'assegnazione del bit è molto semplice, basta interrogare il file di intestazione ioCC2430.h nella parte SFR Bit Access della definizione del bit: P0_0 = 0; // P0 il primo bit dell'assegnazione del valore di 0 P0_0 = 1; / / P0 il primo bit dell'assegnazione del valore di 1 Tuttavia, alcuni SFR non supportano l'indirizzamento dei bit, come nel caso del primo bit dell'assegnazione del valore del primo bit del primo bit del primo bit del primo bit del secondo bit . Tuttavia, alcuni SFR non supportano l'indirizzamento a bit, come il PICTL in questo esperimento; quando si vuole assegnare un valore a uno di essi, la sintassi è la seguente: PICTL &= ~0x01; //assegna un valore di 0 al primo bit PICTL |= 0x01; //assegna un valore di 1 al primo bit Si può ricordare che & amp;= ~, |= ~, |= ~, |= P0_0 = 1; //assegna un valore di 1 al primo bit di P0 . amp;= ~, |= sono due comuni sintassi di assegnazione dei bit. (2) Riepilogo dell'abilitazione dell'interrupt Quando un interrupt è coinvolto in un programma, deve essere abilitato prima che l'interrupt venga attivato. I l sistema di abilitazione degli interrupt del C51 ha una struttura gerarchica molto evidente: capo dell'interrupt: EA è il capo, responsabile dell'abilitazione totale dell'interrupt: EA = 1; capitano del distacco dell' interrupt: il prossimo è per ogni componente funzionale (come P0, timer 1, ecc.) il controllo dell'abilitazione, tale SFR generalmente indirizzabile a bit, la denominazione contiene generalmente IE (Interrupt Enable): P0IE = 1; i membri del team dell' interrupt : distacco, ma a causa dell'interruzione del programma , l' interrupt deve essere abilitato prima dell'attivazione dell'interrupt.
o gni membro del team di interrupt: team, ma poiché ogni componente funzionale contiene anche più interrupt, l'ultimo livello è per ogni controllo di abilitazione dell 'interrupt, tale SFR non è generalmente indirizzabile a bit, ma contiene generalmente IE (Interrupt Enable) o IM (Interrupt Mask): PICTL | = 0x01; non è necessario memorizzare gli SFR di interrupt Non è necessario memorizzare i SFR di interrupt, purché se ne comprenda la gerarchia e si consulti il manuale o i file di intestazione quando li si utilizza. (3) Scrittura di programmi di interrupt L'uso degli interrupt in un programma consiste generalmente in due parti: la scrittura della subroutine di servizio di interrupt e l'apertura dell'abilitazione all'interrupt. L 'abilitazione all'interrupt è stata introdotta in precedenza, di seguito viene riportata una breve introduzione alla preparazione della subroutine di servizio di interrupt: prima di tutto, specificate il vettore di interrupt, che può trovarsi nel file di intestazione ioCC2430.h nella parte Interrupt Vectors della query, la sintassi è la seguente: # pragma vector = Interrupt Vectors e poi seguite dalla preparazione del gestore di interrupt, la struttura è la seguente: ___ interrupt void Function Name (___)
i nterrupt void function name(void) { //on interrupt //gestione dell'interrupt //interrupt flag clear 0 //off interrupt } III. Conclusione Questo articolo presenta un semplice metodo di implementazione di un interrupt esterno basato sul CC2430, con la base dell'interrupt, quindi introduciamo un altro modulo molto importante - il timer. Il CC2430 ha un totale di quattro timer, che possono essere suddivisi in tre categorie: timer 1, timer 2, timer 3/4 (il 3 e il 4 utilizzano la stessa base). lo stesso). </n;tt++). </n;tt++);. </n;tt++). </n;tt++); </n;tt++); </n;tt++); </n;tt++). </n;tt++). |