| I. Fortsättning från föregående artikel I föregående avsnitt lärde vi oss hur man implementerar enkla externa avbrott tillsammans. Efter att ha fått praktisk erfarenhet av interrupts kommer vi att diskutera timerinterrupts i detta avsnitt.CC2430 har 4 timers, som kan delas in i 3 kategorier: Timer1, Timer2, Timer3/4 (användningen av 3 och 4 är densamma). Eftersom författaren också bara rör vid CC2430 är projektet med timerupplevelse i princip noll, så jag tänker inte (och kan inte hjälpa) djupgående analys av timern. Denna artikel endast på timern 1 räkna överflöd avbrott användning för att göra en enkel experimentell utforskning, för dess input capture / output jämförelse / PWM-funktion utelämnas. Timer 2 och Timer 3/4 introduceras också bara kortfattat. Väntar på att författarens kraft ska nå en viss nivå av eld och sedan stå i höjden av Zigbee-stridsupplevelsen för att förbättra denna uppsats. Timer 1 Timer1 är en 16-bitars timer med timer/counter/pulsbreddsmoduleringsfunktioner. Den har tre individuellt programmerbara input capture/output jämförelsekanaler, som var och en kan användas som en PWM-utgång eller användas för att fånga ingångssignalens kanttid (för mer information om vad input capture/output jämförelse är och hur man implementerar PWM-utgångar, kan läsarna hänvisa till den kinesiska manualen för CC2430 på egen hand). Timern har ett mycket viktigt koncept: driftläge. Driftlägena inkluderar: fri körning, modulo och upp-ned. Nedan följer en introduktion av de tre lägena från den kinesiska manualen för CC2430:
Om man jämför de tre lägena kan man se att: överflödesvärdet för läget med fri körning är 0xFFFF som inte kan ändras; medan de andra två lägena kan kontrolleras exakt genom att tilldela ett värde till T1CC0 för att exakt kontrollera timerns överflödesvärde. Detta experiment utnyttjar denna funktion för att få timern att utlösa ett avbrott var 1s genom den specifika T1CC0, för att exakt kontrollera LED-blinkningsintervallet på 1s. (1) Introduktion till experimentet I timerns modulo-läge styrs LED-lampans blinkningsintervall exakt till 1s, dvs: ljus 0,5s → mörkt 0,5s → ljus 0,5s → mörkt 0,5s ...... → ljus 0,5s → mörker 0,5s (dvs. ögonblicket för övergången från mörker till ljus är 1s). Vändningen av ljus/mörker sker genom ett overflow-interrupt. (2) Flödesschema för programmet (3) Relaterade beräkningar Som tidigare nämnts är LED-lampans tillstånd: ljus 0,5s → mörk 0,5s → ljus 0,5s → mörk 0,5s ...... → ljus 0,5s → mörk 0,5s, och måste uppnås med overflow-interruptet, så timerns overflow-period måste vara 0,5s. För detta ändamål måste motsvarande overflow-värde beräknas (tillfälligt inställt på N). Systemklockfrekvensen är 32 MHz och klockfrekvensen för timern är 16 MHz som standard (båda konfigureras med hjälp av specialfunktionsregistret CLKCON, som finns i den kinesiska manualen för CC2430). För timer 1, ställ in klockfrekvensen till 128 divisioner. Sammanfattningsvis kan formeln se ut enligt följande:
c
Ta reda på N = 62500, dess hexadecimal är 0xF424, det vill säga du måste ställa in T1CC0H = 0xF4, T1CC0L = 0x24 det vill säga .
(4) experimentell källkod och analys/* Experimentbeskrivning: Timer1-experiment, timerräkning överflöd, LED1 blinkar */ #include #define led1 P1_0 #define led2 P1_1 #define led3 P1_0 #define led3 P1_1
1 #define led3 P1_2 #define led4 P1_3 &
n bsp; /* initialisering av systemklocka-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& nbsp; // båda strömsättswhile (! (SLEEP & 0x40 )); //kristalloscillatorn på och stabil CLKCON &=~0x47; &
nbsp; //välj 32MHz kristalloscillator SLEEP |=0x04; }/*LED-initialisering-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1 är en normal I/O-port P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 utgångar led1 =1; &
nbsp; //Släck alla lysdioder led2 =1; led3 =1; led4 =1; }/*T1-initialisering---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; // slå på totalt avbrott & nbsp; T1IE=1; // slå på T1-avbrottOVFIM=1; // slå på T1-överflöde
i nterruptT1CC0L=0x24; //överflödesvärde låg 8 bitar T1CC0H=0xF4; //överflödesvärde hög 8 bitar & nbsp;T1CTL=0x0x24; //överflödesvärde låg 8 bitar
nbsp; T1CTL =0x0e; //128 delningar; modulo-läge (0x0000->T1CC0); börja köra;T1IF=0 ; &
nbsp; // rensa avbrottsflaggan }/* huvudfunktion-------------------------------------------------------*/void main( void
) { xtal_init(); led_init(); timer1_init();while ( 1 ); &
nbsp; //vänta på avbrott för överströmning }/*T1 terminal service subrutin-------------------------------------------------------*/#pragma vector=T1_VECTOR__interrupt
v oid T1_ISR( void ) {EA=0; //avbryter avbrott led1 = !
led1; //LEDs omvändaEA=1; //Vid avbrott  
; T1CTL &=~0x10; // rensa avbrottsflaggan } OK, kompilera programmet och online-felsökning, utvecklingskortet på LED1 blinkar upp som förväntat, känner det blinkande intervallet på ca 1s. Men detta är inte tillräckligt för att bevisa experimentets framgång, om du strikt kan bestämma intervallet på 1s skulle vara perfekt ~ så jag öppnade WIN 7-klockan (klicka på höger sida av aktivitetsfältet tid kan vara). Medan jag tittade på sekundvisaren tittade jag på den blinkande LED1 ur ögonvrån. Resultatet är: på två minuter är tempot för de två i princip identiskt (denna noggrannhet kan tolereras ~). Vid denna tidpunkt kan experimentet sägas vara i princip slutfört, hehehe~ För det tredje, Timer 2 Timer2, även känd som MAC-timern, är speciellt utformad för att stödja händelsespårningsprotokollet i IEEE 802.15.4 MAC. Timern har en 8-bitars överflödesräknare som kan användas för att registrera antalet cykler som har inträffat; har ett 16-bitars fångstregister som används för att registrera den exakta tiden då en ramstartavgränsare tas emot/sänds eller den exakta tiden då en sändning är klar; och innehåller också ett 16-bitars utgångsjämförelseregister som används för att generera olika kommandovalda kommunikationssignaler till den trådlösa modulen vid en viss tidpunkt (börja ta emot, börja sända osv.). Timer 3/4 Timer 3/4 är en 8-bitars timer med timer/counter/PWM-funktioner. t3/t4 har två utgångsjämförelsekanaler, som var och en kan användas som PWM-utgång. V. Slutsats I detta avsnitt har vi lärt oss metoden att räkna overflow-interruptet för timer 1 och uppnått en exakt styrning av LED-blinkintervallet på 1 s. Vi kommer bara att skumma över de andra timers och sedan gå tillbaka för att lägga till dem senare. I nästa avsnitt kommer vi att presentera CC2430:s serieportskommunikation. |