Forum: Mikrocontroller und Digitale Elektronik LPC1768 vom ISP Modus die nue Firmware starten


von alex (Gast)


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?

von Marc P. (marcvonwindscooting)


Lesenswert?

Die Adresse sollte 1 lauten (Thumb-Mode).

Deine Initialisierung geht wom"oglich von RESET-defaults aus und du hast 
keinen RESET gemacht!

von henning (Gast)


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.

von Jim M. (turboj)


Lesenswert?

Marc P. schrieb:
> Die Adresse sollte 1 lauten (Thumb-Mode).

UM10360.pdf sagt was anderes (Kapitel 32.7.8). Der Modus wird mit 
nachfolgendem T angegeben, die Addresse sollte word-aligned sein.

Falls "G 0 T" nicht funktioniert, probiere es mit der Addresse des 
"Reset" Handlers.

von Marc P. (marcvonwindscooting)


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 ;-)

von alex (Gast)


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.

von Alexander B. (leuchte)


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.

von Jim M. (turboj)


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.

von Marc P. (marcvonwindscooting)


Lesenswert?

@alex: ist dein Programm eigentlich kleiner als halbe FLASH-Gr"osse?
Sprich: passt altes UND neues Programm in den FLASH?

von Lutz (Gast)


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.

von Alexander B. (leuchte)


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 ;-)

von Svenska (Gast)


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.

von Marc P. (marcvonwindscooting)


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!

von Jim M. (turboj)


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.

von alex (Gast)


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?

von Lutz (Gast)


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).

von Alexander B. (leuchte)


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.

von Marc P. (marcvonwindscooting)


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 ;-)

von alex (Gast)


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?

von alex (Gast)


Lesenswert?

OK ich mach mich mal genau SYSRESETREQ Bit schlau.

von Alexander B. (leuchte)


Lesenswert?

alex schrieb:
> Kennt ihr einen guten Open Source-LPC-Programmer?

Mit wärmsten Empfehlungen ...

http://sourceforge.net/projects/lpc21isp/

(Nicht von dem Namen vewirren lassen, ist auch für LPC17xx gut.)

von Marc P. (marcvonwindscooting)


Lesenswert?

F"ur Linux? mxli - Marc's exquisite LPC ISP tool.
[Any similarities with persons - dead or alive - are purely 
coincidental]

von alex (Gast)


Lesenswert?

Danke.

Programmer für Win7.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.