środa, 31 grudnia 2014

LPC1768-MiniDK-2 jednolita nazwa interfejsu USB w sytemie Linuks

Podłączając LPC1768-MiniDK-2 do portu USB komputera w celu zaprogramowania ISP w systemie Linuks często pojawiał się w systemie jako urządzenie o rożnych nazwach. Czasami /dev/ttyUSB0, innym razem /dev/ttyUSB1, kolejnym razem kiedy wczesnej był podpięty modem LTE jako /dev/ttyUSB4.
Taki chaos nie mógł dalej panować, dlatego, cdn...

czwartek, 11 grudnia 2014

Programowanie mikrokontrolerów LPC poprzez ISP programami Flash Magic i lpc21isp

Mikrokontrolery LPC pozwalają programować wbudowaną w swoją strukturę pamięć flash poprzez In-System Programming w skrócie ISP, zwykle przez interfejs UART co na początku pozwala zaoszczędzić trochę grosza, nie jest konieczny zakup programatora / debuggera JTAG, którego koszt często przekracza 100 zł.
Zaraz po resecie albo po włączeniu zasilania mikrokontrolera sprawdzany jest stan pewnego pinu, jeżeli występuje na nim stan niski wtedy uruchamiany jest ze specjalnego obszaru pamięci nie dostępnego dla użytkownika tzw. bootloader, który to komunikuje się z urządzeniem zewnętrznym (np. program Flash Magic na komputerze PC) zwykle poprzez port UART poprzez odpowiedni protokół.
Jeśli chodzi o pin na, który należy podać przy "rozruchu" stan niski zależne jest to od mikrokontrolera, i tak dla LPC1114  jest to P0.1, dla LPC1768 P2.10. Dokładnie jest to opisane w podręczniku użytkownika, czyli tzw. User Manual (UM) zawarty też tam jest opis protokołu podczas programowania ISP - być może ktoś sam napiszę nowy program do na komputer :)
Tak na marginesie UM to podręcznik, z którym musisz się zapoznać jeśli chcesz poważnie programować dany mikrokontroler LPC, zawarto w nim opis rejestrów i poszczególnych interfejsów mikrokontrolera.
Ponieważ w Internecie można znaleźć wiele opisów programowania ISP przy użyciu programu Flash Magic w pierwszej kolejności opiszę program lpc21isp dla systemu operacyjnego Linuks, choć bez problemu można skompilować dla systemu Windows.
Program lpc21isp mimo mylącej nazwy programuje większość mikrokontrolerów LPC.
Program należy pobrać ze strony http://lpc21isp.sourceforge.net aktualnie najnowsza wersja 197 przy próbie kompilacji krzyczy następującym błędem:

/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status
make: *** [lpc21isp] Błąd 1


Aby poprawnie skompilować należy w pliku Makefile odnaleźć następującą linie:


lpc21isp: lpc21isp.c adprog.o lpcprog.o lpcterm.o $(GLOBAL_DEP)
    $(CC) $(CDEBUG)  $(CFLAGS) -o lpc21isp lpc21isp.c adprog.o lpcprog.o lpcterm.o 


na następującą:

lpc21isp: lpc21isp.c adprog.o lpcprog.o lpcterm.o $(GLOBAL_DEP)
    $(CC) $(CDEBUG)  -o lpc21isp lpc21isp.c adprog.o lpcprog.o lpcterm.o


Następnie wydać polecenie make, które wykona skrypt kompilacji zawarty w Makefile.
Chcąc zaprogramować mikrokontroler wydaj polecenie:

lpc21isp plik_z_programem.hex /dev/ttyS0 115200 12000

do mikrokontrolera zostanie załadowany wsad zawarty w pliku plik_z_programem.hex przez port /dev/ttyS0 z prędkością 115200. Ostatnia wartość to taktowanie oscylatora podpiętego pod mikrokontroler w kHz.
Aby wgrać plik binarny należy dodać przełącznik -bin

lpc21isp -bin plik_z_programem.bin /dev/ttyS0 115200 12000

Chcąc zaprogramować mikrokontroler rodziny LPC pod systemem operacyjnym Windows zwykle używa się programu Flash Magic, choć istnieje wersja programu lpc21isp skompilowanego dla Windows. Ponieważ program Flash Magic głównie używany jest w wersji okienkowej, dlatego częściej jest wybierany niż lpc21isp.


Kroki, które należy  wykonać by zaprogramować mikrokontroler:
  1. Wybierz odpowiedni rodzaj mikrokontrolera, który zamierzasz zaprogramować
  2. Wybierz odpowiedni port COM, na którym będzie odbywać się komunikacja z mikrokontrolerem
  3. Ustaw prędkość portu (komunikacji), zacznij od 115200 jeśli będą występować błędy przy programowaniu zmniejsz prędkość
  4. Rodzaj interfejsu wybierz None (ISP)
  5. W polu Oscilator podaj częstotliwość taktowania zewnętrznego oscylatora wyrazonego MHz
  6. Zaznacz odpowiednią opcję Erase block used by Hex File. Opcja ta wymusza wyczyszczenie pamięci flash mikrokontrolera o rozmiarze takim jakim zajmuje plik HEX
Następnie wciśnij przycisk Browse po czym wskaż plik hex, którym chcesz zaprogramować mikrokontroler. Ostatnim krokiem jest wciśniecie przycisku Start co spowoduje rozpoczęcie procesu programowania mikrokontrolera.

LPC1768-MiniDK-2

Ostatnio wpadł mi w ręce moduł LPC1768-MiniDK-2 z kolorowym wyświetlaczem dotykowym 2,8". Za stosunkowo niewielką cenę (do 150 zł) można nabyć w kilku polskich sklepach internetowych LPC1768-MiniDK-2, kupując bezpośrednio u "chińczyka" jeszcze taniej. W zestawie był kabel USB, kabel ethernetowy, przejściówka mini USB na gniazdo USB (np. do podłączenia pendrive), oraz płyta z przykładami, dokumentacją oraz sterownikami. 

Pakując moduł w odpowiednią obudowę można stworzyć elegancki sterownik wszelakich zastosowań.
Moduł zbudowany jest w oparciu o mikrokontroler LPC1768 taktowany maksymalnie do 100 MHz, z 512 KB pamięci flash firmy NXP, więcej informacji o samym mikrokontrolerze znajduje się na stronie http://www.nxp.com/documents/data_sheet/LPC1769_68_67_66_65_64_63.pdf


Mikrokontroler LPC1768 należy do rodziny mikrokontrolerów ARM Cortex-M3, na każdy 1 MHz przypada 1,25 MIPS, co przy 100 MHz daje 125 MIPS, a taka prędkość bez problemu pozwala na odgrywanie plików dźwiękowych w formaci MP3. Najważniejsze cechy mikrokontrolera LPC1768 to:
  • częstotliwość pracy do 100 MHz
  • pamięć flash 512 KB
  • pamięć ram 64 KB
  • Ethernet MAC
  • kontroler USB w trybach DEVICE, HOST, OTG
  • 8 kanałowe DMA ogólnego przeznaczenia
  • 4 porty UART
  • 2 porty CAN
  • 3 porty SSP/SPI
  • 4 timery ogólnego przeznaczenia
  • 3 porty I2C, I2S
  • 8 kanałowy 12 bitowy przetwornik ADC
  • 10 bitowy DAC
  • 2 kanałowy enkoder inkrementalny
  • 6 wyjściowy PWM ogólnego przeznaczenia
  • specjalny blok PWM do zastosowania regulacji silników
  • zegar czasu rzeczywistego o ultra niskim poborze energii
Dołączony kolorowy wyświetlacz dotykowy LCD o rozmiarze 2,8" oparty jest na sterowniku SPFD5408B, który komunikuje się z "płytą główną" 16 bitowym interfejsem dzięki czemu transmisja danych do wyświetlacza przebiega szybko, natomiast dane z panela dotykowego transmitowane są poprzez interfejs SPI.
Jest także dostępna wersja wyświetlacza, gdzie wymiana danych do wyświetlacza odbywa się poprzez interfejs SPI jednak "odświeżanie" ekranu będzie o wiele wolniejsze niż na magistrali 16 bitowej.

Pokazana na zdjęciu płyta zawiera:
  1. Mikrokontroler LPC1768
  2. Gniazdo ethernet do podłączenia z siecią ethernetową
  3. Gniazdo programatora/debuggera JTAG
  4. Gniazdo mini-USB, które można wykorzystać do programowania albo port UART
  5. Gniazdo mini-USB, wykorzystanie np. jako USB HOST
  6. Gniazdo na baterię w celu podtrzymania zegara czasu rzeczywistego
  7. Kwarc zegarkowy
  8. Gniazdo do podłączenia zewnętrznego zasilacza wraz ze stabilizatorem
  9. Diody LED, w tym dwie do dowolnego wykorzystania
  10. Diody sygnalizacyjne prace portu USB
  11. Przyciski, w tym do dowolnego wykorzystywania
  12. Gniazda do podłączenia wyświetlacza
Można do płyty przylutować 2 rzędowe tzw. goldpiny o rastrze 2,54 mm dzięki czemu będzie nieskrepowany dostęp do pinów mikrokontrolera.

Ponieważ producent pomyślał o konwerterze USB-UART (oparty na scalaku CP2102) do zaprogramowania modułu nie jest konieczny programator/debugger JTAG (np. LPC-Link2), w zupełności wystarczy dołączony do zestawu kabel USB oraz aplikacja Flash Magic dla Windows, natomiast jeżeli pracujesz pod Linuksem użyj aplikacji lpc21isp.

Na dołączonej płycie znajdują się przykłady dla środowiska programistycznego Keil'a jednak ja preferuję środowisko LPCXpresso celowo przeznaczone dla mikrokontrolerów LPC. Z przeportowaniem przykładów dla LPCXpresso nie ma najmniejszych problemów. Postaram się gdzieś umieścić przykłady dla LPCXpresso w najbliższym czasie.