|
1. Połączenie górnego i dolnego poziomu W poprzednim artykule wspólnie dowiedzieliśmy się o implementacji prostych zewnętrznych przerwań. Teraz, gdy mamy praktyczne doświadczenie z przerwaniami, porozmawiajmy w tej sekcji o przerwaniach z timerem. CC2430 ma łącznie 4 timery, które można podzielić na 3 kategorie: timer 1, timer 2, timer 3/4 (użycie 3 i 4 jest takie samo). Ponieważ autor również jest nowy w CC2430 i praktycznie nie ma praktycznego doświadczenia w projektach związanych z timerami, nie zamierzam (i nie mogę nic zrobić) szczegółowo analizować timera. Ten artykuł zawiera jedynie krótkie eksperymentalne wyjaśnienie zastosowania timera 1 w przerwaniach przelewu liczenia i nie wspomina o funkcjach przechwytywania wejść/porównania wyjść/PWM. Timer 2 i Timer 3/4 to tylko proste wprowadzenia funkcji. Gdy umiejętności autora osiągną pewien poziom napięcia, stanę na szczycie praktycznego doświadczenia Zigbee, by poprawić ten esej. 2. Timer 1Timer 1 to 16-bitowy timer z modulacją szerokości timera/licznika/impulsu. Posiada 3 indywidualnie programowalne kanały do przechwytywania i wychodzenia wejściowych, z których każdy może być używany jako wyjście PWM lub jako czas brzegowy do przechwycenia sygnału wejściowego (informacje o tym, czym jest porównanie przechwytywania i wyjścia wejściowego oraz jak implementować wyjście PWM, czytelnicy mogą odwołać się do chińskiego podręcznika CC2430). Timery mają bardzo ważną koncepcję:Tryb działania。 Tryby pracy obejmują: tryb pracy swobodnej (Wolne przebieganie), tryb formy (modulo) oraz tryb dodatniego liczenia/odliczania (w górę-w dół)。 Poniżej znajduje się fragment chińskiego podręcznika CC2430 dotyczący wprowadzenia 3 trybów:
Porównując te trzy tryby, można zauważyć, że wartość przelewu trybu pracy swobodnej jest 0xFFFF niezmienna; Pozostałe dwa tryby pozwalają precyzyjnie kontrolować wartość przepełnienia timera poprzez przypisanie wartości T1CC0. W tym eksperymencie ta funkcja służy do wywołania przerwania co 1s przez timer przez konkretny T1CC0, aby precyzyjnie kontrolować interwał miganiań światła LED do 1s. (1) Wprowadzenie do eksperymentuW trybie modulo timera interwał światła LED jest precyzyjnie kontrolowany przez 1s, mianowicie: jasne 0,5s → ciemne 0,5s → jasne 0,5s → słabe 0,5s ...... → Światło 0,5 sekundy → ciemne 0,5 sekundy (czyli odstęp czasu od ciemnego do jasnego to 1 sekundy). Inwersja światła/ciemność uzyskuje się przez przerwania przepełnienia. (2) Schemat przepływu programu
(3) Istotne obliczeniaJak wspomniano wcześniej, status diody LED to: jasne 0,5 sekundy → ciemne 0,5 sekundy → jasne 0,5 sekundy → przyciemnione 0,5 sekundy ...... → 0,5s światło → 0,5s ciemne, i musi być zaimplementowane z przerwaniami przepełnienia, więc okres przelewu timera musi wynosić 0,5s. Aby to zrobić, należy obliczyć odpowiadającą wartość przepełnienia (tymczasowo ustawioną na N). Częstotliwość zegara systemu jest wybierana jako 32MHz, a dana częstotliwość domyślnie wynosi 16MHz (oba są określane przez specjalne rejestry funkcji).CLKCONSzczegóły można znaleźć w chińskim podręczniku CC2430). W Timer 1 ustaw jego przejście zegara na 128 dywizji. Podsumowując, lista wygląda następująco:
Aby znaleźć N=62500, jego liczba szesnastkowa to 0xF424, czyli należy ustawić T1CC0H=0xF4, T1CC0L=0x24 . (4) Kod źródłowy eksperymentalny i analiza/*
Opis eksperymentu: Eksperyment Timer Timer1, przepełnienie licznika timera, LED1
*/
#include
#define prowadził1 P1_0
#define LED2 P1_1
#define LED3 P1_2
#define LED4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
pustkaxtal_init(pustka)
{ SEN &= ~0x04; //都上电
podczas gdy(! (SEN &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Wybierz oscylator kryształowy 32MHz SEN |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
pustkaled_init(pustka)
{ P1SEL =0x00; P1 to zwykły port I/O P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 wyjście
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*T1初始化
-------------------------------------------------------*/
pustkatimer1_init(pustka)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM=1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; 128 crossover; tryb modulo (0x0000->T1CC0); Zacznij biec; T1IF=0; Usuń znak przerwy
}
/*主函数
-------------------------------------------------------*/
pustkamain(pustka)
{ xtal_init(); led_init(); timer1_init();
podczas gdy(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma wektor=T1_VECTOR __interruptpustkaT1_ISR(pustka)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
OK, skompiluję program i debuguję online, LED1 na płycie deweloperskiej zgodnie z planem i wydaje się, że interwał to około 1 sekundy. Ale to nie wystarczy, by udowodnić sukces eksperymentu – jeśli można ściśle określić interwał jako 1, będzie idealny~ Włączyłem więc zegar WIN 7 (kliknij na czas po prawej stronie paska zadań). Patrząc na sekundową wskazówkę, kątem oka zauważył LED1. Efekt: w ciągu dwóch minut tempo obu jest praktycznie identyczne (ta precyzja jest do zniesienia~). Na tym etapie można powiedzieć, że eksperyment jest praktycznie zakończony, hehe~ 3. Timer 2Timer 2 jest również nazywanyTimer MAC, jest specjalnie zaprojektowany do obsługi protokołu śledzenia zdarzeń w IEEE 802.15.4 MAC. Timer posiada 8-cyfrowy licznik przepełnienia, który może służyć do zapisywania liczby zaliczonych cykli; Istnieje 16-bitowy rejestr przechwytu, który rejestruje dokładny moment, kiedy ramka zaczyna odbierać/wysyłać lub dokładny czas zakończenia transmisji. Zawiera także 16-bitowy rejestr porównawczy wyjść, który generuje różne sygnały sterujące poleceń (start accepting, start send itp.) do modułu bezprzewodowego w określonym czasie. 4. Timer 3/4Timer 3/4 to 8-bitowy timer z funkcją timera/licznika/PWM. T3/T4 posiada 2 kanały porównawcze wyjść, z których każdy może być używany jako wyjście PWM. 5. PodsumowanieTa sekcja głównie uczy się metody przerwania przelewu licznika w timerze 1 oraz precyzyjnie kontroluje interwał światła LED w wysokości 1. Kilka innych timerów to tylko udar, a potem wrócę, żeby je dodać. W następnej sekcji przedstawimy komunikację portową CC2430.
|