Forum: Mikrocontroller und Digitale Elektronik LPC 2294: Wie Code in Flash-Speicher laden?


von Steffen K. (mrcrabs)


Lesenswert?

Hallo. Zunächst sei mal zu sagen, dass ich ziemlich unerfahren mit dem 
LPC2294 bin und mich auch allgemein nicht als Großmeister der 
Mikrocontroller bezeichnen würde.
Jedenfalls habe ich hier das Olimex LPC-H2294-Board, welches über den 
Olimex ARM-USB-OCD-Adapter am USB-Port hängt.
Ich benutze Yagarto mit Eclipse und habe mich an dieses Tutorial 
gehalten. http://www.yagarto.de/howto.html
Das funktioniert auch alles soweit.
Allerdings sind die Programme, da ich ja nur in RAM debugge nach 
Trennung von der Spannungsquelle weg, und ich möchte ja dass das 
Programm auf dem Controller auch läuft wenn er nicht am PC hängt und er 
das Programm auch  neustartet, nachdem die Spannung einmal weg war.
Daraus folgere ich, dass ich das Programm in den Flash-Speicher 
schreiben muss.
Ich bin dazu bereits auf das Philips Flash Utility verwiesen worden, das 
Problem dass ich dabei habe ist jedoch, dass es das Board nicht finden 
kann. Ich habe in den Systemeinstellungen den USB-Serial-Port, der bei 
der Installation des Boards mit installiert wurde auf COM3 gestellt, den 
ich auch im Philips Tool eingestellt hab, es kommt jedoch immer die 
Fehlermeldung "Cannot communicate with Test Board!"
Muss ich den Controller anders an den PC anschließen, ist andere 
Software zu verwenden, gibt es sonst Einstellungen, seis an den Jumpern 
den Switches oder sonstwas was ich beachten muss? Oder braucht Ihr 
weitere Angaben um mir helfen zu können?
Ich habe keine Ahnung was ich nun tun soll, und bin daher für jede 
Hilfestellung dankbar.

von Andreas K. (a-k)


Lesenswert?


von Steffen K. (mrcrabs)


Lesenswert?

Andreas Kaiser wrote:
> http://www.flashmagictool.com/

Dort bekomme ich egal was ich mache den Fehler "Operation failed. 
(failed to autobaud - Step 1). Habe auch schon dort im Forum gepostet, 
da jemand das selbe Problem hatte.
Muss ich vielleicht den Olimex ARM-USB-OCD-Adapter rausnehmen und das 
Board direkt an USB-Port anschließen? Wenn ich das tue sucht das System 
nach Treibern für USB <-> Serial, die es aber nicht findet. Jemand eine 
Idee wo ich die herbekomme?  Wofür genau ist der Adapter überhaupt da?

von Robert Teufel (Gast)


Lesenswert?

Sehr wahrscheinlich einen der USB to serial adapters der nicht mit 
Flashmagic funktioniert. Die sind alle etwas verschieden und leider tun 
nicht alle.
Ich glaube auch DU hast was misverstanden. Flashmagic und auch das 
Philips Flash Programm arbeitet nicht mit USB! Es kann nur die serielle 
Schnittstelle bedienen. Falls das Olimexboard keine serielle anbietet 
bist Du auf den USB OCD angewiesen.
Eigentlich denke ich Du brauchst weder Flashmagic noch sonst ein Tool. 
Yagarto beschreibt doch im howto wie man das Flash programmiert 
(zumindest glaube ich das). Hab noch nie mit dem Olimex USB OCD 
gearbeitet, hab ein J-Link zur Verfuegung und da tut alles problemlos.

Robert

von let (Gast)


Lesenswert?

> (failed to autobaud - Step 1)
Wenn diese Fehlermeldung kommt liegt das in den meisten
Fällen daran das der Bootloader nicht gestartet wurde.
Sofern ich das richtig gelesen habe bietet das Olimex Board
einen Jumper (BL) und eine automatische Steuerung über den
Handshaking-Leitungen der RS232 Schnittstelle.

Um den Loader mit Hilfe des Jumpers zu starten muß dieser gesteckt
sein und das Board muß anschließend gestartet werden (Power-up oder
Reset).
Bei der Verwendung der automatischen Steuerung kann ein evtl.
vorhandener Resetcontroller den Start des Bootloaders zu lange
hinauszögern. Flashmagic hat dafür eine Option (Options->Advanced
options->Hardware Config->Use DTR and RTS. Da kann man die
Timeouts einstellen. Wenn ein Resetcontroller verbaut ist, sind
die Standardwerte zu knapp. Versuche es mal mit T2=500ms.

PS: Die Baudrate darf nicht über 38400 liegen. Die neueren LPCs
(23xx/24xx) können bis 115200 Baud.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

> Muss ich den Controller anders an den PC anschließen
Es muss eine serielle Verbindung zu UART0 des LPC berstehen. Beim 
genannten Olimex-Board also per on-board USB-seriell-IC. Philips Flash 
Tool/Flashmagic können nicht mit dem JTAG-Adatper umgehen.

> ist andere Software zu verwenden
Schon genanntes Flashmagic ist vorzuziehen, Philips-Tool sollte aber bei 
dem relativ betagten Controller auch noch funktionieren.

> gibt es sonst Einstellungen, seis an den Jumpern den Switches
> oder sonstwas was ich beachten muss?
Ja, werde versuchen, das im Folgenden zu erklären.

> Oder braucht Ihr weitere Angaben um mir helfen zu können?
Auf jeden Fall erstmal den Abschnitt "On-chip Bootloader" im User-Manual 
lesen.

> Muss ich vielleicht den Olimex ARM-USB-OCD-Adapter rausnehmen
Testweise ja. Was nicht angeschlossen ist, kann nicht stören.

> und das Board direkt an USB-Port anschließen?
Ja, genauer eine "COM-port" Verbindung zum UART0 des LPC s.o.

> Wenn ich das tue sucht das System nach Treibern für USB <-> Serial
> die es aber nicht findet. Jemand eine Idee wo ich die herbekomme?
www.ftdichip.com

> Wofür genau ist der Adapter überhaupt da?
Hoffentlich schon klar geworden

> Sehr wahrscheinlich einen der USB to serial adapters der nicht
> mit Flashmagic funktioniert.
Eher ungewöhnlich, dass ein USB-Seriell IC nicht mir Flashmagic "will", 
zumindest bei eigenen Tests noch keine Probleme mit FTDI und Prolific 
ICs in Adapterkabeln gehabt. Allerdings nicht mir LPC2294 getestet, da 
keine Hardware mit diesem Controller zur Hand. Kann mir auch nicht 
vorstellen (=Spekulation), dass Olimex das nicht getestet hat.

Wie schon erläutert, unterstützt OpenOCD - zumindest nach verfügbaren 
Beispielen - das "Flashen" in internen und externen (CFI) Flash-Speicher 
auch für diesen Controller über die JTAG-Schnittstelle. Man will 
möglicherweise dies und sich erst garnicht mit dem Bootloader 
herumplagen.

Augenscheinlich unterstützt das Board nicht den Start des Bootloaders 
von aussen über RTS (Olimex-typische Schaltung, warum auch immer). Also 
ein Versuch eines "Rezepts" zum Flashen des internen Flash-Speichers 
mittels Bootloader ("The bootloader itself does not contain any external 
memory programming algorithms.") Wie schon geschrieben, habe werder 
dieses Controllermodell nach das Board.

- Software so anpassen, dass für den internen Flash-Adressbereich 
gelinkt wird (muss man auch tun, wenn man mit OpenOCD "flashen" will)
- rebuild
- wenn nicht ohnehin schon Teil des Build-Vorgangs: Hex-Datei erzeugen 
(objcopy)

- Stromversorgung bzw. USB-Verbindung trennen
- Schalter "Boot" des Boards auf "Internal Flash" (siehe Schaltplan)
- Schalter ICSP 1 so einstellen, dass das BSL-Signal über R12 nach GND 
gezogen wird, sollte "ON" sein, evtl. nachmessen
- Schalter ISCP 2 dient dazu, das RST-Signal über "RS232" steuern zu 
können. Erstmal alles von Hand, also den Schalter so einstellen, dass 
keine Verbindung zwischen DTR und R9 besteht, wohl "off", evtl. 
nachmessen
- USB-Verbindung herstellen (damit auch die Stromversorgung)
- Reset/RST-Taste drücken und loslassen
- (LPC sollte nun im Bootloader-Modus sein)
- Flashmagic starten, COM-Port wählen, Baudrate erstmal relativ langsam, 
z.B. 19200
- Device ID auslesen (genauen Namen im Menü grade nicht erinnerlich), 
wenn das nicht funktioniert: nochmal von vorn und alles doppelt prüfen 
(oder ich habe etwas vergessen oder falsch beschreiben). Wenn ID 
angezeigt wird, hat man das Gröbste geschafft
- Hex-Datei wählen, "flashen" mit erase der verwendeten Sektoren und 
anschließendem verify
- Schalter ICSP 1 umschalten, Reset-Taste drücken, Programm sollte nun 
"losrennen"

Viel Erfolg


Off-Topic:
>[...]hab ein J-Link zur Verfuegung und da tut alles problemlos
Same procedure as every ... Manchmal fällt es mir schwer, die 
regelmäßige Lobpreisung des stets problemlosen, alleskönnenden und 
überhaupt bestimmt ganz superguten J-Link an der Lesefirewall 
abzublocken. Kann die geschäftlichen Motive dafür ja nachvollziehen aber 
es muss doch nicht immer wieder betont werden, sobald ein Thread sich 
auch nur ansatzweise mit ARM und/oder Anschluss über J-TAG Schnittstelle 
beschäftigt. Ich habe auch ein J-Link hier (ältere Hardwareversion ohne 
SAM7 aus einem AT91SAM7S-EK Kit) aber nutze es mangels passender 
Software nur bei den wenigen Experimenten mit der IAR EWARM-eval. 
FTDI2232-basierte Adapter, Parport-Wiggler und selbst ein altes ULINK"1" 
sind öfter im Einsatz. Mag sich ändern, wenn die grade laufende 
OpenOCD-Anpassung für J-Link fertiggestellt ist.)

von let (Gast)


Lesenswert?

> "The bootloader itself does not contain any external
>memory programming algorithms."

Danke, ich hatte mich gerade gefragt ob der Bootloader
den externen Flashspeicher programmieren kann.

von Robert Teufel (Gast)


Lesenswert?

@MThomas,

war nur relativ kurz bei Segger, habe keine geschaeftlichen Motive 
(mehr). Ich muss gestehen, dass ich immer neueste Software und teure 
Tools zur Verfuegung habe aber das tut einfach gut. Ich kann die Klagen 
ueber Funktionsprobleme von Wigglern und OCDs nur schwer ertragen. Dann 
wird das Forum bemueht die damit verbundenen Probleme zu beseitigen.
Nichts fuer ungut, wollte einfach nur sagen, dass mir tatsaechlich etwas 
daran liegt den Benutzern der Microcontroller das Leben leichter zu 
machen und nicht in erster Linie Werbung fuer eine Firma zu machen, fuer 
die ich mal gearbeitet habe.

p.s. wenn es das U-Link nicht nur fuer Keil gaebe, wuerde ich es 
ebensooft hier anpreisen denn (mindestens neueste versionen) tun einfach 
;-)
Aber die Fragen kommen hier immer zu umsonstigen oder niedrigpreisigen 
und oft weniger hochwertigen Tools, weil die anderen eben weniger Fragen 
aufwerfen / dafuer Support da ist.

Robert

von Steffen K. (mrcrabs)


Lesenswert?

Zunächst mal Danke für die schnelle Hilfe. Mit Hilfe des FTDI-Treibers 
kann ich das Board nun direkt an den USB-Port anschließen, die Device-ID 
auslesen sowohl mit dem Philips-Tool als auch mit Flash-Magic.
Die Hex-File die mir der Compiler generiert hat (das ist doch die die 
ich hochladen muss oder?) ist keine 2kb groß...in Flash Magic kommt die 
Fehlermeldung "Error Programming the Hex-File: RAM locations 0x40000120 
to 0x40000FF1 are used by BootLoader. Please ensure you RAM-based 
firmware does not use these locations."
Philips Flash Utility sagt einfach nur "Code in Hex-file exceeds Flash 
limitations!", meint aber wohl das Selbe denk ich.
Wie kann ich denn einstellen welcher Flash-Bereich beschrieben wird bzw. 
was muss ich sonst anders machen?

Die Sache mit den ganzen Jumpern irritiert mich allerdings. Ich hab 
schon öfter im Internet gelesen dass man einen BSL-Jumper setzen soll 
und sowas. Den Jumper gibt es allerdings gar nicht. Es gibt einen 
DBG-Jumper zum aktivieren und deaktivieren von JTAG, sonst keinen. 
Selbst auf der Olimex-Seite ist von drei Jumpern die Rede... 
http://www.olimex.com/dev/lpc-h2294.html

In der Dokumentationsdatei gibts für die beiden ICSP-Schalter auch nur 2 
Möglichkeiten: Beide ON => Enable ICSP-Programming, beide OFF => Disable 
ICSP-Programming...also mache ich während des Flashens beide an und 
danach beide aus?

von Steffen K. (mrcrabs)


Lesenswert?

Da ich meinen Beitrag nicht bearbeiten kann ein Neuer...

- Software so anpassen, dass für den internen Flash-Adressbereich
gelinkt wird (muss man auch tun, wenn man mit OpenOCD "flashen" will)

Wo genau kann man das anpassen, bin leider noch ein ziemlicher Neuling 
mit Mikrocontrollern und den ganzen dazu benötigten Tools...
Wie genau würde ich mit OpenOCD flashen? Dazu benötige ich doch eine 
andere cfg-file als für das Programmieren über JTAG. Wo bekomme ich die 
her bzw. wie wichtig sind Kenntnisse über die cfg-Files? Ich habe bisher 
jedenfalls keine.

Ist ICSP - In-Circuit-Serial-Programming in etwa das selbe wie ISP? Zur 
Zeit versteh ichs jedenfalls in etwa so, dass man den Controller nur 
über den Serial Port programmieren kann ohne ihn aus dem System zu 
entfernen...

von Andreas K. (a-k)


Lesenswert?

Steffen Krebs wrote:

> Fehlermeldung "Error Programming the Hex-File: RAM locations 0x40000120
> to 0x40000FF1 are used by BootLoader. Please ensure you RAM-based
> firmware does not use these locations."

Wenn ein Programms ins RAM geschrieben werden soll, dann muss dieser 
Bereich freigehalten werden. => Linker-Script.

Wenn das Programm ins ROM geschrieben werden soll, dann sollte dieser 
Bereich im Hex garnicht vorkommen. => Linker-Script.

von Robert Teufel (Gast)


Lesenswert?

@Steffen
Ganz allgemein zur Memory Map im LPC2000
SRAM liegt ab der Adresse 0x40000000
Flash liegt ab Adresse 0x0 mit der Ausnahme des Bootloaders direkt nach 
dem Power On Reset, bitte dazu Docu LPC2294 lesen und nach Memory Map 
suchen.

Naruerlich hat a-k absolut recht, das alles wird im Linker Script 
festgelegt. Falls dort falsche Adressen angegeben sind, hilft auch das 
beste Tool nichts, es ist halt kein Flash ab der Adresse 40000000

Robert

von let (Gast)


Lesenswert?

Ich würde mit der Suche im Makefile beginnen. Vielleicht
ist das schon für eine ROM Version vorbereitet.
Sieh mal nach ob es dort soetwas wie "ROM_RUN" gibt.

Ansonsten könntest du auf der Seite von Martin Thomas
(google nach WinARM) die Beispiele durchsehen.

> Ist ICSP - In-Circuit-Serial-Programming in etwa das selbe wie ISP?
Im Prinzip schon. ISP (In System Programming) ist vielleicht etwas
allgemeiner, sofern man mit "Serial-Programming" die serielle
Schnittstelle meint.

Der Baustein läßt sich auch über JTAG programmieren. So wie
es aussieht ist das auch die einzige Möglichkeit den externen
Speicher zu beschreiben ohne sich einen eigenen Loader zu
schreiben.
Wie das mit OpenOCD funktioniert weiß ich leider nicht.
Nach einigen Tagen herumprobieren habe ich die Versuche aufgegeben.
Meist verwende ich den Bootloader oder aber - den JLINK ;)

von Steffen K. (mrcrabs)


Angehängte Dateien:

Lesenswert?

ROM_RUN kann ich in der makefile nicht finden. Ich hab die makefile mal 
gepostet, leider bin ich momentan noch nicht imstande damit was 
anzufangen, ich versuch mich halt überall reinzulesen aber das ist schon 
ziemlich kompliziert alles, find ich.

Welche Datei ist denn das Linkerskript?

von let (Gast)


Lesenswert?

Ah, ok. Das Linkerscript wird hier für den jeweiligen
Anwendungsfall (RAM, ROM) direkt angegeben.
In den Zeilen 54 u. 55 ist es zu tun. Da wird auf das
entsprechende Script verwiesen.

von Steffen K. (mrcrabs)


Angehängte Dateien:

Lesenswert?

LDSCRIPT= ./prj/lpc2294_ram.ld
#LDSCRIPT= ./prj/lpc2294_rom.ld

Okay, mit meinem äußerst laienhaften Verständnis erkenne ich dass in der 
makefile die obere der beiden Dateien als Linkerskript angegeben ist, da 
die untere ja auskommentiert ist. Hab das nunmal vertauscht...und siehe 
da:

Es funzt :-)

Tausend Dank an Alle die mir geholfen haben! :-)

Aber mal was anderes: Ich hab das Gefühl mir fehlt total viel 
Hintergrundwissen in zig Sachen: Wie sehr sollte man sich mit makefiles, 
Linker Files etc. auskennen...könnt ihr sowas intuitiv selbst schreiben?

Habt ihr vielleicht Seiten auf denen ich mich einlesen kann in das alles 
ist ja wirklich n dicker Brocken.

von mm (Gast)


Lesenswert?

Unter

http://www.gnuarm.org/ >> Support

gibt es jede menge Doku über Linker, Kompiller usw.

die Doku zur make.exe gibt es auch sicher irgendwo.

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.