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


von Bernd (Gast)


Lesenswert?

Hallo,

irgendwie will bei mir die Flashprogrammierung aus der Anwendung heraus 
nicht funktionnieren. hier mal ein Ausschnitt aus dem Programm.
1
#define IAP_LOCATION 0x7ffffff1
2
typedef void (*IAP)(unsigned int [],unsigned int[]);
3
IAP iap_entry;
4
5
 int main (void) { 
6
7
  int i;
8
9
  unsigned int command[5];
10
  unsigned int result[2];
11
  unsigned char write[]={0,1,2,3,4,5,6,7,8,9};
12
  Init();     
13
  command[0]=52;
14
  command[1]=0;//0x7000;
15
  command[2]=7;//((unsigned long)(&write)&0xFFFFFFFC);
16
  command[3]=70000;//256;
17
  command[4]=70000;
18
  iap_entry=(IAP) IAP_LOCATION;
19
  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

von Daniel S. (dschwab)


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

von Bernd (Gast)


Lesenswert?

Danke,

ich habe da wohl nicht gründlich genug gelesen. Das reine Programmieren 
klappt jetzt.
1
  command[0]=50;
2
  command[1]=7;
3
  command[2]=7;
4
  iap_entry(command, result);
5
  DbgTraceLong(30, result[0]);
6
  
7
  command[0]=51;// copy ram to rom
8
  command[1]=0x7000;
9
  command[2]=((unsigned long)(&write)&0xFFFFFFFC);
10
  command[3]=512;
11
  command[4]=70000;
12
  iap_entry(command, result);
13
  DbgTraceString(0xB, "AfterFlashing");
14
  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

von Bernd (Gast)


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

von Daniel S. (dschwab)


Lesenswert?

Hallo

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

Welchen LPC verwendest du?

Gruss, Daniel

von Bernd (Gast)


Lesenswert?

Ich verwenden den LPC2103. Firmware? Kann man den Bootloader updaten?

von Daniel S. (dschwab)


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

von Robert Teufel (Gast)


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

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.