|
1. Forbindelse mellem øvre og nedre niveauer I det forrige foredrag gjorde vi os fortrolige med den grundlæggende proces i IAR's udvikling af CC2430-programmet gennem et simpelt LED-blinkeksperiment. Kniven er alligevel blevet slebet (selvom min slibesten ikke er god), og nu vil jeg begynde at slagte insekter :). Lad os nu lære nogle grundlæggende eksperimenter i CC2430. Hvert lille eksperiment er opdelt i tre dele: "Eksperimentintroduktion", "Programflowdiagram" og "Eksperimentel kildekode og analyse". Denne artikel forklarer eksterne afbrydelser. 2. Ekstern afbrydelse(1) Introduktion til eksperimentetInterrupts er en intern mekanisme, som mikrocontrollere kan bruge til at behandle interne eller eksterne hændelser i realtid. Når en intern eller ekstern hændelse opstår, vil mikrocontrollerens afbrydelsessystem tvinge CPU'en til at pause det udførende program og i stedet behandle afbrydelseshændelsen. Interrupts er opdelt i eksterne og interne interrupts, og CC2430 indeholder i alt 18 interrupt-kilder (for specifikke interruptbeskrivelser og definitioner af interruptvektorer, se venligst "CC2430 Kinesisk Manual》)。 Lad os nu se på kredsløbsdiagrammet for dette udviklingskort:
S1-knappen er forbundet til P0.1 på udviklingskortet, og effekten af dette eksperiment er at udløse afbrydelsen af P0.1 gennem knap S1 og derefter styre tænd/sluk af LED1 i afbrydelsesservice-underprogrammet. (2) Eksperimentelt princip og flowdiagramDet eksperimentelle flowdiagram er som følger:
(3) Eksperimentel kildekode//头文件
#include
//延时子函数
#defineled1 P1_0
#defineled2 P1_1
#defineled3 P1_2
#defineled4 P1_3
tomrumForsinkelse(Usigneretn)
{
Usignerettt;
for(tt =0; TT<N; TT++);
for(tt =0; TT<N; TT++);
for(tt =0; TT<N; TT++);
for(tt =0; TT<N; TT++);
for(tt =0; TT<N; TT++);
}
//32M晶振初始化
tomrumxtal_init(tomrum)
{ SOV &= ~0x04; //都上电
mens(! (SØVN &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Vælg en 32MHz krystaloscillator SØVN |=0x04;
}
//LED灯初始化
tomrumled_init(tomrum)
{ P1SEL =0x00; P1 er den normale I/O-port P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 output
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 };
//主函数
tomrumhoved(tomrum)
{ xtal_init(); led_init(); io_init();
mens(1); //等待中断
}
//中断服务子程序
#pragma vektor = P0INT_VECTOR
__interrupt tomrumP0_ISR(tomrum)
{ EA =0; Porten er afbrudt
Forsinkelse(10000); Forsinkelse(10000); Forsinkelse(10000); Forsinkelse(10000); Forsinkelse(10000);
hvis((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Først initialiser systemklokken: vælg en 32 MHz krystaloscillator. Initialiser derefter LED'erne: sæt P1 som den generelle I/O-port, sæt P1.0 ~ P1.3-retningen som udgang, og sluk derefter de 4 LED-lys. Dernæst konfigureres de relevante SFR-registre for eksterne afbrydelser for at muliggøre afbrydelser på alle niveauer, hvilket involverer 3 SFR'er:EA、IEN1、PICTL(For detaljer om hver SFR, se venligstCC2430 Kinesisk Manual》): EA- Total interrupt aktivering; IEN1.5- P0 interrupt aktiveret; PICTL.3—— P0.1 port interrupt aktiveret; PICTL.0—— Indstil P0.1-portens indgangsdrop edge til at forårsage interrupt-udløsning. Brug derefter while(1) i hovedfunktionen og vent på afbrydelsen. CC2430 Tips(1) Sammenfatning af bittildelingssyntaks Mange gange skal vi tildele en bit (0 eller 1) til en enkelt byte SFR for præcist at kontrollere hardwareenheden. Der findes SFRSupport bit-adresseringFor eksempel TCON, P0 osv., på nuværende tidspunkt er tildelingen af modpunkter meget simpel, bare forespørg bitdefinitionen i SFR Bit-adgangssektionen i ioCC2430.h-headerfilen: P0_0 = 0; // tildel 0 til det første ciffer i P0 P0_0 = 1; // tildel værdien 1 til det første ciffer i P0
Men nogle SFR'er findes ikkeBitadressering understøttes ikke, som i dette eksperimentPICTL, på dette tidspunkt vil du tildele en værdi til en af dem, syntaksen er som følger: PICTL &= ~0x01; Tildel værdien 0 til det første ciffer PICTL |= 0x01; Tildel værdien 1 til det første ciffer
Du kan huske&= ~,|=Disse to almindeligt anvendte bittildelingssyntaks. (2) Sammenfatning af afbrydelsesaktivering Når et interrupt er involveret i programmet, skal det aktiveres, før interruptet udløses. Hierarkiet i C51-interrupt-aktiveringssystemet er meget tydeligt: Interrupt Boss: EAer chefen, ansvarligGenerelAfbrydelsesaktivering: EA = 1;
Hver afbrudt holdleder: Næste er for hver af demFunktionelle dele(såsom P0, timer 1 osv.), er sådanne SFR'er generelt bit-adresserbare, og navnet indeholder generelt IE (Interrupt Enable): P0IE = 1;
Hvert holdmedlem blev afbrudt: Squad Men da hver funktion også indeholder flere interrupts, er det sidste niveau til detteHver afbrydelseDenne type SFR er generelt bitløs og uadresserbar, og indeholder som regel IE (Interrupt Enable) eller IM (Interrupt Mask) i navnet: PICTL |=0x01;
Der er ikke behov for at styre afbrydelses-SFR, bare forstå dens hierarki og tag dig tid til at slå manualen eller headerfilen op. (3) Afbryde skrivningen af programmer Brugen af interrupts i et program omfatter generelt to dele: skrivningen af interruptservice-delprogrammet og åbningen af interrupt-aktiveringen. Interrupt-funktionen er blevet introduceret ovenfor, og følgende er en kort introduktion til skrivningen af interruptservice-underprogrammet: Specificér førstBrudvektor, som kan forespørges i afsnittet Interrupt Vectors i ioCC2430.h-headerfilen med følgende syntaks: #pragma vektor = afbrydelsesvektor
Skriv derefter interrupt-håndtereren umiddelbart efter, som er struktureret som følger: __interrupt void funktionsnavn (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. KonklusionDenne artikel introducerer implementeringsmetoden for simple eksterne afbrydelser baseret på CC2430, og efter grundlaget for afbrydelser vil vi introducere et andet meget vigtigt modul – timere. CC2430 har i alt 4 timere, som kan opdeles i tre kategorier: timer 1, timer 2, timer 3/4 (3 og 4 er grundlæggende samme brug). </n; TT++); </n; TT++); </n; TT++); </n; TT++); </n; TT++);
|