PIC18F bootloader

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ő:

Bootloader
bekötés{width="456" height="276"}

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ód


Alapesetben 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ájtos

laphatá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ájlokban


Valamelyik 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=0x204

18f452.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

Az Microchip C18 fordítójához mellékelt startup fájlok változtatásai:

c018.o/c018i.o/c018z.o:

#pragma code _entry_scn=0x000200

Ha C18 fordítót használjuk programunk írásához és letöltőt is szeretnénk

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 HexFix

program letölthető itt: bootloader.zip.

A HexFix program forráskódja:

hexfix-1.0.tar.gz.

Oldalak