środa, 6 kwietnia 2011

ARM: LPC1114 - Podłączenie

Autor: Deucalion
Redakcja: Dondu

Artykuł jest częścią cyklu: Kurs ARM: Spis treści 

W tej części zdobędziemy niezbędne minimum wiedzy jaka potrzebna jest nam do uruchomienia naszego mikrokontrolera, a więc jak go podłączyć i zaprogramować.

Teoretycznie do ożywienia naszego mikrokontrolera wystarczy podłączenie do niego napięcia zasilania. LPC1114 może pracować w zakresie napięć od 1,8V do 3,6V. Są to graniczne wartości, których lepiej unikać i przyjąć, że bezpiecznie jest zasilać napięciem z przedziału od 2V do 3,4V.

Każdy układ cyfrowy na zasilaniu powinien mieć kondensatory blokujące (filtrujące) zakłócenia. W tym przypadku jest dokładnie tak samo. LPC1114 posiada dwa piny zasilające (VDD) i dwie masy (VSS) - obudowa LQFP48. Obydwa piny zasilające muszą być podłączone do zasilania i każdy z tych pinów powinien mieć swój kondensator blokujący o wartości 100nF.




Przy wyższych częstotliwościach taktowania procesora (>25MHz) można równolegle ze 100nF dołożyć kondensatory tego samego typu o wielokrotnie mniejszych wartościach np. 10nF, co będzie skutkować jeszcze lepszymi parametrami zasilania mikrokontrolera i tym samym zakłócenia generowane przez mikrokontroler będą miały mniejszy wpływ na resztę układu.

Więcej na temat filtrowania zakłóceń możesz dowiedzieć się tutaj: Zasilanie mikrokontrolera





Po podaniu zasilania mikrokontroler zaczyna pracować mimo, że nie ma w nim jeszcze naszego programu. To co zaczyna w nim pracować to bootloader. Jest to program umożliwiający wgranie właściwego programu.

Bootloader wgrywany jest przez producenta na etapie produkcji mikrokontrolera i nie da się go wykasować, zmienić ani wyłączyć. Jest uruchamiany za każdym razem po podaniu zasilania lub po resecie mikrokontrolera. Sprawdza kilka warunków i jeśli są spełnione przekazuje sterowanie do głównego programu lub przechodzi w tryb programowania mikrokontrolera.

Za pomocą funkcji bootloadera można przeprogramować mikroprocesor z głównego programu (funkcje IAP). Bootloader odpowiada też za zabezpieczenie układu przed odczytem.

LPC1114 może pracować bez zewnętrznego rezonatora kwarcowego, wtedy źródłem sygnału zegarowego może być wewnętrzny oscylator RC 12MHz lub wewnętrzny oscylator RC watchdoga, którego częstotliwość może być programowana w zakresie od 7,8kHz do 1,7MHz. Po resecie mikrokontroler taktowany jest z wewnętrznego oscylatora RC 12MHz


Zewnętrzny oscylator

Zewnętrzny oscylator jest wymagany jeśli wymagane jest stabilne źródło sygnału zegarowego. Do zewnętrznego oscylatora można podłączyć rezonatory kwarcowe o częstotliwości od 1MHz do 25MHz. Jeśli będzie wykorzystywana pętla PLL zwielokrotniająca częstotliwość oscylatora, to wtedy rezonator kwarcowy nie może mieć mniej niż 10 MHz.

Dobierając rezonator należy wziąć pod uwagę to, że pętla PLL zwielokrotnia jego częstotliwość i jeśli zastosujemy jakąś popularną wartość takiego rezonatora np. 12MHz to maksymalną prędkością będzie 48MHz przy 50MHz maksymalnie dozwolonych. W większości przypadków 2MHz nie zrobią większej różnicy, ale mogą trafić się projekty, gdzie każdy MIPS jest ważny i wtedy trzeba wziąć to pod uwagę.


Programowanie LPC1114

Układ można zaprogramować poprzez interfejs SWD albo poprzez UART za pomocą bootloadera. SWD jest interfejsem do debugowania i wymaga odpowiednich przystawek oraz środowiska więc może być dla niektórych osób opcją nieosiągalną i kosztowną.

Programowanie za pomocą UARTa nie wymaga specjalnych przystawek, wystarczy zwykły konwerter poziomów RS232/LVTTL np. MAX3232 lub konwerter USB<->RS232-LVTTL np. FT232RL lub PL2303HX.

Wejście procesora w tryb programowania możliwe jest poprzez zwarcie do masy portu P0.1 w trakcie podawania zasilania lub resetu procesora. Tym samym projektując układ należy zadbać, aby w trakcie normalnego użytkowania urządzenia z tym procesorem, port P0.1 nie był w stanie niskim w momencie włączania lub resetu, ponieważ uniemożliwi to uruchomienie głównego programu.

Przykładowe schematy układów umożliwiających programowanie LPC1114:


Interfejs RS232
Wersja z manualnym wywołaniem trybu bootloadera. Wejście w tryb bootloadera następuje poprzez przytrzymanie przycisku S2 w trakcie podawania zasilania lub resetu wywołanego przyciskiem S1



  
Wersja z automatycznym wywołaniem trybu bootloadera poprzez program Flash Magic.




Interfejs USB z układem FT232RL
Wersja minimalna z automatycznym wywołaniem trybu bootloadera. Wadą tego rozwiązania jest brak możliwości wykorzystania portów P0.0 i P0.1 do innych celów niż programowanie procesora. Interfejs może pracować jako odrębny układ programatora.



Wersja rozszerzona o układ separacji sygnałów ISP_RESET i ISP_ENTER od procesora. Dzięki temu rozwiązaniu możliwe jest wykorzystanie portów P0.0 i P0.1 do innych celów.





Interfejs USB z układem PL2303HX
Wersja minimalna z automatycznym wywołaniem trybu bootloadera. Wadą tego rozwiązania jest brak możliwości wykorzystania portów P0.0 i P0.1 do innych celów niż programowanie procesora. Interfejs może pracować jako odrębny układ programatora. Wykorzystując przejściówki USB od telefonów wykonane na tym układzie należ podłączać je według tego schematu.




Wersja rozszerzona o układ separacji sygnałów ISP_RESET i ISP_ENTER od procesora. Dzięki temu rozwiązaniu możliwe jest wykorzystanie portów P0.0 i P0.1 do innych celów.





Flash Magic jest darmowym (tylko do zastosowań niekomercyjnych) programem umożliwiającym programowanie chyba wszystkich mikrokontrolerów NXP w tym LPC11xx. Program można pobrać ze strony http://www.flashmagictool.com. Instalacja tego programu nie wymaga specjalnego komentarza, wystarczy tylko potwierdzać kolejne kroki. Po zainstalowaniu i uruchomieniu Flash Magica należy go skonfigurować.

Główne okno programu podzielone jest na 5 części oznaczonych jako Step 1 do Step 5.




W pierwszej części STEP1 – Communications ustalamy typ procesora, parametry transmisji, interfejs i częstotliwość oscylatora.

W drugiej Step2 – Erase zaznaczamy, które bloki pamięci Flash mają być wymazane przed zaprogramowaniem. Można zaznaczyć indywidualnie poszczególne bloki lub zaznaczając odpowiednie checkboxy wymazać całą pamięć ewentualnie tylko te bloki pamięci flash, które mają pokrycie w pliku hex.

W trzeciej części Step – 3 Hex File wskazujemy plik hex, który jest naszym skompilowanym programem.

W czwartej części Step 4 – Options wybieramy za pomocą checkboxów czy po zaprogramowaniu program ma zweryfikować zawartość pamięci flash oraz czy wszystkie nieużywane komórki pamięci flash mają być wypełnione wartością 0x00.

Część Step 5 – Start to tylko przycisk rozpoczynający proces programowania.

Przed rozpoczęciem programowania należy jeszcze w opcjach zaawansowanych na zakładce Hardware Config ustawić czy linie DTR i RTS uczestniczą w procesie programowania i jeśli tak to je odpowiednio skonfigurować.


  




Jeśli wszystko mamy już skonfigurowane i nasz mikrokontroler podłączony jest do komputera możemy rozpocząć programowanie. Wcześniej dobrze jest sprawdzić komunikację poprzez próbę odczytania sygnatury procesora poprzez wybranie opcji Read Device Sygnature … menu ISP.




Jeśli łączność zostanie nawiązana powinniśmy zobaczyć taki wynik:




Jeśli pojawi się inny komunikat oznacza to, że program nie może połączyć się z procesorem i wtedy należy sprawdzić sam układ lub zmienić prędkość komunikacji na mniejszą. Bootloader po resecie procesora nie ma ustawionej jakieś konkretnej prędkości transmisji, ma za to funkcje automatycznego wykrywania prędkości transmisji. Do prawidłowego działania tej funkcji wymagane jest taktowanie procesora sygnałem o częstotliwości co najmniej 10MHz.


Pierwszy program – LED Blink.
Mając już skonfigurowane środowisko oraz procesor podłączony do komputera możemy przystąpić do stworzenia pierwszego programu na ARMa i załadowania go do procesora. Będzie to bardzo nieoryginalny program, a mianowicie miganie diodą LED :-).

Diodę z rezystorem ograniczającym prąd podłączamy do portu P0.2 i +3,3V lub masę zachowując odpowiednią polaryzację.



Pobieramy nowy szablon projektu: arm_podlaczenie_projekt.zip
i rozpakowujemy go gdzieś na dysku. Szablon ten w porównaniu do poprzednich został rozszerzony o interfejs CMSIS. Po rozpakowaniu zmieniamy nazwę katalogu z Projekt na LedBlink. Należy starać się unikać spacji w nazwach, ponieważ może to powodować problemy z dostępem do plików.

Z głównego katalogu projektu otwieramy plik projektu PN - Projekt.pnproj. Po lewej stronie powinniśmy ujrzeć drzewo z katalogami i plikami .

Zmieniamy nazwę projektu na LedBlink.




Otwieramy plik Projekt.mk i zmieniamy linijkę PROJECT = Projekt na PROJECT = LedBlink.
Zapisujemy i zamykamy ten plik.



Otwieramy plik main.c. Podmieniamy kod, który w nim jest na ten poniższy i zapisujemy.


#include "LPC11xx.h"

#define LED_PORT    (1 << 2) 

int
main( void )
{
    // Konfiguracja portu P0.2 
    LPC_GPIO0->DIR |= LED_PORT;    // Port P0.2 jako wyjście 
   
    // Pętla główna
    while( 1 )
    {
        for(int i = 0; i < 100000UL; i++ )
        {
            LPC_GPIO0->DATA;    // Odczyt portu jako dodatkowe opóźnienie
        }
        LPC_GPIO0->DATA ^= LED_PORT;    // Zmiana stanu portu na przeciwny
    }
}

Wszystko jest już gotowe i możemy skompilować nasz projekt poprzez naciśniecie przycisku F9. Jeśli wszystko zostało wykonane według powyższego opisu w katalogu bin/ powinny znajdować się 3 pliki, a wśród nich LedBlink.hex. Jest to plik z programem, który trzeba wgrać do procesora za pomocą programu Flash Magic. Po zaprogramowaniu procesora i uruchomieniu dioda powinna migać z częstotliwością około 4Hz.





Startup.c
W startupie znajduje się kilka funkcji, które odpowiadają za wstępną inicjalizację procesora zaraz po uruchomieniu, a następnie wywołaniu funkcji main(). Są to standardowe inicjalizacje wymagane przez standard języka C.

Poza tym w startupie ulokowana jest tablica wektorów przerwań wraz z domyślnymi funkcjami dla niektórych wyjątków. W AVR taki starup również się znajduje, jest on częścią AVR-Libc i jest dołączany w momencie konsolidacji. W przypadku AVR wpływ na startup możemy mieć jedynie za pomocą funkcji umieszczanych w odpowiednich sekcjach Init.

CMSIS - Cortex Microcontroller Software Interface Standard
Jest to standard biblioteki dla mikrokontrolerów z rdzeniami Cortex stworzony przez ARM w celu ułatwienia tworzenia programów na te rdzenie. W skład tych bibliotek wchodzą:
  • Definicje rejestrów
  • Definicje wektorów przerwań
  • Funkcje umożliwiające dostęp do peryferiów rdzenia
  • Funkcje umożliwiające wykorzystanie specyficznych instrukcji asemblerowych, z których nie korzystają kompilatory języka C/C++

Zobacz także:

Kurs ARM: Spis treści

11 komentarzy:

  1. Piszesz, że jest możliwość programowania z portu USB za pomocą układu FT232RL. Nie podałeś jednak żadnego schematu, jak skorzystać z takiego układu w tym przypadku. Chodzi o konkretne podłączenie do komputera i potem konfiguracja na PC portu do programowania.
    Większość nowych komputerów nie posiada już portów COM, USB wypiera wszystko.
    Na allegro można kupić za parę zł przejściówki USB-RS232. Jest to taniej niż sam układ FT232RL.
    Czy można w tym przypadku skorzystać z takiej przejściówki?
    Jeśli tak, to po tej przejściówce potrzebny jest również konwerter poziomów np max232? I jak wygląda konfiguracja portu programowania w takim przypadku?

    OdpowiedzUsuń
  2. W najprostszej wersji wystarczą tylko sygnały Rx i Tx układów FT232RL i PL2303HX. Sygnały te można podłączyć bezpośrednio do procesora. Tryb bootloadera można uruchomić utrzymując stan niski na porcie P0.1 w trakcie załączania zasilania.
    Jeśli potrzebny jest tryb automatyczny ISP wtedy trzeba podłączyć sygnały DTR i RTS. Sygnały te najlepiej podłączyć przez bufory 74HC125. Jak tylko znajdę chwilę, dodam schematy z FT232RL i PL2303HX. Kable od telefonów jak najbardziej się do tego celu nadają. Sam korzystam z takiego starej przejściówki na PL2303HX do Sony Ericssona T630. Podłączam ją bezpośrednio pod piny procesora. Ważne jest, aby stany wysokie na wyjściach tych przejściówek były na poziomie 3,3V. Konfiguracja portu jest taka sama dla wersji RS232 jak i USB. Parametry są na jednym z załączonych obrazków przedstawiających program Flash Magic.

    OdpowiedzUsuń
  3. Witam,na początku chcę podziękować bo sam artykuł jest dobry i przyjemny. Brakuje mi jednej tylko rzeczy mianowicie napisałeś, że jest możliwość programowania i debugowania poprzez ULINK2 jednak w artykule jest to zupełnie pominięte (uważam, że niesłusznie). Nie ma nawet informacji jak podłączyć ULINK2 do LPC1114. co pomogłoby przy projektowaniu płytki.pe

    OdpowiedzUsuń
  4. Czym się różni jtag od swd i który wybrać do programowania lpc1114 ?

    OdpowiedzUsuń
  5. A ta płyteczka z tego artykułu? Można gdzieś ją kupić, czy zaopatrzyć się w inną? Coś polecacie?

    OdpowiedzUsuń
    Odpowiedzi
    1. Najlepiej zaopatrzyć się w płytkę z serii LPCxpresso
      http://www.embeddedartists.com/products/lpcxpresso/lpc1115_xpr.php i używać jej ze środowiskiem LPCxpresso. Równie dobre będą tańsze które mają już jakieś wsparcie co najmniej od strony ISP, np. coś z kamami.pl.

      Usuń
  6. kopalnia wiedzy, naprawdę szacun.

    OdpowiedzUsuń
  7. Hej,
    Pytanie do testowego kodu.
    Nie bardzo rozumiem linię (a w zasadzie jej pochodzenie):

    #define LED_PORT (1 << 2)

    Skąd wiadomo że port P0.2 definiujemy na drugim bicie (licząc od zera)?
    Jak jest ogólna reguła dla zdefiniowania dowolnego pinu portu?
    Proszę o wyjaśnienie.

    OdpowiedzUsuń
    Odpowiedzi
    1. Bity portów są numerowane zgodnie z zasadą numerowania bitów liczb binarnych, czyli począwszy od zera. Liczba dwa oznacza więc trzeci bit danego portu.

      Usuń
  8. Mam pytanie o programowanie za pomocą FT232 czy wykorzystanie bramek w buforze (D i C) jest konieczne? czy wykorzystane są tylko dlatego bo bufor ma ich 4 więc żeby nie leżały odłogiem?

    Teoretycznie do separacji wystarczyły by A i B.
    Pytam bo myślę nad układem do programowania zarówno LXP jak i AVR i chciałbym nieco przerobić zaprezentowany schemat.

    OdpowiedzUsuń
    Odpowiedzi
    1. Jeśli myślisz nad ukłądem programującym AVR i ARM, t kup po prostu tani Atmel-ICE, który ma i JTAG/PDI/debugWire/TPI dla AVR i interfejs SWD dla ARM. Dodatkowo jeśli zdecydujesz się na ARM od Atmela to wszystko działa w jednym środowisku Atmel Studio, dzięki czemu nawet nie zauważysz, że pracujesz na AVR/ARM.

      Usuń