|
1. Verbindung der oberen und unteren Ebenen In der vorherigen Vorlesung machten wir uns mit dem grundlegenden Prozess der Entwicklung des CC2430-Programms durch ein einfaches LED-Blinkexperiment vertraut. Das Messer ist ohnehin geschärft (obwohl mein Wetzstein nicht gut ist), und jetzt werde ich anfangen, Insekten :) zu schlachten. Als Nächstes lernen wir einige grundlegende Experimente von CC2430 kennen. Jedes kleine Experiment ist in drei Teile unterteilt: "Experiment-Einführung", "Programm-Flussdiagramm" und "Experimenteller Quellcode und -analyse". Dieser Artikel erklärt externe Unterbrechungen. 2. Externe Unterbrechung(1) Einführung in das ExperimentInterrupts sind ein interner Mechanismus, mit dem Mikrocontroller interne oder externe Ereignisse in Echtzeit verarbeiten können. Wenn ein internes oder externes Ereignis auftritt, zwingt das Interrupt-System des Mikrocontrollers die CPU, das ausführende Programm anzuhalten und stattdessen das Interrupt-Ereignis zu verarbeiten. Interrupts sind in externe und interne Interrupts unterteilt, und CC2430 enthält insgesamt 18 Interruptquellen (für spezifische Interruptbeschreibungen und Definitionen von Interruptvektoren siehe bitte "CC2430 Chinesisches Handbuch》)。 Schauen wir uns nun den Schaltplan dieser Entwicklungsplatine an:
Der S1-Knopf ist mit P0.1 auf der Entwicklungsplatine verbunden, und der Effekt dieses Experiments besteht darin, den Interrupt von P0.1 über den Knopf S1 auszulösen und dann das Ein-/Ausschalten von LED1 im Interrupt-Service-Unterprogramm zu steuern. (2) Experimentelles Prinzip und FlussdiagrammDas experimentelle Flussdiagramm ist wie folgt:
(3) Experimenteller Quellcode//头文件
#include
//延时子函数
#defineled1 P1_0
#defineled2 P1_1
#defineled3 P1_2
#defineled4 P1_3
LeereVerzögerung(Unsigniertn)
{
Unsignierttt;
für(tt =0; tt<n; tt++);
für(tt =0; tt<n; tt++);
für(tt =0; tt<n; tt++);
für(tt =0; tt<n; tt++);
für(tt =0; tt<n; tt++);
}
//32M晶振初始化
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 = 0; led2 = 0; led3 = 0; led4 = 0;
}
//io及外部中断初始化
Leereio_init(Leere)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
Leeremain(Leere)
{ xtal_init(); led_init(); io_init();
während(1); //等待中断
}
//中断服务子程序
#pragma Vektor = P0INT_VECTOR
__interrupt LeereP0_ISR(Leere)
{ EA =0; Das Tor wird unterbrochen
Verzögerung(10000); Verzögerung(10000); Verzögerung(10000); Verzögerung(10000); Verzögerung(10000);
wenn((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Zuerst initialisieren Sie den Systemtakt: Wählen Sie einen 32-MHz-Kristalloszillator. Dann initialisiere die LEDs: setze P1 als allgemeinen I/O-Port, setze die Richtung P1.0 ~ P1.3 als Ausgang und schalte dann die 4 LED-Lichter aus. Als Nächstes konfigurieren Sie die entsprechenden SFR-Register für externe Interrupts, um Interrupts auf allen Ebenen zu ermöglichen, wobei 3 SFRs beteiligt sind:EA、IEN1、PICTL(Für Einzelheiten zu jedem SFR siehe bitte dieCC2430 Chinesisches Handbuch》): EA- Totale Interrupt-Aktivierung; IEN1.5- P0-Unterbrechungsaktivierung; BILDBILD 3—— P0.1 Port-Unterbrechung aktiviert; PICTL.0—— Stellen Sie die P0.1-Port-Eingangs-Drop-Kante so ein, dass sie eine Interrupt-Auslösung auslöst. Dann benutze while(1) in der Hauptfunktion und warte auf den Interrupt. CC2430 Tipps(1) Zusammenfassung der Bitzuweisungssyntax Oft müssen wir einem einzelnen Byte SFR ein Bit (0 oder 1) zuweisen, um das Hardwaregerät präzise zu steuern. Es gibt SFRSupport-Bit-AdressierungZum Beispiel TCON, P0 usw., zu diesem Zeitpunkt ist die Zuweisung von Kontrapunkten sehr einfach, man fragt einfach die Bitdefinition im SFR Bit Access-Abschnitt der ioCC2430.h-Headerdatei ab: P0_0 = 0; // weist 0 der ersten Ziffer von P0 zu P0_0 = 1; // weist der ersten Ziffer von P0 den Wert 1 zu
Aber einige SFRs gibt es nichtBitadressierung wird nicht unterstützt, wie in diesem ExperimentPICTL, wenn Sie einem von ihnen einen Wert zuweisen möchten, lautet die Syntax wie folgt: PICTL &= ~0x01; Weisen Sie der ersten Ziffer den Wert 0 zu PICTL |= 0x01; Weisen Sie der ersten Ziffer den Wert 1 zu
Du kannst dich erinnern&= ~,|=Diese beiden häufig verwendeten Bitzuweisungssyntaxen. (2) Zusammenfassung der Unterbrechungs-Ermöglichung Wenn ein Interrupt im Programm beteiligt ist, muss er aktiviert werden, bevor der Interrupt ausgelöst wird. Die Hierarchie des C51-Interrupt-Aktivierungssystems ist sehr offensichtlich: Interrupt-Boss: EAist der Chef, verantwortlichAllgemeinUnterbrechungsaktivierung: EA = 1;
Jeder unterbrochene Truppführer: Als Nächstes gilt für jedenFunktionale Teile(wie P0, Timer 1 usw.), sind solche SFRs in der Regel bitadressierbar, und der Name enthält meist IE (Interrupt Enable): P0IE = 1;
Jedes Teammitglied wurde unterbrochen: Squad Aber da jedes Feature auch mehrere Interrupts enthält, ist das letzte Level dafür vorgesehenJede UnterbrechungDiese Art von SFR ist in der Regel bitlos und nicht adressierbar und enthält meist IE (Interrupt Enable) oder IM (Interrupt Mask) im Namen: PICTL |=0x01;
SFR ist nicht nötig, SFR aus dem Kopf zu schreiben, man sollte einfach seine Hierarchie verstehen und sich dann die Zeit nehmen, das Handbuch oder die Header-Datei nachzuschlagen. (3) Unterbrechen des Schreibens von Programmen Die Verwendung von Interrupts in einem Programm besteht im Allgemeinen aus zwei Teilen: dem Schreiben des Interrupt-Service-Subprogramms und dem Öffnen der Interrupt-Enablement. Die Interrupt-Funktion wurde oben eingeführt, und im Folgenden eine kurze Einführung in das Schreiben des Interrupt-Service-Subprogramms: Zuerst spezifizierenBruchvektor, der im Abschnitt Interrupt Vectors der ioCC2430.h-Headerdatei mit folgender Syntax abgefragt werden kann: #pragma Vektor = Interruptvektor
Schreiben Sie dann unmittelbar danach den Interrupt-Handler, der wie folgt strukturiert ist: __interrupt Void-Funktionsname (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. FazitDieser Artikel stellt die Implementierungsmethode einfacher externer Interrupts auf Basis von CC2430 vor, und nach der Basis der Interrupts stellen wir ein weiteres sehr wichtiges Modul vor – Timer. CC2430 hat insgesamt 4 Timer, die in drei Kategorien unterteilt werden können: Timer 1, Timer 2, Timer 3/4 (3 und 4 sind im Grunde die gleiche Nutzung). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|