A bootloader működése és használata
A bootloader lényege, hogy mikrokontroller programmemóriájának egy kis részében az ún. boot block-ban egy speciális program van ami képes a mikrokontrollert felprogramozni például a soros vonalon bejövő adatokkal. Természetesen lehetne SPI vagy I2C buszon keresztül is az adatokat fogadni. A 18-as PIC család már tudatosan fel lett készítve bootloader használatára, hiszen a konfigurációs változókban beállítható, hogy a boot block (0x000..0x1FF) tartományt ne lehessen felülírni. Tehát 512 bájt áll rendekezésre a bootloader számára. A boot block írási védelmet érdemes is beállítani, de a programmemória többi részének futás közbeni módosítását engedélyezni kell, különben a bootloader nem fog működni. Kónya tanár úr honlapjáról le is tölthető egy ilyen bootloader, amit csak nagyon kicsit módosítottam, hogy a nyomógomb és a LED más I/O porton legyen. A bootloader használatához szükséges kapcsolás vázlata kövekező:Ha letöltjük a bootloadert a kontrollerbe, kétféleképpen működhet mikrovezérlőnk: normál módban és programletöltési módban.
Normál működési módAlapesetben a reset után a bootloader normál módban fut. A kontroller a 0x200 címre ugrik és a magas prioritású megszakítást a 0x208 címre az alacsony prioritásút a 0x218 címre irányítja egy egyszerű BRA utasítással. Ettől kezdve a saját programunk fog futni. Programletöltési mód
Programletöltés módba kerülés feltétele, hogy a bekapcsolás pillanatában az I/O
lábra kötött gombot lenyomjuk. Ekkor a visszajelző LED kétszer felvillan és ezután
már a mikrokontroller várja a soros vonalon az adatokat Intel HEX32 formátumban.
Az átviteli sebesség érzékelése automatikus. Érdemes 57600 baudot beállítani a
letöltőprogramban. Az adatok sikeres átvitele után a visszajelző LED felvillan
háromszor. Ha valamilyen hiba történt, a visszajelző LED folyamatosan világít.
A bootloader hibát jelez, ha a HEX32 fájlban az adatsor kezdőcíme nem a 16 bájtoslaphatáron kezdődik. Ez akkor fordulhat elő, ha C-ben írjuk meg programunkat,
mivel a linker csak egymás után fűzi az objektumokat. Ezért írtam egy hexfix nevű
programot, ami a bootloader számára átalakítja a HEX fájlt.
Mivel a bootloader került az első 512 bájtba a linkernek és a fordítónak be kell
állítani az új belépési pontot és a megszakítás új címét.
Bootloader miatt szükséges változtatások a forrásfájlokbanValamelyik C fájlunkban adjuk meg a fordítónak, hogy hol található
a megszakítás címe.
#pragma code highVector=0x208#pragma code lowVector=0x20418f452.lkr:
LIBPATH e:mcc18lib//FILES c018i.oFILES c018iz.oFILES clib.libFILES p18f452.libCODEPAGE NAME=boot START=0x000 END=0x1FF PROTECTEDCODEPAGE NAME=vectors START=0x200 END=0x229 PROTECTEDCODEPAGE NAME=page START=0x22A END=0x7FFFCODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTEDCODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTEDCODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTEDCODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTEDACCESSBANK NAME=accessram START=0x0 END=0x7FDATABANK NAME=gpr0 START=0x80 END=0xFFDATABANK NAME=gpr1 START=0x100 END=0x1FFDATABANK NAME=gpr2 START=0x200 END=0x2FFDATABANK NAME=gpr3 START=0x300 END=0x3FFDATABANK NAME=gpr4 START=0x400 END=0x4FFDATABANK NAME=gpr5 START=0x500 END=0x5FFACCESSBANK NAME=accesssfr START=0xF80 END=0xFFF PROTECTEDSTACK SIZE=0x100 RAM=gpr5
c018.o/c018i.o/c018z.o:
#pragma code _entry_scn=0x000200
használni, az elkészült HEX fájlt javítani kell. A HexFix v1.0 programot
ezért írtam. Ez a program beolvassa és újra kiírja a HEX fájlt.
Az ldrkey nevű bootloader, a hozzá tartozó letöltő program és a HexFixprogram letölthető itt: bootloader.zip.
A HexFix program forráskódja: