|
1. Att koppla ihop de övre och undre nivåerna I föregående artikel lärde vi oss tillsammans om implementeringen av enkla externa avbrott. Nu när vi har praktisk erfarenhet av avbrott, låt oss prata om timeravbrott i detta avsnitt. CC2430 har totalt 4 timers, som kan delas in i 3 kategorier: timer 1, timer 2, timer 3/4 (användningen av 3 och 4 är densamma). Eftersom författaren också är ny på CC2430 och i princip har noll praktisk erfarenhet av projekt som involverar timers, har jag inte för avsikt (och kan inte göra något) att analysera timern på djupet. Denna artikel ger endast en kort experimentell undersökning av användningen av timer 1 vid count-overflow-avbrott, och nämner inte dess funktioner för indatafångst/utdatajämförelse/PWM. Timer 2 och Timer 3/4 är bara enkla funktionsintroduktioner. När författarens färdigheter nått en viss nivå av intensitet kommer jag att stå på höjden av Zigbees praktiska erfarenhet för att förbättra denna essä. 2. Timer 1Timer 1 är en 16-bitars timer med modulering av timer/räknare/pulsbredd. Den har tre individuellt programmerbara ingångsfångst/utgångsjämförelsekanaler, var och en kan användas som PWM-utgång eller som kanttid för att fånga insignalen (för information om vad intagnings-/utgångsjämförelse är och hur man implementerar PWM-utgång kan läsare se CC2430 kinesiska manual). Timers har ett mycket viktigt koncept:Driftläge。 Driftlägen inkluderar: Fri driftläge (Frigående), formläge (modulo) och positiv räkning/nedräkningsläge (upp-ner)。 Följande är ett utdrag ur den kinesiska manualen CC2430 för introduktionen av de 3 lägena:
När man jämför de tre lägena kan man se att överflödesvärdet för fridriftsläget är 0xFFFF oföränderligt; De andra två lägena möjliggör exakt kontroll av timerns överflödesvärde genom att tilldela ett värde till T1CC0. Detta experiment använder denna funktion för att utlösa ett avbrott var 1:a sekund av timern via en specifik T1CC0, för att noggrant kontrollera blinkintervallet för LED-lampan till 1 sekunder. (1) Introduktion till experimentetI timerns moduloläge styrs blinkintervallet för LED-lampan exakt av 1s, nämligen: ljus 0,5s → mörk 0,5s → ljus 0,5s → svag 0,5s ...... → Ljus 0,5 sekunder → Mörk 0,5 sekunder (dvs. tidsintervallet från mörkt till ljust är 1 sekunder). Ljus/mörker-inversion uppnås genom överflödsavbrott. (2) Programflödesschema
(3) Relevanta beräkningarSom nämnts tidigare är statusen för LED-lampan: ljus 0,5 sekunder → mörk 0,5 sekunder → ljus 0,5 sekunder → svag 0,5 sekunder ...... → 0,5 sekunders ljus → 0,5 sekunder mörkt, och det måste implementeras med överflödesavbrott, så timerns överflödesperiod måste vara 0,5 sekunder. För att göra detta måste motsvarande överflödesvärde beräknas (tillfälligt sättas till N). Systemklockfrekvensen väljs som 32 MHz, och den angivna klockfrekvensen är 16 MHz som standard (båda bestäms av specialfunktionsregister).CLKCONFör detaljer, se CC2430 kinesiska manualen). För Timer 1, ställ in dess klockkorsning till 128 divisioner. Sammanfattningsvis är listan följande:
För att hitta N=62500 är dess hexadecimal 0xF424, det vill säga du måste sätta T1CC0H=0xF4, T1CC0L=0x24 . (4) Experimentell källkod och analys/*
Experimentbeskrivning: Timer Timer1-experiment, överflöd av timerräkning, LED1 blinkar
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
tomrumxtal_init(tomrum)
{ SOV &= ~0x04; //都上电
medan(! (SÖMN &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Välj en 32MHz kristalloscillator SÖMN |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
tomrumled_init(tomrum)
{ P1SEL =0x00; P1 är den normala I/O-porten P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3-utgång
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*T1初始化
-------------------------------------------------------*/
tomrumtimer1_init(tomrum)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM=1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; 128 crossover; moduloläge (0x0000->T1CC0); Börja springa; T1IF=0; Rensa avbrottsskylten
}
/*主函数
-------------------------------------------------------*/
tomrumhuvud(tomrum)
{ xtal_init(); led_init(); timer1_init();
medan(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma vektor=T1_VECTOR __interrupttomrumT1_ISR(tomrum)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
Okej, kompilera programmet och felsök online, LED1 på utvecklingskortet blinkar som planerat, och det känns som att blinkintervallet är ungefär 1 sekunder. Men detta räcker inte för att bevisa experimentets framgång, om intervallet strikt kan bestämmas till 1 sekunder kommer det att vara perfekt~ Så jag slog på klockan för WIN 7 (klicka på tiden till höger i aktivitetsfältet). När han tittade på sekundvisaren såg han blinkandet av LED1 i ögonvrån. Resultatet: inom två minuter är tempot på de två i princip exakt detsamma (denna precision är acceptabel~). Vid denna punkt kan man säga att experimentet i princip är slutfört, hehe~ 3. Timer 2Timer 2 kallas ocksåMAC-timer, är specifikt utformad för att stödja händelsespårningsprotokollet i IEEE 802.15.4 MAC. Timern har en 8-siffrig överflödesräknare som kan användas för att registrera antalet cykler som har inträffat; Det finns ett 16-bitars fångstregister som registrerar exakt när en bildruta börjar ta emot/skicka eller exakt när överföringen är klar. Den innehåller också ett 16-bitars utgångsjämförelseregister som genererar olika kommandogatingsignaler (börja acceptera, börja skicka, etc.) till den trådlösa modulen vid en specifik tidpunkt. 4. Timer 3/4Timer 3/4 är en 8-bitars timer med timer/räknare/PWM-funktion. T3/T4 har två utgångsjämförelsekanaler, var och en kan användas som PWM-utgång. 5. SlutsatsDetta avsnitt lär sig främst metoden för räkneöverskottsavbrottet på timer 1, och visar den exakta kontrollen av LED-ljusets blinkande intervall på 1 sekunder. Bara några andra timers är bara ett streck, och jag kommer tillbaka och lägger till dem senare. I nästa avsnitt kommer vi att introducera CC2430 seriell portkommunikation.
|