Forum: Mikrocontroller und Digitale Elektronik STM32: Während Flash schreiben => anderes tabu?


von Martin (Gast)


Lesenswert?

Hallo zusammen,

ich möchte das Flash eines STM32F103 als Eeprom-Ersatz (AN2594) 
verwenden. Im Datenblatt und sonstigem ST-Dokus habe ich 
widersprüchliche Aussagen gefunden. Einmal soll es nicht erlaubt sein, 
während der Schreibphase aufs Flash zuzugreifen (z.B. um in einem 
anderen Task/Interrupt/sonstwas Code auszuführen). Ein anderes Mal liest 
man, dass es hier keine Einschränkung geben soll.
Ich verwende ein 128k-Derivat, das nur eine Bank(?) hat. Liegt hier 
evtl. der Unterschied zu Derivaten mit mehr als einer Bank(?). (Bin mir 
unsicher, ob Bank der richtige Begriff ist).

Hat jemand hierzu eine eindeutige Aussage? Ich würde natürlich gerne 
hören, dass es niemals nicht kein Problem ist, wenn während des 
Schreibvorganges zeitgleich anderer Code ausgeführt wird. :-)
Ich will/kann nämlich nicht die restliche Codeausführung für viele 
Millisekunden "anhalten".

Danke,
 Martin.

von holger (Gast)


Lesenswert?

>Ich will/kann nämlich nicht die restliche Codeausführung für viele
>Millisekunden "anhalten".

Dann kauf dir ein SPI-FRAM und hühner da nicht im Flash rum.

von Kuhle Wampe (Gast)


Lesenswert?

Wo stammen deine widersprüchlichen Information (Link)? Wenn die Zahl der 
Schreibzugriffe gering ist, sollte es gehen. Da man das Flash, in dem 
das Programm abgearbeitet wird, nicht beschreiben kann, erfolgt der 
Zugriff von einem Programm aus, welches im RAM läuft.

P. S. 'holger' ist ein Schwätzer. Nicht weiter beachten.

von Martin (Gast)


Lesenswert?

Kuhle Wampe schrieb:
> Wo stammen deine widersprüchlichen Information (Link)?
Das ist leider das Problem mit dem irgendwann/irgendwo Gelesenem - man 
weiß es nicht mehr. Ich habe nur noch im Hinterkopf, dass da was war. 
Wenn nichts war, umso besser.

> Wenn die Zahl der
> Schreibzugriffe gering ist, sollte es gehen. Da man das Flash, in dem
> das Programm abgearbeitet wird, nicht beschreiben kann, erfolgt der
> Zugriff von einem Programm aus, welches im RAM läuft.
Nein, das ist nicht das Problem. Man muss bei den STM32 die 
Flashroutinen nicht ins RAM kopieren. Habe gerade nochmal in der 
StdPeripheralLib von ST nachgesehen. Offensichtlich können die STM32 
gleichzeitig aus dem Flash den Code ausführen und einen anderen Block(?) 
oder Bank(?) löschen. Die sperren dort auch keine Interrupts oder sowas. 
Aber gibt mir das die Gewissheit, dass es nicht doch zu Problemen kommt, 
wegen irgendwas, das ich nicht bedenke/kenne?

Mein reales Problem ist, dass zur gleichen Zeit anderer Code ausgeführt 
werden soll/muss. Da ich nicht auf externes Eeprom ausweichen möchte, 
frage ich nach einer Aussage von jemandem, der das sicher weiß.

Danke.

von Georg (Gast)


Lesenswert?

Martin schrieb:
> Aber gibt mir das die Gewissheit, dass es nicht doch zu Problemen kommt,
> wegen irgendwas, das ich nicht bedenke/kenne?

Trenne Blocks in Programm- und Daten-Blocks. Natürlich kannst du aus 
einem Block, den du gerade beschreibst, keine Programmfunktionen 
ausführen. Also in dem Block besser garkein Programm unterbringen, sonst 
wird das sehr unübersichtlich und fehleranfällig. Der Programmierer 
meint oft, das und das könnte zu der und der Zeit ja nicht passieren, 
aber das sind mit die am schwierigsten zu findenden Fehler, wenn man 
sich da täuscht. Und das soll gelegentlich vorkommen.

Georg

von Detlef K. (adenin)


Lesenswert?

Du kannst überall in den Flash schreiben, Interrupts müssen aber vorher 
gesperrt werden. Wärends des eigendlichen Schreibvorgangs hält die CPU 
automatisch an, bis der Vorgang beendet ist.

von Steve (Gast)


Lesenswert?

PM0068 Programming manual STM32F10xxx XL-density Flash programming

During a write operation to the Flash memory, any attempt to read the 
Flash memory will stall the bus. The read operation will proceed 
correctly once the write operation has completed. This means that code 
or data fetches cannot be made while a write/erase operation is ongoing.

Dual bank architecture
The XL-density Flash memory features a dual bank architecture based on 
bank 1 (512Kbytes) and bank 2 (up to 512Kbytes). This architecture 
supports the RWW (readwhile-write) capability. This means that while a 
read or program operation is performed in a bank, the other bank can be 
accessed for another operation (read or program) without the need to 
wait for the End of Operation on the first bank.


D.h: Mit nur einer Code in RAM kopieren und aus dem RAM laufen, speziell 
beim Löschen.

von Steve (Gast)


Lesenswert?

D.h: Mit nur einer Bank den Code in RAM kopieren und aus dem RAM laufen, 
speziell beim Löschen.

von Martin (Gast)


Lesenswert?

Danke für die Rückmeldungen, aber jetzt haben wir wieder den Salat. Es 
gibt verschiedene, widersprüchliche Meinungen. :-)
Vielleicht liegt das daran, dass nicht klar ist/war, um welches Derivat 
es sich bei mir eigentlich genau handelt. => STM32F103RBT6, also ein 
medium-densitiy Teil. Scheinbar unterscheiden sich die einzelnen 
Derivate doch in Details voneinander?!?

Steve schrieb:
> PM0068 Programming manual STM32F10xxx XL-density Flash programming
[...]
> D.h: Mit nur einer Bank den Code in RAM kopieren und aus dem RAM laufen,
> speziell beim Löschen.
Das scheint nicht für meinen STM32F103RBT6 zu gelten, denn der gehört 
nicht zur XL-density Serie.
Außerdem kann ich mit der von dir zitierten Stelle aus PM0068 auch nicht 
deine Schlussfolgerung nachvollziehen.


Detlef Kunz schrieb:
> Du kannst überall in den Flash schreiben, Interrupts müssen aber vorher
> gesperrt werden. Wärends des eigendlichen Schreibvorgangs hält die CPU
> automatisch an, bis der Vorgang beendet ist.
Das mit dem automatischen Anhalten ("stall") kenne ich auch von einem 
STM8. So verstehe ich auch den Text aus PM0075:
1
During a write operation to the Flash memory, any attempt to read
2
the Flash memory will stall the bus. The read operation will proceed 
3
correctly once the write operation has completed. This means that code or 
4
data fetches cannot be made while a write/erase operation is ongoing.
Daher erscheint mir deine Erklärung für die passendste. Danke.

Frage : Aber wieso muss dabei eine Interruptsperre aktiv sein?

von Martin (Gast)


Lesenswert?

Ich habe aber auch gleich noch eine weitere Verständnisfrage zu AN2594.
Was bewirkt folgender Code (aus eeprom.c), speziell die Zeile mit dem 
'<===':
1
uint16_t EE_Init(void)
2
[...]
3
/* Transfer data from Page1 to Page0 */
4
for (VarIdx = 0; VarIdx < NumbOfVar; VarIdx++)
5
{
6
  if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])  <===
7
  {
8
    x = VarIdx;
9
  }
10
  if (VarIdx != x)
11
  {
12
    /* Read the last variables' updates */
13
    ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
14
    /* In case variable corresponding to the virtual address was found */
15
    if (ReadStatus != 0x1)
16
    {
17
      /* Transfer the variable to the Page0 */
18
      EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
19
      /* If program operation was failed, a Flash error code is returned */
20
      if (EepromStatus != FLASH_COMPLETE)
21
      {
22
        return EepromStatus;
23
      }
24
    }
25
  }
26
}

Dieser Code wird in EE_Init ausgeführt, sobald erkannt wurde, dass ein 
Block gültig ist (VALID) und der andere Block auf RECEIVE_DATA steht. 
Also dann wenn die Daten von einem Block zum anderen umkopiert werden 
müssen.

Frage: Wieso wird da immer fix mit Adresse Base+6 verglichen? Das 
bewirkt doch nur, dass immer die erste Variable aus der 
Variablenliste/VirtAddr-Liste NICHT in den neuen Block geschrieben wird. 
Wieso will man das hier so? Oder was habe ich nicht verstanden?

AN2594: Link: 
http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF257846

Danke,
 Martin.

von Detlef K. (adenin)


Lesenswert?

Martin schrieb:
> Frage : Aber wieso muss dabei eine Interruptsperre aktiv sein?
Ups, ja das ist nur für die Unlock-Sequenz nötig, damit die niemand 
unterbricht.

von Martin (Gast)


Lesenswert?

Weitere Frage:
Angenommen eine Page ist bereits komplett gelöscht und ich lösche diese 
nochmals mit Erase. Geht das trotzdem aufs Material? Sprich zählt das 
als Programmiervorgang, der auf die Lebensdauer geht, obwohl die Bits 
eigentlich elektrisch nicht gelöscht werden (müssen)?

Hintergrund: AN2594 löscht ja bei EE_Init immer die gerade nicht in 
Verwendung befindliche Page grundsätzlich beim Hochfahren - auch wenn 
diese bereits im gelöschten Zustand ist.

Danke dir, Detlef. :-)

Gruß,
 Martin.

von Detlef K. (adenin)


Lesenswert?

Martin schrieb:
> Angenommen eine Page ist bereits komplett gelöscht und ich lösche diese
> nochmals mit Erase. Geht das trotzdem aufs Material? Sprich zählt das
> als Programmiervorgang, der auf die Lebensdauer geht, obwohl die Bits
> eigentlich elektrisch nicht gelöscht werden (müssen)?

Eine sehr gute Frage.
Die Frage ist ja, was macht die Flashzelle kaputt?
Das ist der Durchgang der Elektronen duch die Isolierung (also auch das 
Schreiben sollte zerstörent wirken und man spricht ja auch von 
write/erase cycles).
Wenn die Page leer ist, und daraus folgend keine Elektronen tunneln 
müssen, dann sollte eigentlich nicht passieren.
Aber letztendlich können das nur die Entwickler der jeweiligen 
Flash-Technologie beantworten.

Mein Algorithmus testet vor einem PageErase ob die Page leer ist, und 
wenn leer, dann wird nicht nochmal gelöscht.

von Schaulus Tiger (Gast)


Lesenswert?

Detlef Kunz schrieb:
> Martin schrieb:
>> Angenommen eine Page ist bereits komplett gelöscht und ich lösche diese
>> nochmals mit Erase. Geht das trotzdem aufs Material? Sprich zählt das
>> als Programmiervorgang, der auf die Lebensdauer geht, obwohl die Bits
>> eigentlich elektrisch nicht gelöscht werden (müssen)?

> Mein Algorithmus testet vor einem PageErase ob die Page leer ist, und
> wenn leer, dann wird nicht nochmal gelöscht.

Das könnte auf die Datensicherheit gehen. Wenn der Löschvorgang im 
richtigen Moment abgebrochen wurde, sind die Zellen nur halb gelöscht, 
gerade genug, um beim ersten Lesen nicht aufzufallen. Nach dem 
Beschreiben sind dann mehr Bits auf 0 als man möchte.

Deswegen schreibe ich ein Flag-Byte im frisch gelöschten Sektor. Wenn 
nach einem Reset dieses Flag nicht stimmt, lösche ich nochmal. Wenn es 
zu stimmen scheint, ist es evt. auch nur halb programmiert, aber das ist 
in dem Fall egal.

Keine Ahnung, ob das wirklich soviel nützt wie ich glaube.

von Detlef K. (adenin)


Lesenswert?

Schaulus Tiger schrieb:
> Das könnte auf die Datensicherheit gehen. Wenn der Löschvorgang im
> richtigen Moment abgebrochen wurde, sind die Zellen nur halb gelöscht,
> gerade genug, um beim ersten Lesen nicht aufzufallen. Nach dem
> Beschreiben sind dann mehr Bits auf 0 als man möchte.

Das ist eine Frage des Protkolls.
Das könnte ja auch beim Schreiben passieren.
Wenn ein Vorgang nicht abgeschlossen werden konnte, ist die Page als 
korrupt zu betrachten.

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.