środa, 29 maja 2019

ATSAML10 - pierwsze mruganie LED

Moja płytka do ATSAML10 i 11 jest gotowa, czas zatem zacząć zabawę . Na pokładzie dla przypomnienia mamy ATSAML10E16 firmy Microchip w obudowie 32 pin. Programy pisać będę w środowisku SEGGER-a . Do wgrania wsadu i debugowania używam programatora J-LINK Edu Mini. Zabawę zaczynam od wgrania aktualnego firmware do programatora. W tym celu ściągam J-Link Software w wersji dla Windowsa. Po zainstalowaniu softu znajduję program J-Link Configurator i z jego poziomu robię update firmware programatora. Cały proces jest bardzo prosty, więc nie ma potrzeby tutaj się więcej nad tym rozwodzić. Aktualizacja programatora jest potrzebna bo rdzenie M23 i M33 to nowość na rynku. Swoją drogą praca z programatorem J-Link firmy SEGGER to czysta przyjemność.


Dioda LED na mojej płytce jest podłączona do pinu PA27. Co obrazuje poniższy schemat :


Naszym celem będzie spowodowanie aby dioda LED mrugała sobie ochoczo z wybraną częstotliwością . Bez zbędnych ceregieli odpalamy środowisko SEGGER, które po ok 3 s jest gotowe do działania. Witaj przygodo :)

Pierwszą czynnością po uruchomieniu środowiska jest doinstalowanie paczki dla ATSAML10. W tym celu z menu Tools wybieramy Package Manager :


W okienku , które wyskoczy znajdujemy rodzinę ATSAML10 i jeśli nie zainstalowana to klikamy dwa razy  w wierszu, aż w kolumnie Action pojawi się napis Install. Następnie na dole okienka klikamy na opcję Next i w kolejnym okienku również Next . Instalacja paczki zacznie się automatycznie. Na końcu klikamy Finish. Zainstalowana paczka wygląda jak poniżej, w kolumnie Status będzie na zielono napis Installed :


Teraz tworzymy nasz pierwszy Solution czyli taki kontener na projekty.
W takim kontenerze może być wiele projektów i mogą się one wspólnie widzieć.
Zatem File --> New Project  lub Create New w głównym oknie. W okienku , który wyskoczy nam wybieramy opcję jak poniżej :


Ścieżkę domyślną projektu zostawiamy jak jest. Zmieniamy tylko nazwę projektu na atsaml10_LED  . Klikamy Next. W okienku , który wyskoczy musimy wybrać model naszego mikrokontrolera czyli ATSAML10E16.


Potem w dwóch kolejnych okienkach NEXT. W ostatnim okienku opcje Debug i Relase muszą być zaznaczone i w tym okienku klikamy Finish.


Po ułamku sekundy zostanie utworzone nowe Solution z naszym projektem. W tym momencie biblioteki dla naszego MCU nie są jeszcze dołączone do projektu . Stanie się to dopiero po wybraniu opcji Build (F7). W projekcie mamy gotowy plik main.c ale jego zawartość wywalam i wsadzam swoją propozycję.


Do mrugania diodą LED wykorzystałem tykacz core ARM-a czyli  SysTick i jego przerwanie. Jeśli lizneliśmy ATSAML21 to z ATSAML10 i 11 czujemy się jak w domu. No jak się tak właśnie poczułem. Standardowo ATSAML10 po starcie ma zegar systemowy skonfigurowany na 4 MHz . Moduł PORT odpowiedzialny za piny budzi się z podpiętym zegarem na szynie, dlatego nie musimy tak jak np w STM32 konfigurować tego jak chcemy użyć pinu. Od samego początku jest wygodnie, za to ATSAM-y można polubić. Aczkolwiek nie należą one  do prostych mikrokontrolerów w okiełznaniu. Przyjrzyjmy się jak konfigurujemy pin PA27 jako wyjście, robimy to zapisem jak poniżej :

/*Set pin PA27 direction to Output*/
  PORT->Group[0].DIRSET.reg = PORT_PA27;

To jest zapis nazwijmy go "natywny" czyli operacje są wykonywane jak nabliżej rejestrów. Taki zapis daje najmniejszy narzut w pamięci i jest najszybszy. W odróżnieniu od zapisów wynikających z bibliotek typu HAL lub ASF w przypadku ATSAM-ów.

Spróbujmy rozbić na czynniki pierwsze powyższy zapis. Najpierw odwołujemy się do modułu nadrzędnego w którym jest interesujący nas rejestr. Nazwa tego modułu to PORT. Znaczek -> to symbol wskaźnika na element struktury. Wskazywanym elementem struktury jest tablica Group[] gdzie Group[0] to odwołanie do portu A a Group[1] do portu B etc. Kolejnym elementem jest nazwa rejestru DIRSET jest to "atomowa" reprezentacja rejestru DIR. Kolejnym elementem zapisu jest reg oznacza to ,że odwołujemy się do całego rejestru a nie do poszczególnego bitu (bit). PORT_PA27 reprezentuje zapis przesunięcia bitowego 1<<27

Są możliwe inne sposoby zapisu bez użycia rejestrów atomowych ale z ich użyciem jest moim zdaniem składniej. Dla przykładu pokażę jak wyglądałby zapis z użyciem rejestru atomowego gdybyśmy chcieli ustawić pin jako wejście :

/*Set pin PA27 direction to Input*/
  PORT->Group[0].DIRCLR.reg = PORT_PA27;

 

Zauważmy, że zmieniła się tylko nazwa rejestru na DIRCLR a na bicie 27 też ustawiamy 1, co w tym przypadku oznacza , że bit 27 w rejestrze DIR należy wyzerować. To taka specyfika operowania na rejestrach "atomowych". Operowanie na rejestrach "atomowych" powoduje , że żadne przerwanie nie jest w stanie zakłócić nam procesu operacji na rejestrze czyli jest operacją nie podzielną o ile w ekosystemie 8-bitowym nie było to problemem o tyle w 32-bitach już tak.

No dobrze ustawiliśmy sobie kierunek naszego pinu PA27, kolejnym krokiem jest wywołanie funkcji uruchamiającej SysTica-a. W każdym MCU z rdzeniem ARM jest to ta sama funcja SysTick_Config(). W przerwaniu od SysTicka toglujemy pinem PA27 na którym mamy naszego LED-a. Wykorzystujemy do tego rejestr "atomowy" OUTTGL

Skąd mamy wiedzieć jak nazywa się wektor przerwania ? czyli w naszym przypadku nazwa SysTick_Handler. Poniżej pokazuję źródło informacji o tym :



Na prawej belce jest pokazana ścieżka dostępu do pliku ATSAML10E16 Vector Table.

W sumie to nie ma dalej co się rozwodzić ,  mruganie diody działa zgodnie z oczekiwaniem. Wszystko gra i buczy. Czas się zająć czymś bardziej ambitnym czyli uruchomieniem wyświetlacza LCD jaki mamy na płytce. A do tego będzie nam potrzebne SPI. Więc następny wpis będzie pewnie o tym.



Pozdrawiam
picmajster.blog@gmail.com


Linki :

ATSAML10E16 - strona produktu







Brak komentarzy:

Prześlij komentarz