Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 7368|Svar: 0

Zigbee-resan (3): Flera viktiga grundläggande CC2430-experiment – extern avbrott

[Kopiera länk]
Publicerad på 2014-10-30 23:16:46 | | | |
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 experimentet

Avbrott ä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ödesschema

Det 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:EAIEN1PICTL(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. Slutsats

Denna 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++);




Föregående:Zigbee Journey (2): Det första CC2430-programmet - LED-ljusblinkande experimentet
Nästa:Zigbee Journey (4): Flera viktiga grundläggande CC2430-experiment – timeravbrott
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com