|
1. Połączenie górnego i dolnego poziomu W poprzednim wykładzie zapoznaliśmy się z podstawowym procesem rozwoju programu CC2430 IAR poprzez prosty eksperyment z miganiem LED. Nóż i tak został naostrzony (choć mój kamień do ostrzenia nie jest dobry), a teraz zacznę :) zabijać owady. Następnie poznajmy kilka podstawowych eksperymentów z CC2430. Każdy mały eksperyment podzielony jest na trzy części: "Wprowadzenie do eksperymentu", "Diagram przepływu programu" oraz "Kod źródłowy i analiza eksperymentalnego". Ten artykuł wyjaśnia zakłócenia zewnętrzne. 2. Zakłócenie zewnętrzne(1) Wprowadzenie do eksperymentuPrzerwania to wewnętrzny mechanizm, w którym mikrokontrolery przetwarzają zdarzenia wewnętrzne lub zewnętrzne w czasie rzeczywistym. Gdy wystąpi zdarzenie wewnętrzne lub zewnętrzne, system przerwań mikrokontrolera zmusza procesor do zatrzymania wykonywanego programu i zamiast tego przetworzenia zdarzenia przerwania. Przerwania dzielą się na zewnętrzne i wewnętrzne, a CC2430 zawiera łącznie 18 źródeł przerwań (szczegółowe opisy i definicje wektorów przerwań należy do "Chiński podręcznik CC2430》)。 Przyjrzyjmy się teraz schematowi obwodów tej płyty rozwojowej:
Przycisk S1 został podłączony do P0.1 na płycie deweloperskiej, a efektem tego eksperymentu jest wywołanie przerwania P0.1 przez przycisk S1, a następnie kontrola włączania/wyłączania LED1 w podprogramie serwisowym przerwania. (2) Zasada eksperymentu i schemat przepływuEksperymentalny schemat przepływu wygląda następująco:
(3) Eksperymentalny kod źródłowy//头文件
#include
//延时子函数
#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3
pustkaOpóźnienie(Niepodpisanyn)
{
Niepodpisanytt;
dla(tt =0; tt<n; tt++);
dla(tt =0; tt<n; tt++);
dla(tt =0; tt<n; tt++);
dla(tt =0; tt<n; tt++);
dla(tt =0; tt<n; tt++);
}
//32M晶振初始化
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 = 0; led2 = 0; led3 = 0; led4 = 0;
}
//io及外部中断初始化
pustkaio_init(pustka)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
pustkamain(pustka)
{ xtal_init(); led_init(); io_init();
podczas gdy(1); //等待中断
}
//中断服务子程序
#pragma wektor = P0INT_VECTOR
__interrupt pustkaP0_ISR(pustka)
{ EA =0; Brama jest przerwana
Opóźnienie(10000); Opóźnienie(10000); Opóźnienie(10000); Opóźnienie(10000); Opóźnienie(10000);
jeśli((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 led1 = !led1; } P0IF =0; //P0中断标志清0
EA =1; //开中断
}
Najpierw inicjalizuj zegar systemu: wybierz oscylator kryształu 32MHz. Następnie zainicjalizuj diody LED: ustaw P1 jako ogólny port I/O, ustaw kierunek P1.0 ~ P1.3 jako wyjście, a następnie wyłącz 4 diody LED. Następnie konfiguruj odpowiednie rejestry SFR dla zewnętrznych przerwań, aby umożliwić przerwania na wszystkich poziomach, obejmując 3 SFR:EA、IEN1、PICTL(Szczegóły dotyczące każdego SFR można znaleźć wChiński podręcznik CC2430》): EA- Umożliwienie całkowitego przerwania; IEN1.5- Przerwanie P0 umożliwia; OBRAZ.3—— Włączenie przerwania portu P0.1; OBRAZEK.0—— Ustaw drop edge portu P0.1 tak, aby powodował wyzwalanie przerwania. Następnie użyj while(1) w funkcji głównej i poczekaj na przerwanie. Porady CC2430(1) Podsumowanie składni przypisania bitów Często musimy przypisać bit (0 lub 1) do jednego bajtu SFR, aby precyzyjnie sterować urządzeniem sprzętowym. Jest SFRAdresowanie bitów wsparciaNa przykład TCON, P0 itd., obecnie przypisywanie kontrapunktów jest bardzo proste, wystarczy zapytać o definicję bitu w sekcji SFR Bit Access pliku nagłówka ioCC2430.h: P0_0 = 0; // przypisz 0 do pierwszej cyfry P0 P0_0 = 1; // przypisz wartość 1 pierwszej cyfry P0
Ale niektórych SFR tam nie maAdresowanie bitowe nie jest obsługiwane, jak w tym eksperymenciePICTL, w tym momencie chcesz przypisać wartość jednemu z nich, składnia jest następująca: PIKTL &= ~0x01; Przypisz wartość 0 pierwszej cyfrze OBRAZEK |= 0x01; Przypisz wartość 1 pierwszej cyfrze
Możesz zapamiętać&= ~,|=Te dwie powszechnie stosowane składnie przypisywania bitów. (2) Podsumowanie umożliwiania przerw Gdy w programie pojawia się przerwanie, musi być ono włączone przed jego wywołaniem. Hierarchia systemu włączenia przerwań C51 jest bardzo oczywista: Boss przerwania: EAjest szefem, odpowiedzialnymOgólnePrzerwanie Umożliwia: EA = 1;
Każdy przerwany dowódca drużyny: Następne jest dla każdego z nichCzęści funkcjonalne(np. P0, timer 1 itd.), takie SFR są zazwyczaj adresowalne bitowo, a nazwa zazwyczaj zawiera IE (Interrupt Enable): P0IE = 1;
Każdy członek zespołu został przerwany: Drużyna Ale ponieważ każda cecha zawiera także wiele przerwań, ostatni poziom jest właśnie do tegoKażde przerwanieTen typ SFR jest zazwyczaj bezbitowy i nieadresowalny, zwykle zawiera IE (Interrupt Enable) lub IM (Interrupt Mask) w nazwie: PICTL |=0x01;
Nie ma potrzeby powtarzać SFR przerwań, wystarczy zrozumieć jego hierarchię, a potem poświęcić czas na sprawdzenie pliku manualnego lub nagłówkowego. (3) Przerwanie pisania programów Zastosowanie przerwań w programie zazwyczaj obejmuje dwie części: zapis podprogramu usługi przerwań oraz otwarcie włączenia przerwań. Funkcja przerwań została wprowadzona powyżej, a poniżej znajduje się krótkie wprowadzenie do pisania podprogramu usługi przerwań: Najpierw określWektor przerwania, które można zapytać w sekcji Wektorów Przerwań w pliku nagłówka ioCC2430.h, z następującą składnią: #pragma wektor = wektor przerwania
Następnie natychmiast zapisz obsługę przerwań, która jest zorganizowana następująco: __interrupt nazwa funkcji void (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. PodsumowanieW tym artykule przedstawiono metodę implementacji prostych zewnętrznych przerwań opartą na CC2430, a po podstawie przerwań wprowadzimy kolejny bardzo ważny moduł – timery. CC2430 ma łącznie 4 timery, które można podzielić na trzy kategorie: timer 1, timer 2, timer 3/4 (3 i 4 to zasadniczo ten sam sposób). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|