LPC1768 vom ISP Modus die nue Firmware starten

Gast #3512124
Lesenswert?

Hallo Leute,
mein Problem sieht folgendermaßen aus.
ich muss den lpc1768 über die com0 Schnittstelle in den ISP Modus 
versetzen.
Neue FW draufspielen und die FW ohne ein Reset Starten.

So nun mache ich folgendes.
Ich sende meiner FW ein Befehl der diese in den ISP Modus versetzt alle 
IRQs werden ausgeschaltet.
Danach kann ich mit Flash Magic den lpc Programmieren. Bis dahin geht 
alles ohne Probleme.
Nun nutze ich den Befehl von Flash Magic Go... dieser lässt den LPC an 
die Adresse 0x00000000 springen. nach meinem Verständnis müsste der LPC 
jetzt die neue FW ausführen.

Dieser tut aber Garnichts 0.o

Wo liegt denn mein Fehler?
Gast #3512196
Lesenswert?

in adresse 0 steht kein code, dort ist die vektortabelle. in adresse 0 
steht die initialisierung des stack pointers und in adresse 4 die 
adresse des codes.
das ist eine sehr unschöne variante, wer weiß, was der bootloader alles 
verstellt.
#3513987
Lesenswert?

Ja alles K"ase was ich da schrieb :(

alex hat wohl das Problem, dass das Ger"at, das ein update erfahren soll 
gar keine M"oglichkeit hat per COM einen RESET auszul"osen.
Und er hat wohl das Problem - siehe hennings post - nicht zu wissen wo 
er hinspringen soll. Obwohl das im hex-image irgendwie drin steht, oder 
im elf (_start ?).

Sollte das ein Problem sein, w"urde ich in der Firmware knallhart den 
Watchdog aufziehen (vor dem Aufrufen des ISP-handers), dass er nach 30s 
zuschl"agt. Wenn Flashmagic bis dahin nicht fertig ist - Schicht im 
Schacht ;-)
Gast #3517142
Lesenswert?

Marc du hast mein Problem genau erfasst.

Nur kann ich nicht einfach ein Reset durchführen ohne zu wissen dass die 
neue FW drauf ist.
Ich brauch die Startadresse ab der die FW beginnt und gegeben falz alles 
andere was zurückgesetzt werden muss.

Ich habe ein kleines prog geschrieben bei dem ich in den isp modus 
springen kann.  Mit Flash Magic springe ich wieder auf 0x00000000 dabei 
ist der haken bei “Adress is a start of verctor Table” gesetzt.
Dies scheint zu funktionieren. Muss aber noch bei Größeren Projekten 
getestet werden.

An liebsten wäre mir aber eine eindeutige Erklärung wohin man springen 
muss.
#3517260
Lesenswert?

Alles was du tun musst, ist ein kleines Assembler-Schnipsel wie dieses 
zu schreiben:
1
mov r0, 4
2
ldr r0, [r0]
3
bx r0

Die drei Befehle tun nichts anderes, als die Adresse des Reset-Handlers 
aus der Vektortabelle zu laden und anschließend dahin zu springen. Das 
funktioniert unabhängig von der eigentlichen Firmware.

Den Code assemblierst und UU-encodest du und schreibst ihn über die 
ISP-Schnittstelle in den RAM des LPC (Befehl W). Anschließend führst du 
den Code aus (Befehl G) und deine Firmware wird gestartet.

Das müsstest du aber ohne Flash-Magic machen, sondern mit einem eigenen 
Programm, bzw. einen der Open Source-LPC-Programmer dahingehen anpassen.

Eine andere Variante des obigen Schnipsels wäre, das SYSRESETREQ-Bit im 
Register AIRCR zu setzen. Das ist ein Software-Reset.
#3517630
Lesenswert?

Alexander B. schrieb:
> Die drei Befehle tun nichts anderes, als die Adresse des Reset-Handlers
> aus der Vektortabelle zu laden und anschließend dahin zu springen. Das
> funktioniert unabhängig von der eigentlichen Firmware.

Aber nur, wenn der Reset Handler den SP selber setzt - was er 
normalerweise nicht tun müsste, denn der SP steht ja auch in der 
Vektortabelle drin.
Gast #3517782
Lesenswert?

alex schrieb:
> Neue FW draufspielen und die FW ohne ein Reset Starten.
Das halte ich für ziemlich riskant. Wer weiß denn schon wirklich, was er 
wo alles zur Laufzeit verändert hat? Reset ist ein sauberer Zustand. Und 
wenn du ganz am Anfang des Flash loslegen willst, ist es sowieso egal. 
Dann haben aber wenigstens alle relevanten Register definierte Werte.

Schreib dir einfach ein NVICSystemReset() ins RAM (natürlich) und gut 
is.
#3517938
Lesenswert?

Jim Meba schrieb:
> Aber nur, wenn der Reset Handler den SP selber setzt - was er
> normalerweise nicht tun müsste, denn der SP steht ja auch in der
> Vektortabelle drin.

Ich gebe zu, diesen Punkt habe ich übersehen. Das wäre dann wohl beim 
ersten Test aufgefallen :-D.

Dann verlängert sich das Code-Schnipsel eben noch um zwei/drei Befehle. 
Aber das Prinzip sollte funktionieren ;-)
Gast #3518012
Lesenswert?

Ich würde den Watchdog einschalten, nachdem die Firmware geflasht und 
verifiziert wurde. Dann wird eine halbe Sekunde gewartet. Das ist dann 
ein sauberer CPU-Reset; die Peripherie muss der Initialisierungscode 
dann in einen definierten Zustand bringen.
#3518032
Lesenswert?

Alexander B. schrieb:
> Alles was du tun musst, ist ein kleines Assembler-Schnipsel wie dieses
> zu schreiben:
> mov r0, 4
> ldr r0, [r0]
> bx r0

"Ahhhh. Das m"ussen wir noch vorher pr"ufen! Da war doch was mit dem 
re-mapping der Vektortabelle durch den ISP-Handler!? Wenn der auch nur 
die ersten 64Bytes re-mapped ist schon die Katastrophe passiert:
Addresse 4 k"onnte dann was aus dem ROM des ISP-Handlers sein ==> ganz 
schlecht!
#3518047
Lesenswert?

Marc P. schrieb:
> Da war doch was mit dem
> re-mapping der Vektortabelle durch den ISP-Handler!? Wenn der auch nur
> die ersten 64Bytes re-mapped ist schon die Katastrophe passiert

Es wird dann zwar der ROM-Bootloader angesprungen, aber das passiert 
auch bei jedem normalen Reset. Wenn ein Programm im Flash steht (d.h. 
Checksumme der Vektortabelle ist OK), wird das normal gestartet.
Gast #3518241
Lesenswert?

Hallo Leute,
danke für die Beratung.
So wie ich es im Augenblick versteh sollte ich unbedingt ein reset 
durchführen.
Gut akzeptiert. :)
Das sind dann die zwei Möglichkeiten die ich hab.

Alexander B. schrieb:
> Alles was du tun musst, ist ein kleines Assembler-Schnipsel wie dieses
> zu schreiben:
> mov r0, 4
> ldr r0, [r0]
> bx r0

Lutz schrieb:
Schreib dir einfach ein NVICSystemReset() ins RAM (natürlich) und gut 
is.

Müsste ich den diese Prozeduren unbedingt in den Ram laden nachdem die 
neu FW drauf ist? (Der Bootloader wird ja aus dem Flash ausgeführt.) 
Oder könnte ich diese schon vorher in den Ram kopieren und einfach mit 
einem Go Befehl ausführen?
Gast #3518469
Lesenswert?

Es muß auf jeden Fall vor dem Flash-Update ins RAM geschrieben werden, 
da du dir ja sonst den eigenen Ast abgsägst. Es ist ja extrem 
unwahrscheinlich (und unnötig auch), diese Funktion an die selbe Adresse 
im Flash in jedem Flashupdate zu schreiben. Sobald du anfängst, etwas 
ins Flash zu schreiben, kannst du nicht mehr auf das Flash zugreifen und 
natürlich dem Inhalt auch nicht mehr vertrauen. Also alle Informationen 
der Laufzeit sind weg. Wenn du alles im Flash überschreibst, ist das 
Teil nur noch ein "dummer Datenträger". Ein EEPROM-Ersatz z.B. wäre 
hingegen harmlos (z.B. einen Sektor als Datenspeicher benutzen).
#3518480
Lesenswert?

alex schrieb:
> Müsste ich den diese Prozeduren unbedingt in den Ram laden nachdem die
> neu FW drauf ist?

Ja, weil du die genaue Adresse der Prozedur nicht kennst (zumal sie als 
inline definiert ist). Du bist also wieder beim Ausgangsproblem.

Allerdings ist das nicht besonders schlimm, denn NVIC_SystemReset ist 
für den LPC definiert als
1
static __INLINE void NVIC_SystemReset(void)
2
{
3
  SCB->AIRCR  = (NVIC_AIRCR_VECTKEY | (SCB->AIRCR & (0x700)) | (1<<NVIC_SYSRESETREQ));
4
  __DSB();
5
  while(1);
6
}

Was von der Vorgehensweise genau das ist, was ich mit

Alexander B. schrieb:
> Eine andere Variante des obigen Schnipsels wäre, das SYSRESETREQ-Bit im
> Register AIRCR zu setzen. Das ist ein Software-Reset.

schon angedeutet habe.
#3518484
Lesenswert?

Ich glaube es geht einfacher:

Wenn alex in seinem FLASH-Image an einer fixen *Adresse* eine Routine 
NVICSystemReset unterbringt, dann ist dieser Code im soeben geflashten 
Speicher vorhanden und er kann dort hin springen ohne eine Indirektion. 
Der Code l"ost dann einen Reset aus und alles ist wieder gut.
Das k"onnte mit den Bordmitteln vom FlashMagic gehen, oder?

Okay, einfacher meint hier nicht unbedingt ein einfacheres Linkerscript. 
Geb ich zu ;-)
Gast #3518496
Lesenswert?

Da hast du mich glaub ich falsch verstanden.

Ich wollte bevor ich in den ISP Modus springe NVICSystemReset()in den 
RAM laden. Der Bootloader an sich wird ja nie überschrieben.
Nach dem überschreiben wollte ich einfach in die entsprechende Ram 
Adresse aufrufen in der NVICSystemReset() steht.
Aber das wird wohl nichts da ich ja nicht weis ob der Bootloader die RAM 
an dieser Position unangetastet lässt.

Ich muss wohl die Assembler Befehle in den Ram schreiben und ausführen.

Kennt ihr einen guten Open Source-LPC-Programmer?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren