Forum: Mikrocontroller und Digitale Elektronik ADuC706x DataStorage


von Kahn P. (Gast)


Lesenswert?

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

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

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.

von Karsten Schulz (Gast)


Lesenswert?

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

von Karsten Schulz (Gast)


Lesenswert?

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);
}

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.