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?
Die Adresse sollte 1 lauten (Thumb-Mode). Deine Initialisierung geht wom"oglich von RESET-defaults aus und du hast keinen RESET gemacht!
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.
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.
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 ;-)
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.
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.
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.
@alex: ist dein Programm eigentlich kleiner als halbe FLASH-Gr"osse? Sprich: passt altes UND neues Programm in den FLASH?
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.
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 ;-)
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.
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!
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.
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?
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).
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.
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 ;-)
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?
OK ich mach mich mal genau SYSRESETREQ Bit schlau.
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.)
F"ur Linux? mxli - Marc's exquisite LPC ISP tool. [Any similarities with persons - dead or alive - are purely coincidental]
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.