|
1. Het verbinden van de boven- en benedenverdiepingen In het vorige artikel leerden we samen over de implementatie van eenvoudige externe interrupts. Nu we praktische ervaring hebben met interrupts, laten we het in dit gedeelte hebben over timer-interrupts. CC2430 heeft in totaal 4 timers, die in 3 categorieën kunnen worden verdeeld: timer 1, timer 2, timer 3/4 (het gebruik van 3 en 4 is hetzelfde). Aangezien de auteur ook nieuw is met de CC2430 en vrijwel geen praktische ervaring heeft met projecten met timers, ben ik niet van plan (en kan ik niets doen) om de timer diepgaand te analyseren. Dit artikel biedt slechts een korte experimentele verkenning van het gebruik van timer 1 bij count-overflow-interrupts, en noemt de inputcapture/outputvergelijking/PWM-functies niet. Timer 2 en Timer 3/4 zijn slechts eenvoudige functie-introducties. Nadat de vaardigheden van de auteur een bepaald niveau van intensiteit bereiken, zal ik op het hoogtepunt van Zigbee's praktische ervaring staan om dit essay te verbeteren. 2. Timer 1Timer 1 is een 16-bits timer met modulatie van timer/teller/pulsbreedte. Het heeft 3 individueel programmeerbare input-capture/outputvergelijkingskanalen, elk gebruikt als PWM-uitgang of als randtijd om het ingangssignaal vast te leggen (voor informatie over wat input-opname/outputvergelijking is en hoe PWM-uitgang te implementeren, kunnen lezers de CC2430 Chinese handleiding raadplegen). Timers hebben een heel belangrijk concept:Werkingswijze。 Bedrijfsmodi zijn onder andere: Vrije bedieningsmodus (Free-running), vormmodus (modulo) en positieve tel-/aftelmodus (Omhoog-omlaag)。 Het volgende is een fragment uit de Chinese handleiding van CC2430 voor de introductie van de 3 modi:
Bij vergelijking van de drie modi is te zien dat de overloopwaarde van de vrije bedrijfsmodus 0xFFFF onveranderlijk is; De andere twee modi maken precieze controle van de overloopwaarde van de timer mogelijk door een waarde toe te wijzen aan T1CC0. Dit experiment gebruikt deze functie om elke 1s een interrupt te triggeren door de timer via een specifieke T1CC0, zodat het knipperinterval van het LED-lampje tot 1s nauwkeurig kan worden geregeld. (1) Inleiding tot het experimentIn de modulo-modus van de timer wordt het knipperinterval van het LED-licht nauwkeurig geregeld door 1s, namelijk: helder 0,5s → donker 0,5s → helder 0,5s → zwak 0,5s ...... → Licht 0,5s → Donker 0,5s (d.w.z. het tijdsinterval van donker naar licht is 1s). Licht/donker-inversie wordt bereikt door overlopende interrupts. (2) Programmastroomdiagram
(3) Relevante berekeningenZoals eerder vermeld, is de status van het LED-licht: fel 0,5s → donker 0,5s → helder 0,5s → zwak 0,5s ...... → 0,5s licht → 0,5s donker, en het moet worden geïmplementeerd met overflow-interrupts, dus de overloopperiode van de timer moet 0,5s zijn. Om dit te doen moet de overeenkomstige overloopwaarde worden berekend (tijdelijk ingesteld op N). De systeemklokfrequentie wordt geselecteerd als 32 MHz, en de gegeven klokfrequentie is standaard 16 MHz (beide worden bepaald door speciale functieregisters).CLKCONVoor details, raadpleeg de CC2430 Chinese handleiding). Voor Timer 1 stel je de klok-crossover in op 128 divisies. Samengevat is de lijst als volgt:
Om N=62500 te vinden, is de hexadecimale factor 0xF424, dat wil zeggen, je moet T1CC0H=0xF4, T1CC0L=0x24 instellen. (4) Experimentele broncode en analyse/*
Experimentbeschrijving: Timer Timer1 experiment, timer count overflow, LED1 knipperend
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
leegtextal_init(leegte)
{ SLAAP &= ~0x04; //都上电
terwijl(! (SLAAP &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Kies een 32MHz kristaloscillator. SLAAP |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
leegteled_init(leegte)
{ P1SEL =0x00; P1 is de normale I/O-poort P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 uitgang
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*T1初始化
-------------------------------------------------------*/
leegtetimer1_init(leegte)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM=1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; 128 crossover; modulo modus (0x0000->T1CC0); Begin met rennen; T1IF=0; Maak het onderbrekingsbord weg
}
/*主函数
-------------------------------------------------------*/
leegtehoofd(leegte)
{ xtal_init(); led_init(); timer1_init();
terwijl(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma vector=T1_VECTOR __interruptleegteT1_ISR(leegte)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
Oké, compileer het programma en debug online, LED1 op het ontwikkelbord knippert zoals gepland, en het voelt alsof het knipperingsinterval ongeveer 1 seconde is. Maar dit is niet genoeg om het succes van het experiment te bewijzen; als het interval strikt als 1s kan worden bepaald, zal het perfect zijn~ Dus zette ik de klok van WIN 7 aan (klik op de tijd aan de rechterkant van de taakbalk). Terwijl hij naar de secondewijzer keek, zag hij vanuit zijn ooghoek het knipperen van LED1. Het resultaat: binnen twee minuten is het tempo van de twee in principe exact hetzelfde (deze precisie is draaglijk~). Op dit punt kan men zeggen dat het experiment in wezen voltooid is, hehe~ 3. Timer 2Timer 2 wordt ook wel genoemdMAC-timer, is specifiek ontworpen ter ondersteuning van het event tracking-protocol in IEEE 802.15.4 MAC. De timer heeft een 8-cijferige overloopteller die kan worden gebruikt om het aantal cycli te registreren; Er is een 16-bits capture-register dat de exacte tijd registreert waarop een frame begint te ontvangen/verzenden of het exacte moment waarop de transmissie is voltooid. Het bevat ook een 16-bits outputvergelijkingsregister dat verschillende command gating-signalen genereert (start accepting, start send, enz.) naar de draadloze module op een specifiek moment. 4. Timer 3/4Timer 3/4 is een 8-bits timer met timer/teller/PWM-functie. T3/T4 heeft 2 uitgangsvergelijkingskanalen, die elk als PWM-uitgang kunnen worden gebruikt. 5. ConclusieDeze sectie leert vooral de methode van de teloverlooponderbreking van timer 1 en realiseert de precieze controle van het knipperende LED-lichtinterval van 1 seconden. Een paar andere timers zijn slechts een streek, en ik kom later terug om ze toe te voegen. In de volgende sectie introduceren we de CC2430 seriële poortcommunicatie.
|