| I. Pokračování z předchozího na následující V předchozí přednášce jsme se seznámili se základním postupem vývoje programů CC2430 v IARu prostřednictvím malého experimentu s nejjednodušším blikáním LED. Nůž byl alespoň nabroušen (ačkoliv mi to s tím broušením kamene moc nejde) a teď je čas začít řezat chyby :). Dále se naučíme několik základních experimentů s CC2430. Každý malý experiment, rozdělený na "experimentální úvod", "vývojový diagram programu", "experimentální zdrojový kód a analýza" tři části popisu. Tento článek vysvětluje externí přerušení. Za druhé, externí přerušení(1) Úvod do experimentu Přerušení je mikrokontrolér reálného času pro řešení vnitřních nebo vnějších událostí, vnitřní mechanismus. Když dojde k nějaké vnitřní nebo vnější události, systém přerušení mikrokontroléru donutí procesor pozastavit prováděný program, ale přejít na zpracování události přerušení, zpracování přerušení je dokončeno a pak se vrátí k přerušení programu, pokračuje v provádění. Přerušení se dělí na externí přerušení a interní přerušení, CC2430 obsahuje celkem 18 zdrojů přerušení (konkrétní popis přerušení a definici vektoru přerušení najdete v " Čínské příručce CC2430 "). Nyní se podívejme na schéma zapojení této vývojové desky:
Vývojová deska byla připojena k tlačítku S1 a P0.1, efekt, kterého chce tento experiment dosáhnout, je vyvolat přerušení P0.1 stisknutím tlačítka S1 a následně ovládat rozsvícení/zhasnutí LED1 v podprogramu obsluhy přerušení. (2) Princip experimentu a vývojový diagram Blokové schéma experimentu je následující:
c
(3) Experimentální zdrojový kód// hlavičkový soubor#include // podfunkce delay#define led1 P1_0#define led2 P1_1#define led3 P1_2#define led4 P1_3void Delay( unsigned n) { & &
nbsp; unsigned tt;for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); &
nbsp; for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); }//32M krystalová inicializacevoid xtal_init( void ) { SLEEP &=~0x04; & nbsp; //všechno napájeníwhile (! (SLEEP & 0x40 )); //krystalový oscilátor zapnut a stabilní CLKCON &=~0x47; &
nbsp; /Zvolte 32MHz krystalový oscilátor SLEEP |=0x04; }//Inicializace LEDvoid led_init( void ) { P1SEL =0x00;  
; //P1 je normální I/O port P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Výstup
led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//io a inicializace externího přerušenívoid io_init( void ) { P0INP &=~0X02;
/ /P0.1 má pull-up a pull-down EA =1; //Total interrupt enable P0IE =1; &
nbsp; //P0 interrupt enable PICTL |=0X09; //P0.1 port interrupt enable, falling edge trigger P0IFG &=~0x02
; //P0.1 interrupt flag clear 0 };//main functionvoid main( void ) { xtal_init(); led_init();
io_init();while ( 1); //čekání na přerušení }//podprogram obsluhy přerušení#pragma vector = P0INT_VECTOR__přerušení void P0_ISR( void ) { EA =0;
/ / vypnutí přerušení Zp oždění
( 10000 ); Delay(10000 ); Delay(10000 ); Delay(10000); Delay(10000 ); Delay(10000 ); &
nbsp; if ((P0IFG & 0x02 ) >0 ) //přerušení klíče { P0IFG &=~0x02; &
nbsp; //P0.1 příznak přerušení clear 0 led1 = !led1; } P0IF =0; &
nbsp; //P0 příznak přerušení clear 0 EA =1; & nbsp; // zapnout přerušení } Nejprve inicializujte Unity Clock: zvolte 32MHz krystalový oscilátor. Poté inicializujte LED diody: nastavte P1 jako univerzální I/O port, nastavte směr P1.0 ~ P1.3 jako výstup a poté vypněte 4 LED diody. Poté nakonfigurujte příslušné registry SFR pro externí přerušení a zapněte povolení přerušení na všech úrovních, což zahrnuje 3 SFR: EA, IEN1, PICTL (podrobný popis jednotlivých SFR najdete v " Čínské příručce CC2430 "): EA -- celkové povolení přerušení; IEN1.5 -- povolení přerušení P0; PICTL.3 -- povolení přerušení portu P0.1; PICTL.0 -- nastavte klesající hranu vstupu portu P0.1 tak, aby způsobila spuštění přerušení. Pak použijte while(1) v hlavní funkci pro čekání na přerušení. CC2430 Tipy(1) Syntaxe přiřazování bitů Shrnutí Velmi často potřebujeme přiřadit hodnotu (0 nebo 1) bitu v jednobajtovém SFR, abychom přesně řídili hardwarové zařízení. N ěkteré SFR podporují bitové adresování, například TCON, P0 atd. v tuto chvíli je přiřazení bitu velmi jednoduché, stačí se zeptat v hlavičkovém souboru ioCC2430.h v části SFR Bitový přístup definice bitu může být: P0_0 = 0; // P0 první bit přiřazení hodnoty 0 P0_0 = 1; / / / P0 první bit přiřazení hodnoty 1 Existují však SFR, které bitové adresování nepodporují, jako v případě prvního bitu přiřazení hodnoty prvního bitu prvního bitu prvního bitu druhého bitu . Některé SFR však bitové adresování nepodporují, jako například PICTL v tomto experimentu, když chcete jednomu z nich přiřadit hodnotu, syntaxe je následující: PICTL &= ~0x01; //přiřazení hodnoty 0 prvnímu bitu PICTL |= 0x01; //přiřazení hodnoty 1 prvnímu bitu Můžete si zapamatovat, že & amp;= ~, |= ~, |= ~, |= ~, |= P0_0 = 1; //přiřazení hodnoty 1 prvnímu bitu P0 . amp;= ~, |= tyto dvě běžné syntaxe přiřazení bitů. (2) Shrnutí povolování přerušení Pokud je do programu zapojeno přerušení, musí být před jeho spuštěním povoleno. S ystém povolování přerušení C51, jeho hierarchická struktura je velmi zřejmá: šéf přerušení: EA je šéf, zodpovědný za celkové povolení přerušení: EA = 1; kapitán odpojení přerušení: další je pro každou funkční komponentu (jako je P0, časovač 1 atd.) povolení řízení, takový SFR obecně bitově adresovatelný, pojmenování obecně obsahuje IE (Interrupt Enable): P0IE = 1; členové týmu přerušení : odpojení, ale kvůli přerušeníprogramu musí být přerušení povoleno před spuštěním přerušení.
k aždý člen týmu přerušení: tým, ale protože každá funkční komponenta obsahuje také více přerušení, takže poslední úroveň je pro každou povolenou kontrolu přerušení, takový SFR není obecně bitově adresovatelný, pojmenovaný obecně obsahuje IE (Interrupt Enable) nebo IM (Interrupt Mask): PICTL | = 0x01; není třeba si pamatovat SFR přerušení SFR pro přerušení není třeba si pamatovat, pokud pochopíte jejich hierarchii a při jejich použití se pak podíváte do příručky nebo hlavičkových souborů. (3) Psaní programů pro přerušení Použití přerušení v programu se obecně skládá ze dvou částí: zápisu podprogramu obsluhy přerušení a otevření povolení přerušení. P ovolení přerušení bylo představeno výše, následuje stručný úvod k přípravě podprogramu obsluhy přerušení: Nejprve určete vektor přerušení, může být v hlavičkovém souboru ioCC2430.h v části dotazu Interrupt Vectors, syntaxe je následující: # pragma vector = Interrupt Vectors a poté následuje příprava obsluhy přerušení, struktura je následující: ___ interrupt void Function Name (___)
p řerušení void function name(void) { //na přerušení //obsluha přerušení //příznak přerušení clear 0 //vypnutí přerušení } III. Závěr V tomto článku jsme představili jednoduchý způsob implementace externího přerušení na bázi CC2430, přičemž základem je přerušení, dále jsme představili další velmi důležitý modul - časovač. CC2430 má celkem čtyři časovače, které lze rozdělit do tří kategorií: časovač 1, časovač 2, časovač 3/4 (3 a 4 použití stejného základu). stejný). </n;tt++). </n;tt++);. </n;tt++). </n;tt++); </n;tt++); </n;tt++); </n;tt++). </n;tt++). |