| I. Kontynuacja poprzedniego artykułu W poprzedniej części poznaliśmy implementację prostych przerwań zewnętrznych. Po zdobyciu praktycznego doświadczenia z przerwaniami, w tej sekcji omówimy przerwania timerów. CC2430 ma 4 timery, które można podzielić na 3 kategorie: Timer1, Timer2, Timer3/4 (użycie 3 i 4 jest takie samo). Ponieważ autor również dopiero dotyka CC2430, projekt obejmujący doświadczenie timera jest w zasadzie zerowy, więc nie zamierzam (i nie mogę pomóc) w dogłębnej analizie timera. Ten artykuł dotyczy tylko użycia przerwania przepełnienia timera 1 w celu przeprowadzenia prostej eksploracji eksperymentalnej, ponieważ jego funkcja przechwytywania wejścia / porównania wyjścia / PWM została pominięta. Timer 2 i Timer 3/4 są również wprowadzone tylko krótko. Czekam, aż moc autora osiągnie pewien poziom ognia, a następnie stanie na wysokości bojowego doświadczenia Zigbee, aby ulepszyć ten esej. Timer 1 Timer1 to 16-bitowy timer z funkcjami timera/licznika/modulacji szerokości impulsu. Posiada trzy indywidualnie programowalne kanały przechwytywania wejścia/porównywania wyjścia, z których każdy może być używany jako wyjście PWM lub używany do przechwytywania czasu zbocza sygnału wejściowego (aby uzyskać więcej informacji na temat tego, czym jest przechwytywanie wejścia/porównywanie wyjścia i jak zaimplementować wyjścia PWM, czytelnicy mogą samodzielnie zapoznać się z chińską instrukcją CC2430). Timer ma bardzo ważną koncepcję: tryb pracy. Tryby pracy obejmują: pracę swobodną, modulo i up-down. Poniżej znajduje się wprowadzenie do tych trzech trybów z chińskiej instrukcji obsługi CC2430:
Porównując te trzy tryby, można zauważyć, że: wartość przepełnienia w trybie swobodnym wynosi 0xFFFF i nie można jej zmienić; podczas gdy pozostałe dwa tryby można dokładnie kontrolować, przypisując wartość do T1CC0 w celu precyzyjnego kontrolowania wartości przepełnienia timera. W tym eksperymencie wykorzystano tę funkcję, aby timer wyzwalał przerwanie co 1 s za pośrednictwem określonej wartości T1CC0, aby precyzyjnie kontrolować interwał migania diody LED wynoszący 1 s. (1) Wprowadzenie do eksperymentu W trybie modulo timera, interwał migania diody LED jest precyzyjnie kontrolowany i wynosi 1s, tj.: jasny 0,5s → ciemny 0,5s → jasny 0,5s → ciemny 0,5s ...... → jasny 0,5s → ciemny 0,5s (tj. moment przejścia z ciemności do światła wynosi 1s). Odwrócenie jasności/ciemności jest realizowane przez przerwanie przepełnienia. (2) Schemat blokowy programu (3) Powiązane obliczenia Jak wspomniano wcześniej, stan diody LED to: jasny 0.5s → ciemny 0.5s → jasny 0.5s → ciemny 0.5s ...... → jasny 0,5s → ciemny 0,5s i muszą być osiągnięte z przerwaniem przepełnienia, więc okres przepełnienia timera musi wynosić 0,5s. W tym celu należy obliczyć odpowiednią wartość przepełnienia (tymczasowo ustawioną na N). Częstotliwość zegara systemowego jest wybrana jako 32 MHz, a częstotliwość zegara dostarczana do timera wynosi domyślnie 16 MHz (oba są konfigurowane przez specjalny rejestr funkcji CLKCON, który można znaleźć w chińskiej instrukcji obsługi CC2430). Dla timera 1 należy ustawić częstotliwość zegara na 128 podziałów. Podsumowując, formuła może wyglądać następująco:
c
Dowiedz się N = 62500, jego szesnastkowy to 0xF424, czyli musisz ustawić T1CC0H = 0xF4, T1CC0L = 0x24, czyli .
(4) eksperymentalny kod źródłowy i analiza/* Opis eksperymentu: eksperyment z timerem1, przepełnienie licznika timera, miganie diody LED1 */ #include #define led1 P1_0 #define led2 P 1_1 #define led3 P1_0 #define led3 P1_1
1 #define led3 P1_2 #define led4 P1_3 &
n bsp; /* inicjalizacja zegara systemowego-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& nbsp; // oba włączają sięwhile (! (SLEEP & 0x40 )); //oscylator krystaliczny włączony i stabilny CLKCON &=~0x47; &
nbsp; //wybór oscylatora kwarcowego 32MHz SLEEP |=0x04; }/*Inicjalizacja diod LED-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1 jest normalnym portem I/O P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 wyjścia led1 =1; &
nbsp; //Wyłącz wszystkie diody led2 =1; led3 =1; led4 =1; }/*Inicjalizacja timera T1---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; //włącz przerwanie całkowite & nbsp; T1IE=1; // włączenie przerwania T1OVFIM=1; // włączenie przepełnienia T1
T 1CC0L=0x24; //wartość przepełnienia niska 8 bitówT1CC0H=0xF4; //wartość przepełnienia wysoka 8 bitów &
nbsp; T1CTL =0x0e; //128 podziałów; tryb modulo (0x0000->T1CC0); rozpoczęcie pracy;T1IF=0; &
nbsp; // wyczyść flagę przerwania }/* główna funkcja-------------------------------------------------------*/void main( void
) { xtal_init(); led_init(); timer1_init();while ( 1 ); &
nbsp; //czekaj na przerwanie przepełnienia }/*Podprogram obsługi terminala T1-------------------------------------------------------*/#pragma vector=T1_VECTOR__interrupt
v oid T1_ISR( void ) {EA=0; //wyłącz przerwanie led1 = !
led1; //LEDs reversedEA=1; //On interrupt  
; T1CTL &=~0x10; //wyczyść flagę przerwania } OK, kompilacja programu i debugowanie online, płytka rozwojowa na LED1 miga zgodnie z oczekiwaniami, czuć interwał migania około 1s. Ale to nie wystarczy, aby udowodnić sukces eksperymentu, jeśli można rygorystycznie określić interwał 1s byłby idealny ~ więc otworzyłem zegar WIN 7 (kliknij po prawej stronie paska zadań czas może być). Obserwując sekundnik, kątem oka zerknąłem na migającą diodę LED1. Wynik jest następujący: w ciągu dwóch minut tempo obu jest w zasadzie identyczne (tę dokładność można tolerować ~). W tym momencie eksperyment można uznać za zakończony, hehe~. Po trzecie, Timer 2 Timer2, znany również jako timer MAC, został specjalnie zaprojektowany do obsługi protokołu śledzenia zdarzeń w IEEE 802.15.4 MAC. Timer ma 8-bitowy licznik przepełnienia, który może być używany do rejestrowania liczby cykli, które wystąpiły; ma 16-bitowy rejestr przechwytywania, który służy do rejestrowania dokładnego czasu odebrania / wysłania ogranicznika początku ramki lub dokładnego czasu zakończenia transmisji; a także zawiera 16-bitowy wyjściowy rejestr porównawczy, który służy do generowania różnych selektywnych sygnałów komunikacyjnych do modułu bezprzewodowego w określonym czasie (rozpoczęcie odbierania, rozpoczęcie nadawania itp.). Timer 3/4 Timer 3/4 to 8-bitowy zegar z funkcjami timera/licznika/PWM. t3/t4 ma dwa wyjściowe kanały porównania, z których każdy może być używany jako wyjście PWM. V. Podsumowanie W tej sekcji poznaliśmy metodę liczenia przerwania przepełnienia timera 1 i osiągnęliśmy precyzyjną kontrolę interwału migania diody LED wynoszącego 1 s. Prześledzimy tylko pozostałe timery, a następnie wrócimy, aby dodać je później. W następnej sekcji przedstawimy komunikację portu szeregowego CC2430. |