Przedstawie dzisiaj obsługę przycisku, dla procesora SAM4 zastosowaniem zestawu rozwojowego SAM4S – XPLD. Celem naszego programu będzie zapalenie diody LED w przypadku wciśnięcia przycisku. W zestaw uruchomieniowy mamy wbudowane dwa przyciski przedstawione na poniższym schemacie:
Pierwszy z przycisków opisanych na schemacie jako NRST służy do resetu układu i nie mamy do niego bezpośredniego dostępu. Drugi przycisk opisany jako User Button jest ogólnego przeznaczenia i mamy do niego dostęp za pośrednictwem portu A i pinu 5. Wywołanie stanu wysokiego polega na podłączenia pinu do masy, jednak wewnętrznie pin musi być podciągnięty do rezystora podciągającego. Pisanie programu rozpoczynamy od zdefiniowania wejścia na 5 pinie za pomocą poniższej definicji:
#define Button (1<<5)
Musimy również zdefiniować diodę LED która jest podłączona do portu C na pinie 10.
#define LEDA (1<<10)
Poza tym uprościmy sobie zapalanie diody i od razu zdefiniujemy jej gaszenie i zapalanie.
#define LEDA_on PIOC->PIO_CODR = LEDA
#define LEDA_off PIOC->PIO_SODR = LEDA
,teraz na początku programu musimy dokonać ustawienia portów dla diody led::
WDT->WDT_MR=WDT_MR_WDDIS; // Wyłączenie funkcji watchdog
PIOC->PIO_PER = LEDA; // Uruchomienie rejestru
PIOC->PIO_OER = LEDA; // Ustawia rejestr C jako wyjście
PIOC->PIO_PUDR = LEDA; // Wyłącza rezystroy podciągające
teraz może przystąpić do uruchomienia przycisku, zaczynamy od uruchomienia odpowiedniego pinu w rejestrze A:
PIOA->PIO_PER = Button;
następnie pojawią się nam nowy rejestr ODR (Output Disable Register), dla portu C ma on numer 0x400E1214 ( str. 592 SAM4S Series DATASHEET) ustawia on pin jako wyjście i jest odwrotnością rejestru OER.
Następy krok to musimy podciągnąć rezystor podciągający do interesującego nas wejścia przy użyciu poniższego rejestru.
PIOA->PIO_PUER = Button;
Aby wejścia zostały uruchomione musimy załączyć zasilanie zegarów odpowiedzialnych za wejścia co wykonuje się za pomocą poniższej procedury, w procesorach ARM mamy bardzo rozbudowane opcje zasilania i możemy w celu redukcji zużycia energii wyłączyć bardzo wiele wewnętrznych układów. Załączenie zasilania odbywa się poniższym zapisem:
PMC->PMC_PCER0 = 1<<11;
Teraz przejdźmy do tematu jak w głównej pętli programu wykryć naciśnięcie przycisku. Informacja o wjeściu sygnału z danego pinu znajduje się w rejestrze PIO_PDSR (str. 600 SAM4S Serier Datascheet). Poniżej pokazano kod realizujący odczytanie wartości na wejściu i w przypadku pozytywnej zapalenie diody:
if (!(PIOA->PIO_PDSR & Button))
{
LEDA_on;
}
Poniżej możemy podejrzeć pełen kod programu:
#include "sam.h"
#define LEDA (1<<10)
#define Button (1<<5)
#define LEDA_on PIOC->PIO_CODR = LEDA
#define LEDA_off PIOC->PIO_SODR = LEDA
int main(void)
{
/* Initialize the SAM system */
SystemInit();
WDT->WDT_MR=WDT_MR_WDDIS; // Wyłączenie funkcji watchdog
PIOC->PIO_PER = LEDA; // Uruchomienie rejestru
PIOC->PIO_OER = LEDA; // Ustawia rejestr C jako wyjście
PIOC->PIO_PUDR =LEDA; // Wyłącza rezystory podciągające
PIOA->PIO_PER = Button;
PIOA->PIO_PUER = Button;
PMC->PMC_PCER0 = 1<<11;
while (1)
{
LEDA_off;
if (!(PIOA->PIO_PDSR & Button))
{
LEDA_on;
}
}
}