03 ARM SAM4 – Obsługa przycisku

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;
}
}
}