|
1. Verbindung der oberen und unteren Ebenen Im vorherigen Artikel haben wir gemeinsam über die Implementierung einfacher externer Interrupts gelernt. Da wir nun praktische Erfahrung mit Interrupts haben, sprechen wir in diesem Abschnitt über Timer-Interrupts. CC2430 hat insgesamt 4 Timer, die in 3 Kategorien unterteilt werden können: Timer 1, Timer 2, Timer 3/4 (die Verwendung von 3 und 4 ist gleich). Da der Autor ebenfalls neu bei CC2430 ist und praktisch keine praktische Erfahrung mit Projekten mit Timern hat, habe ich nicht vor, den Timer eingehend zu analysieren (und kann auch nichts tun). Dieser Artikel bietet nur eine kurze experimentelle Untersuchung der Verwendung von Timer 1 bei Count-Overflow-Unterbrechungen und erwähnt nicht deren Funktionen für Eingabeerfassung/Ausgabevergleich/PWM. Timer 2 und Timer 3/4 sind nur einfache Funktionseinführungen. Nachdem die Fähigkeiten des Autors ein gewisses Maß an Hitze erreicht haben, werde ich auf dem Höhepunkt von Zigbees praktischer Erfahrung stehen, um diesen Aufsatz zu verbessern. 2. Timer 1Timer 1 ist ein 16-Bit-Timer mit Timer-/Zähler-/Pulsbreitenmodulation. Er verfügt über 3 einzeln programmierbare Eingangs-Erfassungs-/Ausgangsvergleichskanäle, von denen jeder als PWM-Ausgang oder als Randzeit zur Erfassung des Eingangssignals verwendet werden kann (Informationen darüber, was Eingangserfassung/Ausgabevergleich besteht und wie man PWM-Ausgang implementiert, können Leser im chinesischen Handbuch CC2430 nachsehen). Timer haben ein sehr wichtiges Konzept:Funktionsweise。 Zu den Betriebsmodi gehören: Freier Betriebsmodus (Freilauf), Formmodus (modulo) und positiver Zähl-/Countdown-Modus (Oben-runter)。 Im Folgenden ein Auszug aus dem chinesischen Handbuch CC2430 zur Einführung der drei Modi:
Beim Vergleich der drei Moden zeigt sich, dass der Überlaufwert des freien Betriebsmodus 0xFFFF unveränderlich ist; Die anderen beiden Modi ermöglichen eine präzise Steuerung des Überlaufwerts des Timers, indem ein Wert T1CC0 zugewiesen wird. Dieses Experiment nutzt diese Funktion, um alle 1 Sekunden durch den Timer über einen bestimmten T1CC0 einen Interrupt auszulösen, um das Blinkintervall der LED-Lampe auf 1 Sekunden genau zu steuern. (1) Einführung in das ExperimentIm modulo-Modus des Timers wird das Blinkintervall der LED-Leuchte präzise durch 1s gesteuert, nämlich: helle 0,5s → dunkle 0,5s → helle 0,5s → schwache 0,5s ...... → Hell 0,5 Sekunden → Dunkel 0,5 Sekunden (d. h. das Zeitintervall von Dunkel zu Licht beträgt 1 Sekunde). Die Hell-/Dunkel-Inversion wird durch überlaufende Unterbrechungen erreicht. (2) Programmflussdiagramm
(3) Relevante BerechnungenWie bereits erwähnt, lautet der Status der LED-Lampe: hell 0,5 Sekunden → dunkle 0,5 Sekunden → hell 0,5 Sekunden → schwache 0,5 Sekunden ...... → 0,5s Licht → 0,5s Dunkel, und es muss mit Überlauf-Interrupts implementiert werden, sodass der Überlaufzeitraum des Timers 0,5 Sekunden betragen muss. Dazu muss der entsprechende Überlaufwert berechnet werden (vorübergehend auf N gesetzt). Die Systemtaktfrequenz wird mit 32 MHz gewählt, und die angegebene Taktfrequenz beträgt standardmäßig 16 MHz (beide werden durch spezielle Funktionsregister bestimmt).CLKCONFür Details siehe bitte das chinesische Handbuch CC2430). Für Timer 1 stellen Sie das Uhr-Crossover auf 128 Divisionen ein. Zusammenfassend lautet die Liste wie folgt:
Um N=62500 zu finden, ist sein hexadezimal 0xF424, das heißt, man muss T1CC0H=0xF4, T1CC0L=0x24 setzen. (4) Experimenteller Quellcode und Analyse/*
Experimentbeschreibung: Timer Timer1 Experiment, Timer Count Overflow, LED1 blinkt
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
Leerextal_init(Leere)
{ SCHLAF &= ~0x04; //都上电
während(! (SCHLAF &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Wählen Sie einen 32-MHz-Kristalloszillator SCHLAF |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
Leereled_init(Leere)
{ P1SEL =0x00; P1 ist der normale I/O-Port P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 Ausgang
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*T1初始化
-------------------------------------------------------*/
Leeretimer1_init(Leere)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM=1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; 128 Crossover; modulo Modus (0x0000->T1CC0); Fang an zu laufen; T1IF=0; Löschen Sie das Unterbrechungsschild
}
/*主函数
-------------------------------------------------------*/
Leeremain(Leere)
{ xtal_init(); led_init(); timer1_init();
während(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma Vektor=T1_VECTOR __interruptLeereT1_ISR(Leere)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
Okay, kompiliere das Programm und debugge online, LED1 auf der Entwicklungsplatine blinkt wie geplant, und es fühlt sich an, als würde das Blinkintervall etwa 1 Sekunden betragen. Aber das reicht nicht aus, um den Erfolg des Experiments zu beweisen; wenn das Intervall streng auf 1s bestimmt werden kann, ist es perfekt~ Also schaltete ich die Uhr von WIN 7 ein (klicke auf die Zeit auf der rechten Seite der Taskleiste). Während er den Sekundenzeiger betrachtete, sah er aus dem Augenwinkel das blinkende LED1. Das Ergebnis: Innerhalb von zwei Minuten ist das Tempo der beiden im Grunde exakt gleich (diese Präzision ist erträglich~). An diesem Punkt kann man sagen, dass das Experiment im Grunde abgeschlossen ist, hehe~ 3. Timer 2Timer 2 wird auch als Timer 2 bezeichnetMAC-Timer, speziell entwickelt wurde, um das Ereignisverfolgungsprotokoll in IEEE 802.15.4 MAC zu unterstützen. Der Timer verfügt über einen 8-stelligen Überlaufzähler, mit dem die Anzahl der Zyklen erfasst werden kann; Es gibt ein 16-Bit-Capture-Register, das die genaue Zeit aufzeichnet, zu der ein Frame zu empfangen/senden beginnt oder den genauen Zeitpunkt der Übertragung abgeschlossen ist. Es enthält außerdem ein 16-Bit-Ausgangsvergleichsregister, das verschiedene Befehlsgating-Signale (Start Accepting, Start Senden usw.) zu einem bestimmten Zeitpunkt an das drahtlose Modul erzeugt. 4. Timer 3/4Timer 3/4 ist ein 8-Bit-Timer mit Timer/Zähler/PWM-Funktion. T3/T4 verfügt über 2 Ausgangsvergleichskanäle, von denen jeder als PWM-Ausgang verwendet werden kann. 5. FazitDieser Abschnitt lernt hauptsächlich die Methode des Count-Overflow-Interrupts des Timers 1 kennen und realisiert die präzise Steuerung des LED-Lichtblinkintervalls von 1 Sekunden. Nur ein paar andere Timer sind nur ein Strich, und ich werde später noch einmal hinzufügen. Im nächsten Abschnitt stellen wir die CC2430-Seriellport-Kommunikation vor.
|