Hallo , ich habe einen Mikrocontroller von AnalogDevices named: ADuC7060 Alles wunderbar, leider werde ich nicht gescheit aus den Examples, ich möchte schlicht ein oder zwei Bytes über einen Reset/Powerless hinaus abspeichern/laden. Gibt es Hinweise, welche Register dafür geeignet sind ? Danke für Hinweise Karsten
Karsten Schulz schrieb: >[...] > named: ADuC7060 Vorab: mit ADuC7060 habe ich bisher nichts gemacht, jedoch jüngst recht viel mit ADuC7026. Auf den ersten Blick scheint die Funktionalität für in-application-programming identisch, habe aber nichts alles genau verglichen. > Alles wunderbar, leider werde ich nicht gescheit aus den > Examples, ich möchte schlicht ein oder zwei Bytes > über einen Reset/Powerless hinaus abspeichern/laden. > > Gibt es Hinweise, welche Register dafür geeignet sind ? Ja: Die Register, deren Bezeichnungen mit FEE beginnen. Aber das hilft wahrscheinlich auch nicht wirklich weiter... Vor Schreib- und Löschoperationen muss freigeschaltet werden, vgl. Bitbeschreibung FEEMOD. Gelöscht werden kann, wie üblich bei Flash-Speichern, nur seitenweise (Seitengröße 512 Bytes) und damit werden alle enthaltenen Bits gesetzt. Vorgehensweise: Eine Adresse innerhalb der Seite in FEEADR, Code für Operation Erase-Page in FEECON, dann FEESTAT abfragen, bis busy-bit gelöscht und schliesslich prüfen, ob im letzten gelesenen FEESTA-Wert das command-fail-Bit gesetzt war. Schreiben kann man halb-Wort-weise (16bit) und damit vorher beim Löschen gesetzte Bits löschen. Schreiben eines 16-Bit Werts: Adresse in FEEADR, Wert in FEEDAT, Code für half-word-write in FEECON, FEESTAT-Abfrage wie beim Seitenlöschen. Es gibt auch eine schreiben-und-prüfen Operation, kann man aber auch per "if (*(Adresse)==Sollwert)" machen. Falls die "ein oder zwei Bytes" nur selten geändert werden, kann mann mit einem read-modify-write Ansatz auf immer der selben Seite arbeiten, falls nicht, muss man ein "wear-leveling" implementieren. Relativ einfacher Ansatz dafür in einer Application Note von STMicro für STM32 (Titel "EEPROM emulation with STM32" oder so ähnlich). Viel Erfolg.
ALso danke erstmal für den Hinweis das jene Register FEE beginnen, leider gibt es anscheinend nicht ein Example was nun veranschaulicht wie Daten im Flash ram dauerhaft eingetragen/gelesen werden können. Es bleibt ein Rätsel Gruß Karsten
Rätsels lösung für ADuC7060/61
void SaveFlash(WORD addr, WORD value)
{
FEEMOD = 0x8; // bit 3 should be set to allow erase/write
FEEADR = addr;
FEEDAT = value;
FEECON = 0x03;
while (!(FEESTA&0x03));
//if ((FEESTA&&0x02)==0x02) ERROR = 1;
}
WORD LoadFlash(WORD addr)
{
FEEMOD = 0x8; // bit 3 should be set to allow erase/write
FEEADR = addr;
FEECON = 0x01;
while (!(FEESTA&0x03));
//if ((FEESTA&&0x02)==0x02) ERROR = 1;
return(FEEDAT);
}
Abfragen eher in der Art:
1 | uint32_t stat; |
2 | //[...]
|
3 | while ((stat = FEESTA) & (1 << 2)) { |
4 | // warten bis busy bit geloescht
|
5 | }
|
6 | if (stat & (1 << 1)) { // test command fail bit |
7 | ERROR = 1; |
8 | } else { |
9 | ERROR = 0; |
10 | }
|
11 | //[...]
|
Für LoadFlash braucht man die FEE-Funktionen nicht zu bemühen, dazu reicht aus:
1 | wert = *(unsigned long*)(addr) |
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.