| I. Przejście od poprzedniego do następnego wykładu W poprzednim wykładzie zapoznaliśmy się z podstawowym procesem tworzenia programów CC2430 w IAR poprzez mały eksperyment z najprostszą migającą diodą LED. Nóż został przynajmniej naostrzony (chociaż nie jestem zbyt dobry w tym ostrzeniu na kamieniu), a teraz czas zacząć rzeź błędów :). Następnie nauczmy się kilku podstawowych eksperymentów CC2430. Każdy mały eksperyment, podzielony na "eksperymentalne wprowadzenie", "schemat blokowy programu", "eksperymentalny kod źródłowy i analiza" trzy części opisu. W tym artykule wyjaśniono przerwanie zewnętrzne. Po drugie, przerwanie zewnętrzne(1) Wprowadzenie do eksperymentu Przerwanie to wewnętrzny mechanizm mikrokontrolera czasu rzeczywistego służący do obsługi zdarzeń wewnętrznych lub zewnętrznych. Gdy wystąpi jakieś zdarzenie wewnętrzne lub zewnętrzne, system przerwań mikrokontrolera zmusi CPU do wstrzymania wykonywanego programu, ale przejdzie do przetwarzania zdarzenia przerwania, przetwarzanie przerwania zostanie zakończone, a następnie powróci do przerwania przez program, kontynuując wykonywanie. Przerwania są podzielone na przerwania zewnętrzne i wewnętrzne, CC2430 zawiera łącznie 18 źródeł przerwań (szczegółowy opis przerwań i definicję wektora przerwań można znaleźć w " CC2430 Chinese Manual "). Przyjrzyjmy się teraz schematowi obwodu tej płytki rozwojowej:
Płytka rozwojowa została podłączona do przycisku S1 i P0.1, efektem tego eksperymentu jest wyzwolenie przerwania P0.1 przez naciśnięcie klawisza S1, a następnie sterowanie światłem LED1 w podprogramie obsługi przerwania. (2) Zasada eksperymentu i schemat blokowy Schemat blokowy eksperymentu jest następujący:
c
(3) Eksperymentalny kod źródłowy// plik nagłówkowy#include // podfunkcja 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 crystal initialisationvoid xtal_init( void ) { SLEEP &=~0x04; & nbsp; //all power upwhile (! (SLEEP & 0x40 )); //oscylator krystaliczny włączony i stabilny CLKCON &=~0x47; &
nbsp; //Select 32MHz crystal oscillator SLEEP |=0x04; }//LED initialisationvoid led_init( void ) { P1SEL =0x00;  
; //P1 jest normalnym portem I/O P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Wyjście
led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//io i inicjalizacja przerwań zewnętrznychvoid io_init( void ) { P0INP &=~0X02;
/ /P0.1 ma pull-up i 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 ); //czekaj na przerwanie }//podprogram obsługi przerwania#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;
/ /wyłącz przerwanie Delay
( 10000 ); Delay(10000 ); Delay(10000 ); Delay( 10000 ); Delay(10000 ); &
nbsp; if ((P0IFG & 0x02 ) >0 ) //przerwanie klucza { P0IFG &=~0x02; &
nbsp; //P0.1 flaga przerwania clear 0 led1 = !led1; } P0IF =0; &
nbsp; //P0 flaga przerwania czysta 0 EA =1; & nbsp; // włączenie przerwania } Najpierw zainicjuj zegar Unity: wybierz oscylator kwarcowy 32 MHz. Następnie zainicjuj diody LED: ustaw P1 jako port I/O ogólnego przeznaczenia, ustaw kierunek P1.0 ~ P1.3 jako wyjście, a następnie wyłącz 4 diody LED. Następnie skonfiguruj odpowiednie rejestry SFR dla przerwań zewnętrznych i włącz obsługę przerwań na wszystkich poziomach, obejmując 3 rejestry SFR: EA, IEN1, PICTL (szczegółowy opis każdego rejestru SFR znajduje się w " CC2430 Chinese Manual "): EA -- całkowite zezwolenie na przerwanie; IEN1.5 -- zezwolenie na przerwanie P0; PICTL.3 -- włączenie przerwania portu P0.1; PICTL.0 -- ustawienie opadającego zbocza wejścia portu P0.1 w celu wywołania przerwania. Następnie użyj while(1) w głównej funkcji, aby poczekać na przerwanie. Wskazówki CC2430(1) Podsumowanie składni przypisywania bitów Bardzo często musimy przypisać wartość (0 lub 1) do bitu w jednobajtowym rejestrze SFR, aby precyzyjnie sterować urządzeniem sprzętowym. N iektóre SFR obsługują adresowanie bitowe , takie jak TCON, P0 itp., w tym momencie przypisanie bitu jest bardzo proste, wystarczy zapytać plik nagłówkowy ioCC2430.h w części SFR Bit Access definicji bitu może być: P0_0 = 0; // P0 pierwszy bit przypisania wartości 0 P0_0 = 1; / / / P0 pierwszy bit przypisania wartości 1 Istnieją jednak SFR, które nie obsługują adresowania bitowego, jak w przypadku pierwszego bitu przypisania wartości pierwszego bitu pierwszego bitu pierwszego bitu pierwszego bitu drugiego bitu . Jednak niektóre SFR nie obsługują adresowania bitowego, takie jak PICTL w tym eksperymencie, gdy chcesz przypisać wartość do jednego z nich, składnia jest następująca: PICTL &= ~0x01 ; //przypisanie wartości 0 do pierwszego bitu PICTL |= 0x01; //przypisanie wartości 1 do pierwszego bitu Możesz zapamiętać, że & amp;= ~, |= ~, |= ~, |= P0_0 = 1; //przypisanie wartości 1 do pierwszego bitu P0 . amp;= ~, |= to dwie typowe składnie przypisywania bitów. (2) Podsumowanie włączania przerwań Gdy w programie występuje przerwanie, musi ono zostać włączone przed jego wyzwoleniem. S ystem włączania przerwań C51, jego hierarchiczna struktura jest bardzo oczywista: szef przerwania: EA jest szefem, odpowiedzialnym za całkowite włączenie przerwania: EA = 1; kapitan odłączenia przerwania: następny jest dla każdego komponentu funkcjonalnego (takiego jak P0, timer 1 itp.) Włącz kontrolę, takie SFR ogólnie adresowalne bitowo, nazewnictwo ogólnie zawiera IE (Interrupt Enable): P0IE = 1; członkowie zespołu przerwań : odłączenie, ale z powodu przerwaniaprogramu , przerwanie musi zostać włączone przed wyzwoleniem przerwania.
k ażdy członek zespołu przerwań : zespół, ale ponieważ każdy komponent funkcjonalny zawiera również wiele przerwań, więc ostatni poziom jest dla każdego sterowania włączaniem przerwań, taki SFR nie jest zwykle adresowalny bitowo, nazwany ogólnie zawiera IE (Interrupt Enable) lub IM (Interrupt Mask): PICTL | = 0x01; nie trzeba zapamiętywać SFR przerwań Nie ma potrzeby zapamiętywania przerwań SFR, o ile rozumiesz ich hierarchię, a następnie zapoznaj się z instrukcją lub plikami nagłówkowymi, gdy ich używasz. (3) Pisanie programów obsługi przerwań Użycie przerwań w programie składa się zasadniczo z dwóch części: napisania podprogramu obsługi przerwania i otwarcia zezwolenia na przerwanie. W łączanie przerwań zostało przedstawione powyżej, poniżej znajduje się krótkie wprowadzenie do przygotowania podprogramu obsługi przerwań: Przede wszystkim należy określić wektor przerwań, może on znajdować się w pliku nagłówkowym ioCC2430.h w części zapytania Interrupt Vectors, składnia jest następująca: # pragma vector = Interrupt Vectors , a następnie należy przygotować program obsługi przerwań, struktura jest następująca: ___ interrupt void Function Name (___)
i nterrupt void function name(void) { //on interrupt //interrupt handling //interrupt flag clear 0 //off interrupt } III. Podsumowanie Niniejszy artykuł przedstawia prostą metodę implementacji przerwania zewnętrznego w oparciu o CC2430, z podstawą przerwania, a następnie przedstawiamy kolejny bardzo ważny moduł - timer. CC2430 ma w sumie cztery timery, które można podzielić na trzy kategorie: timer 1, timer 2, timer 3/4 (3 i 4 z wykorzystaniem tego samego podstawowego). tego samego). </n;tt++). </n;tt++);. </n;tt++). </n;tt++); </n;tt++); </n;tt++); </n;tt++). </n;tt++). |