www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2103 In Application Flash Programming?


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

irgendwie will bei mir die Flashprogrammierung aus der Anwendung heraus 
nicht funktionnieren. hier mal ein Ausschnitt aus dem Programm.
#define IAP_LOCATION 0x7ffffff1
typedef void (*IAP)(unsigned int [],unsigned int[]);
IAP iap_entry;

 int main (void) { 

  int i;

  unsigned int command[5];
  unsigned int result[2];
  unsigned char write[]={0,1,2,3,4,5,6,7,8,9};
  Init();     
  command[0]=52;
  command[1]=0;//0x7000;
  command[2]=7;//((unsigned long)(&write)&0xFFFFFFFC);
  command[3]=70000;//256;
  command[4]=70000;
  iap_entry=(IAP) IAP_LOCATION;
  iap_entry(command, result);

Außerhalb der main Funktion deklariere ich IAP_LOCATION als 
Funktionspointer.
In der Funktion wird dem Funktionspointer dann die Addresse 0x7FFFFFF1 
wie im Datenblatt beschreiben zugeweisen. Dann rufe ich die Funktion mit 
"command" als Parameter auf.
52 sollte der Code für Erase Sectors sein. Also Sektor 0-7 löschen. Der 
Chip läuft mit 70MHz PLL 5x und 14MHz Quarz.

Prinzipiel sollte sich das Programm doch mit diesem Aufruf selber 
löschen. Habe es vorher auch mit 51 (Copy Ram To Rom) probiert und den 
Werten hinter den "//", aber auch ohne Erfolg.

Was mache ich falsch?

Grüße,
Bernd

Autor: Daniel Schwab (dschwab)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Bin im Moment nicht gearde im Büro um Nachzusehen, aber mir schwebt es 
so vor, dass man vor jedem Schreibvorgang prepare aufrufen sollte.

Gruss, Daniel

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,

ich habe da wohl nicht gründlich genug gelesen. Das reine Programmieren 
klappt jetzt.
  command[0]=50;
  command[1]=7;
  command[2]=7;
  iap_entry(command, result);
  DbgTraceLong(30, result[0]);
  
  command[0]=51;// copy ram to rom
  command[1]=0x7000;
  command[2]=((unsigned long)(&write)&0xFFFFFFFC);
  command[3]=512;
  command[4]=70000;
  iap_entry(command, result);
  DbgTraceString(0xB, "AfterFlashing");
  DbgTraceLong(30, result[0]);

Jetzt stellt sich noch die Frage, wo sind Konstanten wie 
"SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION" definiert?

Aber das Löschen funktionniert noch nicht.
[c]
  command[0]=50;
  command[1]=7;
  command[2]=7;
  iap_entry(command, result);
  DbgTraceLong(30, result[0]);  // gibt 0 zurück

  DbgTraceString(0xB, "BeforeEraseSector");
  command[0]=52;    //erase sector
  command[1]=7;     // startsector 7
  command[2]=7;     // endsector 7
  command[3]=70000;
  iap_entry(command, result);
  DbgTraceString(0xB, "AfterErase"); // wird nicht mehr ausgeführt?!?!?
[/c)

Das Vorbereiten mit Prepare wird mit 0 als Ergebnis abgeschlossen, wenn 
ich dann allerding Erase Sector (52) mit Startsektor 7 und Endsektor 7 
aufrufe, kehrt die Funktion nicht mehr zurück. Die Schreibfunktion (51) 
hingegen terminiert nach 1 ms.

Bernd

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wenn ich es nicht verstehe. Nach dem ich einmal alles ausgeschaltet 
läuft es jetzt. Sollte sich der LPC irgendwie weggehangen haben?

Nun ja, auf jeden fall läufts. Danke für den Tip.

Danke,
Bernd

Autor: Daniel Schwab (dschwab)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Kontrolliere die Version der Firmware auf dem LPC und installiere die 
neuere Version.

Welchen LPC verwendest du?

Gruss, Daniel

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwenden den LPC2103. Firmware? Kann man den Bootloader updaten?

Autor: Daniel Schwab (dschwab)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich arbeite mit dem LPC2124, deshalb kann ich es dir jetzt nicht sagen, 
wie es beim LPC2103 aussieht. Für den LPC2124 ist es sehr wichtig die 
Version 1.66 zu verwenden. Die Version 1.63 ist für die ISP 
Programmierung etwas fehlerhaft. Ein Upload kann man mit dem Philips ISP 
Utility machen und ist sehr gut Dokumentiert.

Wenn wir ins Flash etwas schreiben, schalten wir immer den PLL aus und 
gehen mit dem Speed zurück auf die 12MHz. Irgendwo hatte ich mal 
gelesen, dass man dies so machen soll.

Gruss, Daniel

Autor: Robert Teufel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim LPC2124 war der bootloader im Flash und konnte mit der o.g. Utility 
auf einen neueren Stand gebracht werden.
Der LPC2101/2/3 hat den bootloader in einem ROM Bereich, kein Update, 
kein versehentliches Loeschen moeglich.

Robert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.