Samoprogramowanie AVR cz.1. Opis gotowego bootloadera
Niedziela, 01 Listopad 2009
Konstruktorom i elektronikom zajmującym się systemami embedded
bardzo dobrze znane są zalety stosowania specjalnych programów
startowych, tzw. bootloaderów. Dzięki nim można w prosty sposób
zbudować mechanizm zdalnej aktualizacji oprogramowania, bez
konieczności podłączania programatora. W przeszłości pisaliśmy
w EP na temat bootloaderów przeznaczonych dla mikrokontrolerów
AVR. W związku z bardzo dużym zainteresowaniem tym
tematem oraz ogromną popularnością mikrokontrolerów ATmega,
zdecydowaliśmy się opisać ciekawe rozwiązania bootloaderów.
108 ELEKTRONIKA PRAKTYCZNA 11/2009
notatnik konstruktora
można zmontować w postaci tzw. pająka. Do
kompilacji programu zastosujemy program
ICCAVR, którego wersję demonstracyjną
można ściągnąć ze strony http://www.image-
craft.com. Jest ona wystarczająca na potrzeby
tego artykułu. Program MegaLoad oraz pliki
bootloadera możemy pobrać ze strony auto-
ra, tj. http://www.microsyl.com.
Konfiguracja i kompilacja
bootloadera
Pierwszym krokiem jest wybór możli-
wości bootloadera, czyli czy wystarcza nam
tylko programowanie pamięci programu,
czy też potrzeba, aby mógł on również za-
programować wewnętrzną pamięć EEPROM
i bezpieczniki BLB (Boot Lock Bits). Funk-
cja programowania EEPROM wiąże się ze
zwiększeniem rozmiaru programu, a co za
tym idzie, innych ustawień bezpieczników
decydujących o wielkości pamięci poświę-
conej na bootloader, czyli sekcji BLS (z 256
na 512 słowa). W artykule będzie zaprezen-
towana opcja z możliwością programowania
pamięci Flash, EEPROM oraz bezpieczników
BLB, czyli wszystkiego, co oferuje program
MegaLoad.
Program bootloadera możemy skompi-
lować, gdy mamy zainstalowany kompilator
ICC, program MegaLoad oraz rozpakowany
Konstruktorom i elektronikom zajmującym się systemami embedded
bardzo dobrze znane są zalety stosowania specjalnych programów
startowych, tzw. bootloaderów. Dzięki nim można w prosty sposób
zbudować mechanizm zdalnej aktualizacji oprogramowania, bez
konieczności podłączania programatora. W przeszłości pisaliśmy
w EP na temat bootloaderów przeznaczonych dla mikrokontrolerów
AVR. W związku z bardzo dużym zainteresowaniem tym
tematem oraz ogromną popularnością mikrokontrolerów ATmega,
zdecydowaliśmy się opisać ciekawe rozwiązania bootloaderów.
Samoprogramowanie
AVR (1)
Opis gotowego bootloadera
Zaczynamy
Program bootloadera komunikuje się
z komputerem za pomocą portu szeregowego
(istnieje również możliwość wykorzystania
interfejsu RS485). Na potrzeby tego artykułu
zbudowano prostą aplikację, której schemat
pokazano na rys. 1. Wykorzystano w niej
mikrokontroler ATmega32, a do konwersji
poziomów popularny MAX232. Dzięki temu
prostemu układowi można przetestować boo-
tloader.
Do uruchomienia będzie potrzebny do-
wolny programator procesorów AVR, np. Po-
nyProg, który jest prosty w budowie, a opro-
gramowanie i schemat można za darmo ścią-
gnąć ze strony http://www.lancos.com/prog.
html. Jedyne, co trzeba zakupić, to części;
nie trzeba nawet wykonywać płytki ? układ
W Internecie można znaleźć kilka dar-
mowych propozycji gotowego programu
do samoprogramowania mikrokontrolerów
AVR. Interesującą propozycją jest program
MegaLoad, który obsługuje prawie każdy mi-
krokontroler z rodziny ATmega. Dodatkowo,
jest on prosty w konfiguracji. Kolejną jego
zaletą jest to, że program obsługi napisano
w C#.NET, co zapewnia jego względnie ła-
twą migrację pomiędzy różnymi systemami.
Drugą interesującą propozycją jest program
napisany przez inżynierów Atmela. Do jego
atutów można zaliczyć to, że bootloader jest
obsługiwany z poziomu AVR Studio. Na po-
czątku zajmiemy się MegaLoadem, gdyż jest
najbardziej uniwersalnym rozwiązaniem.
W kolejnej części cyklu opiszemy bootloader
zgodnym z notą aplikacyjną AVR109.
109ELEKTRONIKA PRAKTYCZNA 11/2009
Samoprogramowanie AVR
(ze strony ściągamy w postaci archiwum zip)
kod źródłowy bootloadera. Po uruchomieniu
ICC, otwieramy projekt (wybieramy z menu
Project?>Open) BootLoad.prj. Znajdziemy
go oczywiście w katalogu, do którego roz-
pakowaliśmy kod źródłowy. Po prawej stro-
nie otwartego okna ukazują się pliki, które
wchodzą w skład projektu; klikamy dwa razy
na plik main.c, co spowoduje otwarcie go do
edycji.
Teraz można rozpocząć konfigurację. Na
początek w MCU selection ustawiamy dla
jakiego typu procesora ma być skompilowa-
ny bootloader. Robimy to poprzez usunięcie
znaku komentarza ?//? przed odpowiednią
nazwą typu mikrokontrolera (w naszym
przypadku #define MEGATYPE 32). Jed-
nocześnie należy pamiętać, aby dodać ?//?
przed wszystkimi innymi nazwami typów,
gdyż inaczej przy kompilacji zostanie zgło-
szony błąd. W sekcji MCU Frequency należy
wpisać wartość częstotliwości oscylatora
w Hz, którego używa się do taktowania mi-
krokontrolera (np. dla kwarcu 8 MHz, #de-
fine XTAL 8000000). Teraz w sekcji Bootload
on UART x trzeba wybrać, z którego portu
szeregowego ma korzystać mikrokontroler
do komunikacji z komputerem. Jeśli proce-
sor ma tylko jeden port USART, to wybór
jest oczywisty: #define UART 0. Tak też jest
w przypadku ATmegi32. Gdy mikrokontro-
ler ma więcej portów, wtedy można wybrać,
z którego ma korzystać program. Postępuje-
my tak samo jak wcześniej, kasując ?//? przed
wybranym portem, a wstawiając ?//? przed
pozostałymi. W kolejnej sekcji o nazwie
BaudRate ustawia się prędkość transmisji
danych. Podaje się ją w bodach, czyli bitach/
sekundę (np. #define BAUDRATE 9600). Te-
raz w sekcji EEPROM programming zaznacza
się, czy bootloader ma mieć możliwość pro-
gramowania wewnętrznej pamięci EEPROM,
co jak już wcześniej wspomniałem, wiąże się
z większym zapotrzebowaniem na pamięć
programu.
W sekcji LockBit programming decyduje-
my, czy potrzebna jest nam możliwość pro-
gramowania bezpieczników.
Zamiast interfejsu RS232 MegaLoad
może używać do komunikacji RS485 half
duplex. Jeśli chcemy skorzystać z tej opcji,
to wyłączamy RS232 i konfigurujemy sekcję
RS485. Zostało jeszcze tylko otwarcie pliku
assembly.s i wstawienie 1 przy nazwie mi-
krokontrolera, dla którego ma być skompilo-
wany bootloader (przy innych musi być 0!).
Po zapisaniu zmian można przejść do kom-
pilacji.
Należy zacząć od konfiguracji kompi-
latora, to znaczy wyboru procesora, dla
którego kompilowany jest program oraz że
plik wynikowy będzie używany jako boot-
loader. Trzeba też podać wielkość sekcji BSL.
Dokonuje się tego, wybierając z menu Pro-
ject?>Options... Po otwarciu nowego okna
w zakładce Target wybieramy procesor, a na
dole w polu Program type zaznaczamy Boot
Loader i wybieramy Boot size, czyli wielkość
sekcji BSL. Tak jak wspomniano wcześniej,
ustawiamy 256 Words w przypadku bez pro-
gramowania EEPROM, a z jego programowa-
niem ? 512 Words. Na rys. 2 pokazano przy-
kładowy wygląd ekranu konfiguracji.
Po tych czynnościach można już skom-
pilować projekt, naciskając ikonkę Project
Build lub F9 . Jeśli wszystko zostało wykona-
ne poprawnie, to kompilacja powinna zakoń-
czyć się sukcesem.
Programowanie procesora
Czas najwyższy na to, żeby zaprogramo-
wać procesor. Zastosujemy do tego progra-
mator PonyProg, ale schemat postępowania
jest oczywiście taki sam dla każdego progra-
matora. Zaczynamy od ustawienia bezpiecz-
ników. Sposoby na wywoływanie bootloade-
ra są dwa: albo z programu aplikacyjnego,
albo podczas restartu procesora. W przykła-
dzie skorzystamy z drugiej opcji. W tym celu
należy ustawić odpowiednie bezpieczniki
BOOTSZx. Ich kombinacja jest uzależniona
od typu procesora oraz od wielkości BSL,
jaką, potrzebujemy (kombinacje znajdziemy
w dokumentacji procesora) oraz jeśli chce-
my, by po resecie startował program bootlo-
adera, to ustawiamy bezpiecznik BOOTRST.
Dla przykładowego układu będziemy potrze-
bowali BSL o wielkości 512 słowa, co odpo-
wiada konfiguracji BOOTsz1 = 1, BOOTSZ0
= 0. Ustawienia bezpieczników przedstawia
rys.? 3.
Po zaznaczeniu odpowiednich bez-
pieczników naciskamy przycisk Write, w ten
sposób zapisują się nasze ustawienia do
procesora. Teraz trzeba załadować program
bootloadera. Zaczynamy od otwarcia skom-
pilowanego wcześniej bootloadera, wybie-
ramy z menu File?>Open Program (FLASH)
File... i otwieramy plik BootLoad.hex. Musi-
my także wybrać typ mikrokontrolera, który
chcemy zaprogramować. Dokonujemy tego
w menu Device, a następnie programuje jego
pamięć Flash poprzez wybranie z menu
Command?>Write Program (FLASH). Pamięć
programu powinna zostać zaprogramowana,
a następnie zweryfikowana. Na rys. 4 przed-
stawiono programowanie procesora z przy-
kładu. Jeśli wszystko pójdzie bez przeszkód,
to przechodzimy do ostatniego i moim zda-
niem najprzyjemniejszego etapu, w którym
będziemy mogli zobaczyć efekt naszej pracy.
Programowanie
Ostatnim etapem będzie podłączenie do
komputera układu i zaprogramowanie mi-
krokontrolera (sekcji aplikacji). Uruchamia-
my program MegaLoad i podłączamy układ
poprzez port com. Po uruchomieniu progra-
mu wyświetlane jest okienko jak na rys. 5.
Rys. 1.
Rys. 2.
Rys. 3.
110 ELEKTRONIKA PRAKTYCZNA 11/2009
notatnik konstruktora
Interfejs programu jest przejrzysty i czytelny,
więc z jego obsługą nie powinno być proble-
mów.
Wybieramy port, do którego jest podłą-
czony nasz procesor i z jaką prędkością ma
się odbyć transmisja (koniecznie taka sama,
jak zostało ustawione podczas konfiguracji).
Następnie wybieramy plik, w którym jest
skompilowany program (w sekcji File to be
programed in the Flash, klikamy przycisk
Open) oraz jeśli chcemy zaprogramować
EEPROM, to musimy wskazać plik (w sekcji
File to be programed in the EEPROM, klika-
my przycisk Open), w którym jest zawartość
EEPROM. Teraz jeśli chcemy, wybieramy
ustawienia bezpieczników (tylko ostrożnie),
robimy to w sekcji BootLoader Lock Bits to
be programed (znaczenia poszczególnych
ustawień bitów omawiałem w poprzednim
artykule). Po dokonaniu tych czynności zosta-
je nam tylko zresetowanie procesora, co po-
winno rozpocząć proces programowania. Jeśli
wszystko przebiegło bez kłopotów, to wgrany
program powinien działać od razu, jednak
jeśliby się tak nie stało, może pomóc naci-
śnięcie przycisku Send reset w sekcji Com-
mand lub odłączenie zasilania układu. Jeśli
te operacje nie pomogą, to znaczy, że gdzieś
podczas konfigurowania bootloadera popełni-
liśmy błąd lub prędkość z jaką komunikuje się
mikrokontroler z PC, jest źle dobrana.
Możemy sprawdzić teraz, czy nasz pro-
gram rzeczywiście został bezbłędnie zapi-
sany w pamięci mikrokontrolera. W tym
celu należy podłączyć programator i zwery-
fikować pamięć procesora z plikiem, który
wgraliśmy. Należy pamiętać, że w pamięci
znajduje się nie tylko nasz program, ale rów-
nież bootloader, dlatego jeśli będziemy wery-
rys. 4.
rys. 5.
fikować całą pamięć (włącznie z sekcją BSL)
i porównywać ją z plikiem, który wgraliśmy,
to rezultat weryfikacji będzie negatywny.
Teraz, po każdorazowym uruchomieniu/
restarcie układu program bootloadera spraw-
dzi, czy ma programować pamięć. Jeśli wy-
nik będzie negatywny, wówczas normalnie
zostanie uruchomiona aplikacja zapisana
w pamięci mikrokontrolera.
Podsumowanie
Bootloader autorstwa Sylvain Bissonnette
jest bardzo elastyczny, przez co nadaje się do
wielu różnych zastosowań. W oknie programu
znajduje się sekcja Thanks to read, w której au-
tor prosi o wsparcie jego pracy, do czego gorąco
zachęcam, gdyż jego program jest wykonany
solidnie, działa naprawdę stabilnie i nadaje się
do różnych zastosowań, o czym mam nadzieję
również przekonają się Czytelnicy.
Paweł klaja
pklaja@o2.pl
R E K L A M A
Zobacz więcej w kategorii Notatnik konstruktora