STM32 + Nichtflüchtiger Speicher

OP #2450180
Lesenswert?

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
(Firma: EleLa - www.elela.de) #2450225
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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?
(Firma: EleLa - www.elela.de) #2450492
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren