[3] Tworzenie aplikacji .NET MF dla STM32F429I-DISCOVERY
W poprzedniej części stworzyliśmy aplikację, która wykorzystując bibliotekę dostarczoną przez ST sterowała diodami LED. Teraz zrobimy to samo, ale bez użycia tej biblioteki.
Sterowanie liniami GPIO
Aby mieć dostęp do klas niezbędnych do wykonania zadania musimy dodać do aplikacji przestrzeń nazw Microsoft.SPOT.Hardware, chodzi konkretnie o klasę OutputPort, która pozwala sterować linią GPIO. Diody dołączone są do linii PG13 i PG14, musimy utworzyć obiekty klasy OutputPort, a jako argumenty podajemy numer linii oraz stan jaki ma przybrać linia po jej inicjalizacji (true dla jedynki lub false dla zera). Numer linii podajemy licząc od PA0, czyli: PA0 to linia 0, PA1 – 1 … PB0 – 16, PB1 – 17 itd., czyli dla linii PG13 i PG14 będą to linie 6 * 16 + 13 i 6 * 16 + 14. Po utworzeniu obiektu możemy sterować stanem linii używając metody Write. Oto kod programu:
using System.Threading; using Microsoft.SPOT; using Microsoft.SPOT.Hardware; namespace MFPrzykladGPIO { public class Program { public static void Main() { OutputPort led1, led2; led1 = new OutputPort((Cpu.Pin)(6 * 16 + 13), false); led2 = new OutputPort((Cpu.Pin)(6 * 16 + 14), false); while (true) { led1.Write(true); led2.Write(false); Thread.Sleep(500); Debug.Print("Tik"); led1.Write(false); led2.Write(true); Thread.Sleep(500); Debug.Print("Tak"); } } } }
Odczytywanie stanu linii GPIO
Aby odczytać stan linii GPIO mikrokontrolera tworzymy obiekt typu InputPort podając trzy argumenty:
- numer linii (liczony analogicznie jak przy linii wyjściowej),
- wartość true jeśli chcemy aby drgania styków zostały wyeliminowane, w przeciwnym przypadku false,
- jedną z wartości Port.ResistorMode określającą konfigurację rezystora podciągającego, dostępne wartości to: Disabled, PullDown i PullUp.
Po utworzeniu obiektu wartość zwracana przez metodę Read odwzorowuje stan linii. Poniżej znajduje się kod programu, który zaświeca diodę LED1 jeśli naciśnięty jest przycisk USER.
using Microsoft.SPOT; using Microsoft.SPOT.Hardware; namespace MFPrzykladGPIO { public class Program { public static void Main() { OutputPort led1; InputPort button; led1 = new OutputPort((Cpu.Pin)(6 * 16 + 13), false); button = new InputPort((Cpu.Pin)(0), true, Port.ResistorMode.Disabled); while (true) { led1.Write(button.Read()); } } } }
Obsługa przerwań zewnętrznych
Do obsługi przerwań zewnętrznych służy klasa InterruptPort, obiekty tej klasy tworzymy podobnie jak w przypadku InputPort, ale podajemy jeszcze jeden argument, który określa w jakiej sytuacji ma być wygenerowane przerwanie, dostępne wartości to: InterruptNone, InterruptEdgeLow, InterruptEdgeHigh, InterruptEdgeBoth, InterruptEdgeLevelHigh i InterruptEdgeLevelLow. Dodatkowo musimy dodać obsługę zdarzenia OnInterrupt, ta operacja wygląda następująco:
button.OnInterrupt += new NativeEventHandler(OnButtonPress);
OnButtonPress to nazwa funkcji, która zostanie wywołana po wygenerowaniu przerwania, musimy ją zdefiniować. Kod programu, który na zmianę zaświeca i gasi diodę LED1 po naciśnięciu przycisku USER przedstawiono poniżej:
using System; using Microsoft.SPOT; using Microsoft.SPOT.Hardware; namespace MFPrzykladGPIO { public class Program { static OutputPort led1; public static void Main() { InterruptPort button; led1 = new OutputPort((Cpu.Pin)(6 * 16 + 13), false); button = new InterruptPort((Cpu.Pin)(0), true, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeHigh); button.OnInterrupt += new NativeEventHandler(OnButtonPress); while (true) { } } static void OnButtonPress(UInt32 port, UInt32 state, DateTime time) { if (led1.Read()) led1.Write(false); else led1.Write(true); } } }