|
1. Propojení horní a dolní úrovně V předchozí přednášce jsme se seznámili se základním procesem vývoje programu CC2430 pomocí IAR prostřednictvím jednoduchého experimentu s blikaním LED. Nůž už byl stejně nabroušený (i když můj brousek není dobrý) a teď začnu zabíjet hmyz :). Dále se naučíme pár základních experimentů s CC2430. Každý malý experiment je rozdělen do tří částí: "Úvod do experimentu", "Diagram programu a "Experimentální zdrojový kód a analýza". Tento článek vysvětluje vnější přerušení. 2. Vnější přerušení(1) Úvod do experimentuPřerušení jsou interním mechanismem, kterým mikrokontroléry zpracovávají interní nebo vnější události v reálném čase. Když dojde k interní nebo externí události, přerušovací systém mikrokontroléru donutí CPU pozastavit spouštěný program a místo toho zpracovat událost přerušení. Přerušení jsou rozdělena na externí a interní přerušení a CC2430 obsahuje celkem 18 zdrojů přerušení (pro konkrétní popisy přerušení a definice vektorů přerušení viz "Čínský manuál CC2430》)。 Nyní se podívejme na schéma zapojení této vývojové desky:
Tlačítko S1 bylo připojeno k P0.1 na vývojové desce a efektem tohoto experimentu je spuštění přerušení P0.1 přes tlačítko S1 a následné řízení zapnutí/vypnutí LED1 v podprogramu služby přerušení. (2) Experimentální princip a diagramExperimentální diagram je následující:
(3) Experimentální zdrojový kód//头文件
#include
//延时子函数
#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3
prázdnotaDelay(nepodepsánon)
{
nepodepsánott;
pro(tt =0; tt<n; tt++);
pro(tt =0; tt<n; tt++);
pro(tt =0; tt<n; tt++);
pro(tt =0; tt<n; tt++);
pro(tt =0; tt<n; tt++);
}
//32M晶振初始化
prázdnotaxtal_init(prázdnota)
{ SPÁT &= ~0x04; //都上电
zatímco(! (SPÁT &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Vyberte krystalový oscilátor s frekvencí 32 MHz SPÁT |=0x04;
}
//LED灯初始化
prázdnotaled_init(prázdnota)
{ P1SEL =0x00; P1 je běžný I/O port P1DIR |=0x0F; P1.0 P1.1 P1.1 P1.2 P1.3 výstup
led1 = 0; led2 = 0; led3 = 0; led4 = 0;
}
//io及外部中断初始化
prázdnotaio_init(prázdnota)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
prázdnotamain(prázdnota)
{ xtal_init(); led_init(); io_init();
zatímco(1); //等待中断
}
//中断服务子程序
#pragma vektor = P0INT_VECTOR
__interrupt prázdnotaP0_ISR(prázdnota)
{ EA =0; Brána je přerušena
Delay(10000); Delay(10000); Delay(10000); Delay(10000); Delay(10000);
pokud((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Nejprve inicializujte systémové hodiny: vyberte krystalový oscilátor na 32 MHz. Pak inicializujte LEDky: nastavte P1 jako obecný I/O port, nastavte směr P1.0 ~ P1.3 jako výstup a pak vypněte 4 LED světla. Dále nakonfigurujte příslušné SFR registry pro externí přerušení tak, aby bylo možné přerušení na všech úrovních, zahrnující 3 SFR:EA、IEN1、PICTL(Pro podrobnosti o každém SFR prosím vizČínský manuál CC2430》): EA- Povolení úplného přerušení; IEN1.5- P0 povolení přerušení; OBRÁZEK.3—— P0.1 povolení přerušení portu; OBRÁZEK.0—— Nastavte vstupní okraj portu P0.1 tak, aby způsobil spouštění přerušení. Pak použij while(1) v hlavní funkční roli a počkej na přerušení. Tipy na CC2430(1) Shrnutí syntaxe přiřazení bitů Často musíme přiřadit bit (0 nebo 1) jednomu bajtu SFR, abychom přesně ovládali hardwarové zařízení. Existuje SFRAdresování podpůrných bitůNapříklad TCON, P0 atd. je v tuto chvíli přiřazení protinázorů velmi jednoduché, stačí se zeptat na definici bitu v sekci SFR Bit Access souboru ioCC2430.h s hlavičkou: P0_0 = 0; // přiřadit 0 k první číslici P0 P0_0 = 1; // přiřadit hodnotu 1 první číslici P0
Ale některé SFR tam nejsouBitové adresování není podporováno, jako v tomto experimentuPICTL, v tuto chvíli chcete jednomu z nich přiřadit hodnotu, syntaxe je následující: PICTL &= ~0x01; První číslici přiřaďte hodnotu 0 OBRÁZEK |= 0x01; První číslici přiřaďte hodnotu 1
Pamatuješ si&= ~,|=Tyto dvě běžně používané syntaxe přiřazování bitů. (2) Shrnutí umožnění přerušení Pokud je v programu zapojeno přerušení, musí být povoleno před jeho spuštěním. Hierarchie systému povolení přerušení C51 je velmi zřejmá: Přerušovací boss: EAje šéf, zodpovědnýObecnéPovolení přerušení: EA = 1;
Každý přerušený velitel družstva: Další je pro každou z nichFunkční části(například P0, časovač 1 atd.), takové SFR jsou obecně bitově adresovatelné a název obvykle obsahuje IE (Interrupt Enable): P0IE = 1;
Každý člen týmu byl přerušen: Squad Ale protože každá funkce obsahuje i více přerušení, poslední úroveň je určena právě pro totoKaždé přerušeníTento typ SFR je obecně bezbitový a neadresovatelný, a obvykle obsahuje IE (Interrupt Enable) nebo IM (Interrupt Mask) v názvu: PICTL |=0x01;
Není potřeba mechanicky provádět SFR přerušení, stačí pochopit jeho hierarchii a pak si najít manuál nebo hlavičku souboru. (3) Přerušit psaní programů Použití přerušení v programu obvykle zahrnuje dvě části: zápis podprogramu služby přerušení a zahájení povolení přerušení. Funkce přerušení byla představena výše a následuje stručný úvod do zápisu podprogramu služby přerušení: Nejprve specifikujteVektor zlomu, který lze dotazovat v sekci Interrupt Vectors v souboru ioCC2430.h s následující syntaxí: #pragma vektor = vektor přerušení
Poté ihned poté zapište obslužný nástroj přerušení, který je strukturován následovně: __interrupt název funkce void (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. ZávěrTento článek představuje metodu implementace jednoduchých externích přerušení založenou na CC2430 a po základech přerušení představíme další velmi důležitý modul – časovače. CC2430 má celkem 4 časovače, které lze rozdělit do tří kategorií: časovač 1, časovač 2, časovač 3/4 (3 a 4 jsou v podstatě stejné použití). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|