|
1. Att koppla ihop de övre och undre nivåerna I föregående föreläsning bekantade vi oss med den grundläggande processen för att IAR skulle utveckla CC2430-programmet genom ett enkelt LED-blinkningsexperiment. Kniven har ändå slipats (även om min slipsten inte är bra), och nu ska jag börja slakta insekter :). Nästa steg är att lära oss några grundläggande experiment i CC2430. Varje litet experiment är uppdelat i tre delar: "Experimentintroduktion", "Programflödesschema" och "Experimentell källkod och analys". Den här artikeln förklarar yttre avbrott. 2. Extern avbrott(1) Introduktion till experimentetAvbrott är en intern mekanism för mikrokontrollers hantering av interna eller externa händelser i realtid. När en intern eller extern händelse inträffar tvingar mikrokontrollerns avbrottssystem CPU:n att pausa det körande programmet och istället bearbeta avbrottshändelsen. Avbrott delas in i externa och interna avbrott, och CC2430 innehåller totalt 18 avbrottskällor (för specifika avbrottsbeskrivningar och definitioner av avbrottsvektorer, se "CC2430 Kinesisk manual》)。 Nu ska vi titta på kretsdiagrammet för detta utvecklingskort:
S1-knappen har kopplats till P0.1 på utvecklingskortet, och effekten av detta experiment är att utlösa avbrottet för P0.1 via knappen S1, och sedan styra på/av av LED1 i avbrottstjänstprogrammet. (2) Experimentell princip och flödesschemaDet experimentella flödesschemat är som följer:
(3) Experimentell källkod//头文件
#include
//延时子函数
#defineled1 P1_0
#defineled2 P1_1
#defineled3 P1_2
#defineled4 P1_3
tomrumFördröjning(osigneradn)
{
osigneradTT;
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晶振初始化
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 = 0; led2 = 0; led3 = 0; led4 = 0;
}
//io及外部中断初始化
tomrumio_init(tomrum)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
tomrumhuvud(tomrum)
{ xtal_init(); led_init(); io_init();
medan(1); //等待中断
}
//中断服务子程序
#pragma vektor = P0INT_VECTOR
__interrupt tomrumP0_ISR(tomrum)
{ EA =0; Porten är avbruten
Fördröjning(10000); Fördröjning(10000); Fördröjning(10000); Fördröjning(10000); Fördröjning(10000);
om((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Först, initiera systemklockan: välj en 32 MHz kristalloscillator. Initialiserar sedan LED-lamporna: ställ in P1 som allmän I/O-port, ställ in riktningen P1.0 ~ P1.3 som utgång, och släck sedan de 4 LED-lamporna. Därefter konfigurerar du relevanta SFR-register för externa avbrott för att möjliggöra avbrott på alla nivåer, vilket involverar 3 SFR:er:EA、IEN1、PICTL(För detaljer om varje SFR, vänligen seCC2430 Kinesisk manual》): EA- Total avbrottsaktivering; IEN1.5- P0-avbrott aktiverat; PICTL.3—— P0.1 portavbrott aktiverat; PICTL.0—— Ställ in P0.1-portens ingångsdroppkant för att orsaka avbrottsutlösande. Använd sedan while(1) i huvudfunktionen och vänta på avbrottet. CC2430-tips(1) Sammanfattning av bittilldelningssyntax Många gånger behöver vi tilldela en bit (0 eller 1) till en enda byte SFR för att exakt kontrollera hårdvaruenheten. Det finns SFRStödbitadresseringTill exempel, TCON, P0, etc., vid denna tidpunkt är tilldelningen av motpunkter mycket enkel, bara att fråga bitdefinitionen i SFR Bit Access-sektionen i ioCC2430.h:s headerfil: P0_0 = 0; // tilldela 0 till den första siffran i P0 P0_0 = 1; // tilldela värdet 1 till den första siffran i P0
Men vissa SFR finns inte därBitadressering stöds inte, som i detta experimentPICTL, vid denna tidpunkt vill du tilldela ett värde till en av dem, syntaxen är följande: PICTL &= ~0x01; Tilldela värdet 0 till den första siffran PICTL |= 0x01; Tilldela värdet 1 till den första siffran
Du kan minnas&= ~,|=Dessa två vanliga bittilldelningssyntax. (2) Sammanfattning av avbrottsaktivering När ett avbrott är inblandat i programmet måste det aktiveras innan avbrottet utlöses. Hierarkin i C51:s avbrottsaktiveringssystem är mycket tydlig: Avbrytningsboss: EAär chefen, ansvarigAllmäntAvbrottsaktivering: EA = 1;
Varje avbruten gruppledare: Nästa är för varjeFunktionella delar(såsom P0, timer 1, etc.), är sådana SFR:er generellt bitadresserbara, och namnet innehåller oftast IE (Interrupt Enable): P0IE = 1;
Varje lagmedlem blev avbruten: Squad Men eftersom varje funktion också innehåller flera avbrott inom sig, är den sista nivån för dettaVarje avbrottDenna typ av SFR är generellt bitlös och oadresserbar, och innehåller vanligtvis IE (Interrupt Enable) eller IM (Interrupt Mask) i namnet: PICTL |=0x01;
Ingen anledning att rota SFR, förstå bara dess hierarki och ta dig tid att slå upp manualen eller headerfilen. (3) Avbryta skrivandet av program Användningen av avbrott i ett program består generellt av två delar: skrivningen av avbrottstjänstdelprogrammet och öppnandet av avbrottsaktiveringen. Avbrottsfunktionen har introducerats ovan, och följande är en kort introduktion till skrivandet av avbrottstjänstdelprogrammet: Specificera förstBrytvektor, som kan frågas i avsnittet Interrupt Vectors i ioCC2430.h:s headerfil, med följande syntax: #pragma vektor = avbrottsvektor
Skriv sedan interrupt-hanteraren direkt efteråt, som är strukturerad enligt följande: __interrupt tomrumsfunktionsnamn (tomrum) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. SlutsatsDenna artikel introducerar implementeringsmetoden för enkla externa avbrott baserade på CC2430, och efter grunden för avbrott kommer vi att introducera en annan mycket viktig modul – timers. CC2430 har totalt 4 timers, som kan delas in i tre kategorier: timer 1, timer 2, timer 3/4 (3 och 4 är i princip samma användning). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|