< Projekte
PIC Bootloader
Bootloader für Enhanced Midrange PIC Microcontroller
Beschreibung
Protokoll
PC-Tool
Download
Konfiguration
Applikation

Anpassung der Applikation

Allgemein:

Der Bootloader verändert einige Hardware-Register, daher unterscheidet sich deren Inhalt beim Start der Applikation vom Wert, der im Datenblatt für "Value at Reset" angegeben ist. Falls sich die Applikation hier auf die Reset-Werte verlässt, können Änderungen erforderlich werden, damit die Applikation auch mit Bootloader korrekt funktioniert.

Register, die vom Bootloader verändert werden:

  • OPTION_REG
  • OSCCON
  • WDTCON
  • ANSELx
  • TRISx
  • FSR0L,FSR0H
  • EEADRL, EEADRH bzw. PMADRL, PMADRH
  • EUSART Registersatz, wenn EUSART im BL genutzt wird
  • ggf. Peripheral Pin Select (PPS) Register, sofern in Verbindung mit EUSART verwendet

Wenn der Bootloader am Anfang des Flashspeichers liegt:

Als Startadresse bzw. Reset-Einsprung der Applikation muss in diesem Fall die Adresse "APP_START" verwendet werden, wie sie beim Assemblieren des Bootloaders festgelegt wurde. Eine evtl. Interrupt-Service Routine muss bei Adresse APP_START+4 beginnen.

Wenn die ENABLE_CHECKSUM-Option verwendet wird, sind außerdem zwei Speicherzellen für die Berechnung der Prüfsumme zu reservieren:

  • APP_START+2: hier trägt das PICLoader Tool die Prüfsumme ein, damit die Summe über den gesamten Applikationscode 0 ergibt
  • APP_START+3: gibt die Länge des Applikationscodes an (in Flashwords), über den die Prüfsumme gebildet wird. Kann vom PICLoader-Tool automatisch anhand des Hex-Files ermittelt und hier eingetragen werden (default), oder kann selbst eingetragen werden, um z.B. Datenbereiche im Flash durch das Hex-File mit initialen Werten zu programmieren, aber aus der Prüfsumme herauszuhalten, damit die Daten später auch geändert werden können.

Der Anfang eines typischen Anwenderprogramms für APP_START-Adresse 0x100 sieht dann z.B. so aus:

	ORG APP_START 		;= 0x100
ResetVect
0100 movlp high initialize
0101 goto initialize
; Adressen 0x102 und 0x103 nicht für Code verwenden!

ORG
APP_START+4 ;= 0x104 Interrupt ; Interrupt Service Routine: 0104 banksel 0
0105 btfsc ... ; (beliebiger, weiterer Code...)


Wenn der Bootloader im oberen Bereich des Flashspeichers liegt:

Hier wird das Programm so assembliert bzw compiliert und gelinkt, wie ohne Bootloader, lediglich der Bootloader-Speicherbereich muss natürlich reserviert bleiben. Der Startcode des Programms wird vom PICLoader-Tool beim Laden in den Patchcode-Bereich verschoben und entsprechend modifiziert:  

Original Programm (Beispiel):
Geladenes Programm:
ResetVect
0000 btfss STATUS,NOT_TO
0001 bra wdt_reset
0002 movlp high initialize
0003 goto initialize
Interrupt
0004 banksel 0
: ...
0EF7 (Ende)
<--
Programmcode
im Hexfile
PICLoader
sendet an Bootloader
-->
ResetVect
0000 movlp high BootLdr
0001 goto BootLdr

0002 movlp high initialize
0003 goto initialize
Interrupt
0004 banksel 0
: ...
0EF7 (Ende)
Patchcode:
Patchcode:
Adresse = Bootloader-8,
z.B.
0EF8 (reserviert)
:
0EFF
PICLoader verlagert
original Reset Code
-->

und trägt
applength
und checksum
hier ein
-->
Adresse = Bootloader-8,
z.B.
0EF8 movlp 0
0EF9 btfss STATUS,NOT_TO
0EFA goto wdt_reset
0EFB goto 0x002
0EFC
0EFD
0EFE dw applength
0EFF dw checksum


Bootloader:


0F00	(prüft Applikations-
: Code, wenn ok:)
: goto 0x0EF8
0FFF


(rot: Inhalt durch Bootloader vor Überschreiben geschützt)


Aufruf des Bootloaders aus der Applikation

Die Applikation kann den Bootloader durch Sprung auf den Reset-Vektor aufrufen (GOTO  0). Damit der Bootloader nicht wieder in die Applikation startet, wie nach einem Hardware-Reset, muss die Applikation anzeigen, daß es sich hier nicht um einen Reset, sondern um einen Start des Bootloaders durch die Applikation handelt. Dazu dient das höchstwertige Bit (Bit 7) im FSR0H-Register, indem es durch die Applikation auf 1 gesetzt wird, während durch einen Reset FSR0H gelöscht wäre. Die Interrupts müssen deaktiviert sein (z.B. INTCON.GIE löschen).

  


Kontakt