Programowanie ISP mikrokontrolerów LPC2000 i AT91SAM7S
Największą obecnie popularnością wśród mikrokontrolerów z rdzeniem ARM7TDMI cieszą się dwie rodziny:
- produkowane przez firmę Philips układy LPC2000,
- produkowane przez Atmela układy AT91SAM7S
Ponadto wielu innych producentów oferuje mikroprocesory i mikrokontrolery z rdzeniami z rodziny ARM7, ale z różnych przyczyn (chodzi przede wszystkim o łatwą dostępność pojedynczych egzemplarzy lub niewielkich partii mikrokontrolerów, a także ceny narzędzi) ich przyjęcie na rynku popularnym jest nieco słabsze.
Pomimo dość krótkiej (najstarsze mikrokontrolery z rodziny LPC2000 mają około dwóch lat) obecności na rynku tanich mikrokontrolerów (czyli zintegrowanych w jednej strukturze: rdzenia, pamięci programu i danych oraz różnego rodzaju bloki peryferyjne, interfejsy itp.) z rdzeniem ARM7, ich producenci bardzo szybko wprowadzają mniejsze i większe modyfikacje, które wynikają m.in. z potrzeb zgłaszanych przez użytkowników. Jednym z najpoważniejszych (finansowo) problemów, na jaki napotykali użytkownicy pierwszych wersji mikrokontrolerów ARM było ich zorientowanie na programowanie pamięci programu za pomocą interfejsu JTAG. Jest to bez wątpienia dobry sposób zwłaszcza, że JTAG jest wykorzystywany także do konfiguracji sprzętowego debuggera wbudowanego w rdzeń mikrokontrolera. Kolejnymi niebagatelnymi zaletami korzystania z JTAG-a jest duża szybkość programowania i prosta budowa podstawowego interfejsu, który pośredniczy pomiędzy mikrokontrolerem i portem Centronics komputera. Najpopularniejszy (i łatwo dostępny, zwłaszcza w postaci „sklonowanej”) jest interfejs opracowany przez firmę Macraigor sterowany przez specjalny program OCDemon. O ile zastosowane przez producenta rozwiązania sprzętowe są powszechnie znane, to – niestety – wymiana danych pomiędzy PC i interfejsem JTAG wbudowanym w mikrokontrolery owiewa mgła tajemnicy. Opis protokołu wymiany danych z interfejsem umożliwiającym na przykład programowanie pamięci Flash jest niedostępny (oficjalnie) u któregokolwiek z producentów mikrokontrolerów. Pewnego wyłomu dokonał Atmel, ale tak naprawdę kompletne informacje o sposobie obsługi JTAG-a (poza standardowymi funkcjami BST – Boundary Scan Testing) nie są dostępne. Taka polityka producentów pozwala żądać niektórym firmom za proste oprogramowanie do programowania pamięci Flash via JTAG 500…750 USD. Z tego powodu w artykule skupimy się na mniej wygodnych sposobach programowania pamięci Flash w mikrokontrolerach z rdzeniem ARM, ale za to takich, które są dostępne dla każdego.
JTAG w ARM Interfejs JTAG w mikrokontrolerach z rdzeniem ARM7TDMI umożliwia komunikację ze sprzętową jednostką wspomagającą debugowanie programów, pozwala także na programowanie wbudowanej w mikrokontrolery pamięci Flash – jej obsługa wybiega poza standardowe polecenia ujęte w dokumentacji JTAG. Niestety, kody tych poleceń zostały utajnione przez producentów mikrokontrolerów. |
Jeśli nie JTAG, to co?
Ponieważ dostęp do Flasha za pomocą JTAG-a jest dość kosztowny (co wynika z wysokich cen prostych programów sterujących, jak wspomniano wcześniej), skupimy się na alternatywnym kanale dostępu do pamięci Flash, który jest udostępniany przez wpisany na stałe do pamięci mikrokontrolerów (opracowany oczywiście przez producentów mikrokontrolerów) program zwany najczęściej (choć nie do końca słusznie) bootloaderem.
Rodzina LPC2000
Zaczniemy od przybliżenia sposobu programowania pamięci Flash w mikrokontrolerach z rodziny LPC2000, na przykładzie dwóch mikrokontrolerów: LPC2106 (w „małej” obudowie VQFP48) oraz LPC2148 (w „dużej” obudowie VQFP64). Przedstawiony sposób programowania jest charakterystyczny dla wszystkich mikrokontrolerów z tej rodziny wyposażonych we wbudowaną pamięć Flash.
Rys. 1. Schemat elektryczny interfejsu ISP mikrokontrolera LPC210x
Na rys. 1 pokazano podstawowy schemat aplikacyjny mikrokontrolera LPC210x (szczegółowo opisany w AN10302), do którego dołączono dodatkowe elementy umożliwiające programowanie jego pamięci Flash w systemie (ISP – In System Programming). Dzięki zastosowaniu tych elementów programowanie można całkowicie zautomatyzować, minimalizując jednocześnie zaangażowanie użytkownika. Tranzystor T1, z kolektora którego jest sterowana linia P0.14, jest sterowany sygnałem DTR interfejsu RS232. Z kolei inwerter z tranzystorem T2, sterowany sygnałem RTS z RS232, służy do sterowania linii zerującej mikrokontrolera. Przełączenie mikrokontrolera z rodziny LPC2000 w tryb programowania ISP jest możliwe po podaniu na wejścia P0.14 i RST sekwencji sygnałów jak na rys. 2. Po przełączeniu mikrokontrolera w tryb ISP bootloader wykonuje procedurę automatycznego wykrycia prędkości transmisji via RS232 (testowany jest odbiór sekwencji bajtów o wartościach 0xAA oraz 0x55) i przechodzi w tryb oczekiwania na dane, które są przesyłane poprzez UART0. Jakkolwiek poprawną transmisję można uzyskać dla większości częstotliwości taktujących, to zastosowanie rezonatora o częstotliwości zoptymalizowanej pod kątem interfejsu UART (np. 11,0592 lub 14,7456 MHz) pozwala uzyskać większe maksymalne prędkości transmisji (do 115 kb/s), a także większą liczbę prędkości obsługiwanych poprawnie.
Rys. 2. Przebiegi ilustrujące sposób wyzwolenia bootloadera w mikrokontrolerach LPC2000
Protokół wymiany danych pomiędzy mikrokontrolerem i komputerem, z którego są one przesyłane, nie jest skomplikowany, ale inżynierowie firmy Philips opracowali prosty (dostępny bezpłatnie!) program zapewniający jego pełną obsługę oraz odpowiednie sterowanie (via RS232) inwerterów sterujących linie P0.14 i RST – jest to LPC2000 Flash Utility (zalecana jest wersja 2.2.3 lub nowsza). Widok okna tego programu pokazano na rys. 3. Jeżeli mikrokontroler ma być programowany w pełni automatycznie, należy zaznaczyć opcję Use DTR/RTS for Reset and Boot Loader Selection (ulokowana w prawej części okna). Jeżeli (co wygodne w praktyce) po zaprogramowaniu pamięci mikrokontroler ma rozpocząć pracę, należy zaznaczyć opcję Execute Code after Upload (umieszczoną w lewej części okna).
Rys. 3. Okno archiwalnego obecnie programu LPC2000 Flash Utility (obecnie zastąpiony przez FlashMagic Tool)
W przypadku, gdy w otoczeniu mikrokontrolera nie zastosowano elementów pomocniczych, jak to pokazano na rys. 1, można przełączyć go w tryb programowania ręcznie. Wystarczy bowiem wymusić logiczne „0” na linii P0.14 i wyzerować mikrokontroler (wymuszenie na P0.14 po zerowaniu musi być utrzymane przez co najmniej 3 ms, później nie ma znaczenia). Od tego momentu, aż do kolejnego zerowania, pracą mikrokontrolera zawiaduje bootloader.
Interesującą możliwością programowania pamięci Flash mikrokontrolerów z rodziny LPC2000 jest zastosowanie interfejsu USB2RS232 (na przykład interfejsy ZL2USB, ZL1USB lub zbliżony do niego FT232BM-moduł) w torze UART0, jak pokazano na rys. 4. Sposób programowania mikrokontrolera nie ulega zmianie w stosunku do przedstawionego opisu, zmienia się jedynie interfejs komunikacyjny: zamiast standardowego RS232 wykorzystywany jest interfejs USB emulujący połączenie RS232.
Rys. 4. Zalecany interfejs do ręcznego uruchamiania bootloadera