STM32 + Nichtflüchtiger Speicher

OP #2450180
Hallo Leute,

ich habe folgendes Problem.

Ich habe eine Software die auf verschiedenen Hardwares läuft.(Alles mit 
den gleichen STM32F103RET6-controllern).

Je nachdem auf welcher Hardware sich die Software befindet soll sie 
entsprechendes Verhalten an den Tag legen.

Dazu habe ich 2 prinzipielle Lösungsansätze:

1. Ich verdrahte einige Pins des µC auf High und Low und habe somit eine 
Hardwarecodierung die ich am Programmstart auslese.

2. Ich benutze einen Nichtflüchtigen Speicher, den ich 1 mal beschreibe.
Dazu könnte man wunderbar einen EEPROM hernehmen.

Jetzt ist meine Frage:
Kennt jemand eine bessere Möglichkeit als einen externen EEPROM zu 
nehmen?
Zur not könnte man was in den Flashspeicher schreiben. Aber ich hätte 
lieber eine Lösung, die nach dem Flashen immernoch funktioniert.

Wenn jemand einen guten Rat oder auch einfach nur eine Idee hat wäre ich 
wirklich dankbar.

ein paar schlagworte würden es zur not auch tun :)

Vielen dank
Tarkan
Gast #2450205
ST hat eine Applikationsschrift zum Benutzen des Flash als EEPROM 
Ersatz. Bei Preisen von 0.40 Euro wuere ich aber ein externes I2C EEPROM 
vorsehen...
(Firma: EleLa - www.elela.de) #2450225
Ich hätte 3 Ansätze:

- 1 IO-Pin = 3 Zustände GND/VCC/Offen
- 1 ANA-IN Pin und da über einen Spannungsteiler (2 Winderstände) einen 
Wert vorgeben
- Beim STM32F2xx / F4xx gibt es 512 Byte OTP (Siehe Refman 2.3.3)

Ansonsten den oberen Flash-Bereich belegen und nur selektiv die 
Fals-Bereiche löschen, kein Chip-Erase, das sollte die Update-Funktion 
halt können.
#2450267
Das geht ohne externe Devices und ohne das Flash bemühen zu müssen. In 
den Option Bytes der STM32F1xx, die ansonsten für Read/Write-Protection 
zuständig sind, stehen 2 frei programmierbare Bytes für die Anwendung 
zur Verfügung. Mehr dazu siehe "PM0075 - Programming manual".
Gast #2450292
ich nütze für solche Dinge immer einen Bereich im µC-eigenen Flash.

Es ist ja nicht so dass beim Flashen immer alles gelöscht werden muss! 
Im Flashprogramm gibt es meist einen Haken "retain unchanged main 
memory" / "no Full erase" / "erase sectros"....
OP #2450329
A. K. schrieb:
> Das geht ohne externe Devices und ohne das Flash bemühen zu müssen. In
> den Option Bytes der STM32F1xx, die ansonsten für Read/Write-Protection
> zuständig sind, stehen 2 frei programmierbare Bytes für die Anwendung
> zur Verfügung. Mehr dazu siehe "PM0075 - Programming manual".

Also ich bin grad dabei das Auszuprobieren. Kann ich mich da aus dem µC 
aussperren oder was kaputt machen wenn ich da irgendeinen quatsch 
reinschreibe?
Bleib dieser Speicher auch nach dem Flashen erhalten?
#2450369
Tarkan D. schrieb:

> Bleib dieser Speicher auch nach dem Flashen erhalten?

Ich nehme an ja, da "mass erase" und "option byte erase" getrennte Bits 
im Steuerregister verwendet. Aber häng den erwähnten seriellen Flash 
Loader dran und probier es aus.

Der kann die übrigens sogar per command line einzeln programmieren.
(Firma: EleLa - www.elela.de) #2450492
Mit dem "STM32 ST-LINK Utility" von ST kann man alles getrennt 
programmieren. Damit sollte man am einfachsten das ganze testen können.

Als Kommandozeile sollte dann das Tool "ST-LINK_CLI.exe" verwendet 
werden.

Die grafische Oberfläche "STM32 ST-LINK Utility.exe" hat die 
Command-Line Parameter nicht.
Angehängte Dateien:
OP #2450493
Vielen Dank für die vielen Antworten.

Ich muss mein Problem etwas genauer eingrenzen. Ich hab leider vergessen 
zu sagen dass ich die Bytes während der Programmlaufzeit beschreiben 
will.

Also:
1. Ich möchte eine Software schreiben die ich auf meine Karte flashe.
2. Nachdem das geschenen ist möchte ich über USB oder sonst was ein paar 
bytes empfangen.
3. diese Bytes sollen nun von meiner schon draufgeflashten software 
irgendwo hingeschrieben werden, sodass sie nach einem reset nicht 
verloren gehen.Auch ein erneutes flashen über jtag sollte diesen wert am 
besten nicht überschreiben.
4. mein programm sollte diese bytes problemlos auslesen können.

was ich schon habe:
1
    uint32_t COPY_OF_FLASH_OBR, FLASH_OBR_MASK; //Buffer für das Register
2

3
    unsigned char FLASH1,FLASH2;  // Bytes anlegen die geschrieben werden sollen
4

5
    COPY_OF_FLASH_OBR = *(__IO uint32_t*)(0x4002201C);  // inhalt des optionbyte registers holen
6
    FLASH_OBR_MASK = 0xFC0003FF;  // maske damit nur die richtigen bytes verändert werden
7
    COPY_OF_FLASH_OBR &= FLASH_OBR_MASK; // nur die relevanten bytes werden gelöscht
8
    FLASH1 = 0x00;FLASH2 = 0x00;  // testweise sollen die beiden bytes den wert 0 haben
9
    COPY_OF_FLASH_OBR |= ( (uint32_t)(FLASH1<<10) | (uint32_t)(FLASH2<<18) );  // verändern des buffers
10
    *(__IO uint32_t*)(0x4002201C) = COPY_OF_FLASH_OBR;  // zurückschreiben
11
    COPY_OF_FLASH_OBR = *(__IO uint32_t*)(0x4002201C);  //erneutes auslesen des registers

wer hätte es gedacht, es funktioniert nicht. wäre auchzu schön gewesen.

manche werden sich an den kopf fassen, andere evtl. lachen.

Leider hab ich keine ahnung wie ich es sonst anstellen soll :S
OP #2450513
Tarkan D. schrieb:
1
    uint32_t COPY_OF_FLASH_OBR, FLASH_OBR_MASK; //Buffer für das Register
2

3
    unsigned char FLASH1,FLASH2;  // Bytes anlegen die geschrieben werden sollen
4

5
    COPY_OF_FLASH_OBR = *(__IO uint32_t*)(0x4002201C);  // inhalt des optionbyte registers holen
6
    FLASH_OBR_MASK = 0xFC0003FF;  // maske damit nur die richtigen bytes verändert werden
7
    COPY_OF_FLASH_OBR &= FLASH_OBR_MASK; // nur die relevanten bytes werden gelöscht
8
    FLASH1 = 0x00;FLASH2 = 0x00;  // testweise sollen die beiden bytes den wert 0 haben
9
    COPY_OF_FLASH_OBR |= ( (uint32_t)(FLASH1<<10) | (uint32_t)(FLASH2<<18) );  // verändern des buffers
10
    *(__IO uint32_t*)(0x4002201C) = COPY_OF_FLASH_OBR;  // zurückschreiben
11
    COPY_OF_FLASH_OBR = *(__IO uint32_t*)(0x4002201C);  //erneutes auslesen des registers

A. K. schrieb:
> Jetzt verstehe ich deine Frage oben. Wenn man einfach mal rumprobiert
> ohne auch nur eine Zeile Doku zu lesen...

Zugegeben, dass das so nicht funktioniert war mir schon klar bevor ich 
es probiert habe. Ich wollte nur ein beispiel geben wie ich es mir vom 
prinzip her gerne gewünscht hätte. dass ich natürlich nicht einfach so 
auf den flash schreiben kann wusste ich schon.

Okay, ich muss zugeben, ich hab mich auch ein bischen in den APP-Notes 
verlaufen. Also ich lese jetzt nochmal das PM0075

Vielen dank für eure geduld :)
#2450522
Eine Kleinigkeit zur Konvention von C Code: Wer Variablen konsequent 
gross schreibt, der riskiert süffige Kommentare vom Forum, sobald er bei 
etwaigen Fragen mal seinen Code rausrückt.

Üblich ist: Makros gross, Funktionen und Variablen klein oder mixed.

Auch sowas wie
  *(__IO uint32_t*)(0x4002201C)
macht sich an einer einzigen Stelle per #define besser, wenns nicht 
sowieso schon in einem Include des Entwicklungssystems drin steht.
OP #2450530
A. K. schrieb:
> Eine Kleinigkeit zur Konvention von C Code: Wer Variablen konsequent
> gross schreibt, der riskiert süffige Kommentare vom Forum, sobald er bei
> etwaigen Fragen mal seinen Code rausrückt.
>
> Üblich ist: Makros gross, Funktionen und Variablen klein oder mixed.

Klingt vielleicht wie eine billige ausrede, aber ich hab das jetzt nur 
so gemacht dass ich es in meinem code erkenne :)

IchSchreibMeineVariablenNaemlichImmerSo :)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.