Forum: Mikrocontroller und Digitale Elektronik Hardwareversion in Mikrocontroller speichern


von Max (Gast)


Lesenswert?

Hallo zusammen,

ich arbeite an einer Leiterplatte mit einem Mikrocontroller (STM32H743) 
bei dem es voraussichtlich im Laufe der Zeit ein paar Hardwareänderungen 
geben wird. Ich würde jetzt gerne eine Hardwareversionsnummer im 
Mikrocontroller speichern, so dass bei Firmware-Updates die Firmware 
weiß was an welchen Pins hängt etc. Problem ist bei meinem 
Mikrocontroller, dass es anscheinend außer dem Flash keine Möglichkeit 
gibt etwas dauerhaft zu speichern (auch wenn es laut einigen Dokumenten 
2kbyte user option bytes geben sollte). Ich habe über folgende 
Möglichkeiten nachgedacht:

1) Eine Seite des Flashs für die Versionsnummer zu reservieren. Problem 
ist, dass das 128k wertvoller Speicher sind, und ich eventuell sehr bald 
Daten auf einen externen Flash auslagern muss.

2) Momentan ist ein FRAM angeschlossen, auf dem ich die Versionsnummer 
speichern könnte. Das bedeutet dann allerdings, dass dieser immer an den 
jetzigen Pins hängen muss.

3) Kodierung der Versionsnummer durch einen hardware-seitig festen Pegel 
an verschiedenen Pins. Problem ist auch hier, dass das immer die 
gleichen Pins sein müssen. Ich kann momentan schlecht abschätzen wie 
viele Revisionen es eigentlich geben wird.

Ich tendiere ein wenig zur Option 2. Habt ihr da eine starke Präferenz 
bei euren eigenen Projekten? Ich bin leider relativ neu in dem Bereich 
und wäre sehr über ein paar eurer Kommentare dankbar.

von foobar (Gast)


Lesenswert?

> 3) Kodierung der Versionsnummer durch einen hardware-seitig festen Pegel
> an verschiedenen Pins.

Das ist das, was meist gemacht wird.  Teilweise über Pull-Ups/Downs an 
Pins, die im Normalbetrieb auf Output stehen (wird dann im Reset 
eingelesen).  Ggf kanns du auch Widerstandswerte per ADC einlesen 
(braucht weniger Pins).  Gerne werden auch Bestückungsvarianten kodiert.

Im µC selbst ist mMn quatsch - dann muss der ja erstmal für die Platine, 
auf der er eingesetzt wird, geflasht werden und das ist ja genau das, 
was du vermeiden willst.

Externer nicht-flüchtiger Speicher ist ähnlich blöd - erfordert einen 
zusätzlichen Programmierschritt nach der Bestückung, der µC kann den ja 
nicht selbst initialisieren.

von Kevin M. (arduinolover)


Lesenswert?

Wie wäre es mit einem build switch in der Firmware. Für die 
entsprechende Hardwarerevision ein spezifisches Binary zu kompilieren 
sollte ja kein Problem sein. Außerdem spart man so unnötigen Code der 
das Handling zur Laufzeit macht, dass kostet nur unnötig Ressourcen.

von Andreas B. (bitverdreher)


Lesenswert?

Ein 1-wire EEprom dafür vorsehen.
Wenn es klein sein soll: DS2431 in 6pin BGA.

foobar schrieb:
> Externer nicht-flüchtiger Speicher ist ähnlich blöd - erfordert einen
> zusätzlichen Programmierschritt nach der Bestückung, der µC kann den ja
> nicht selbst initialisieren.
Den kann man ja auch vor der Bestückung programmieren.

Irgendwelche Pins für die Kodierung zu reservieren, finde ich recht 
suboptimal im Verhältnis von Pinverbrauch zur Informationsdichte.

Eine Kröte wird der TO wohl schlucken müssen.

von Vincent H. (vinci)


Lesenswert?

Kevin M. schrieb:
> Wie wäre es mit einem build switch in der Firmware. Für die
> entsprechende Hardwarerevision ein spezifisches Binary zu kompilieren
> sollte ja kein Problem sein. Außerdem spart man so unnötigen Code der
> das Handling zur Laufzeit macht, dass kostet nur unnötig Ressourcen.

Das seh ich auch so. Sofern es kein Problem ist größere Container-Files 
für Updates zu nutzen kann man problemlos verschiedene Binaries 
nebeneinander speicher und das richtige anhand einer ID einspielen.

Nachteil ist halt größere Komplexität bei Produktion/Update.

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Vincent H. schrieb:
> und das richtige anhand einer ID einspielen.

Und die Frage geht darum wie und wo man diese ID speichert.

Dass man X unterschiedliche Firmwareversionen in ein "Containerfile" 
(angeberische Bezeichnung für eine popelige ZIP-Datei) packen kann ist 
nun wirklich nicht das Problem.

Wer es hochtrabend haben will, das Ganze ist ein Problem aus dem 
Identitätsmanagement. Wie versehe ich einer Entität mit welchen 
Attributen um ihr für die gewünschte Anwendung eine Identität zu geben.

Wer es praktisch haben will, irgend einen Tod muss man sterben. Seien es 
reservierte Pins, Speicheradressen, Unterprogramm-Adresse etc. Sei es 
eine Datenbank die eine vorhanden ID (STM32 Hardware ID, MAC Adresse, 
etc.) auf die Firmware-Version abbildet. Sei es ein Aufdruck, Aufkleber, 
Markierung, Barcode etc. die ein menschlicher Bediener 
(semi-automatisch) ablesen muss. Sei es ein mechanischer Unterschied 
(z.B. Position, Art des Programmiersteckers). Sei es spezieller 
Speicher, ein zusätzlicher "Management"-Mikrocontroller, ID-Chip, ...

Die ideale, immer passende Lösung gibt es nicht. Eine gute Lösung ist 
eine, die im Gesamtsystem, für die meisten Standardfälle, zu 
vernünftigen Kosten funktioniert.

Dafür muss man das eigene Gesamtsystem verstehen und die eigenen 
Standardfälle kennen. Zum Beispiel auch die vorhandene 
Wartungsorganisation. Wie einfach es ist an das Gerät ranzukommen? Soll 
aus aus der Ferne oder vor Ort neue Firmware eingespielt werden? Wird 
überhaupt neue Firmware im Feld eingespielt? Modul- oder Boardtausch im 
Feld ist eine beliebte Alternative, weil der gemeine IT-Hausmeister für 
Firmwareupdates zu blöd ist). Welchen Grad der Automatisierung muss man 
haben? Folgekosten wenn es schief geht? Usw. usw.

von Vincent H. (vinci)


Lesenswert?

Hannes J. schrieb:
> Vincent H. schrieb:
>> und das richtige anhand einer ID einspielen.
>
> Und die Frage geht darum wie und wo man diese ID speichert.

Wie wärs mit dem Prozessorflash...?

von PittyJ (Gast)


Lesenswert?

Ich verwende immer ein I2C Eeprom. Den I2C Bus brauche ich eh noch für 
andere Sensoren. Da wird dann einfach ein 1Kbit Eeprom für Version und 
Setup aufgespielt.

Das mit dem Flash habe ich mal versucht, aber nach dem Ändern war immer 
ein Hardreset nötig. Ausserdem ist bei dem Prozessor eine Page immer 
gleich 128 Kbytes groß.

von Thomas (Gast)


Lesenswert?

Max schrieb:
> 3) Kodierung der Versionsnummer durch einen hardware-seitig festen Pegel
> an verschiedenen Pins. Problem ist auch hier, dass das immer die
> gleichen Pins sein müssen. Ich kann momentan schlecht abschätzen wie
> viele Revisionen es eigentlich geben wird.

Das ist die einzige Option von deiner Auswahl die das Problem wirklich 
einigermaßen sicher löst.
Du könntest auch deine Supply mit einem Teiler abgreifen und mit Adc 
einlesen, und den Widerstand je nach Hardwareversion ändern.

von Fpgakuechle K. (Gast)


Lesenswert?

Max schrieb:
>  Ich kann momentan schlecht abschätzen wie
> viele Revisionen es eigentlich geben wird.

Muß du auch nicht, das legt das Projectmanagment fest, wann welche neue 
(nicht abwärtskompatible) Hardware-version während der 
Produktlebensdauer releast wird.

4 bits (15 Versionen) reichen völlig, weil so eine Hardwareveränderung 
macht man nicht mehrmals am Tag. In der Regel bündelt man ohnehin mehere 
Änderungen zu einerm 'Musterstand' der dann offiziel übers 
Änderungswesen releast. Und ohne unnötigen Mehraufwand ist nur eine 
geringe Anzahl von Musterständen (auch Modellpflege, oder 
Produktionskostenoptimierte Variante),  realisierbar, bspw. einmal im 
Jahr. Selbst bei einem Millionenseller wie den Commodore Amiga500 
damals, genügte eine einstellige Anzahl von Revisionen: 
https://www.amigawiki.org/doku.php?id=de:models:a500

von Ralf (Gast)


Lesenswert?

> 4 bits (15 Versionen) reichen völlig...
Dem stimme ich zu, das reicht für >=85% der Anwendungen. Und wenn nicht, 
dann investierst du ein bisschen zusätzliches Hühnerfutter (Widerstände) 
und liest trinär ein, damit hast du 81 Versionen auf den vier 
Portpins...

Grüße

von Arne S. (Gast)


Lesenswert?

Bei einem STM32F103 haben wir die 16 HW Revisionen über einen 
Spannungsteiler an einen A/D Wandlereingang gelegt.

von dummschwaetzer (Gast)


Lesenswert?

>(auch wenn es laut einigen Dokumenten
>2kbyte user option bytes geben sollte)
was spricht denn gegen den?
Da könnte es sogar HAL-Funktionen dafür geben.

von Johannes M. (johannesm)


Lesenswert?

Bei einigen Geräten habe ich im Programmcode eine Konfigurationsdatei 
hinterlegt, die anhand der "Unique device ID" die entsprechende 
Konfiguration zuordnen kann. Beim Programmstart wird einfach die ID vom 
STM32 ausgelesen und alles eingestellt. Bei der ersten Inbetriebnahme 
muss man halt die ID auslesen und alles in der Konfig richtig zuordnen.
Wenn man Geräte beim Kunden hat, kann er einfach über einen Bootloader 
Firmwareupdates machen und es wird immer die richtige Einstellung 
geladen.

: Bearbeitet durch User
von Ralf (Gast)


Lesenswert?

> Bei einigen Geräten habe ich im Programmcode eine Konfigurationsdatei
> hinterlegt, die anhand der "Unique device ID" die entsprechende
> Konfiguration zuordnen kann.
Das bedingt aber doch, dass du im Voraus alle infrage kommenden UIDs 
kennst, oder? Für ne Handvoll Geräte kann ich mir das vorstellen, aber 
wie löst du das ab 1k aufwärts?

Grüße

von Bauform B. (bauformb)


Lesenswert?

dummschwaetzer schrieb:
>>(auch wenn es laut einigen Dokumenten
>>2kbyte user option bytes geben sollte)
> was spricht denn gegen den?

das sind alles Einstellungen wie Schreibschutz, ob der Watchdog sofort 
startet, ab welcher Adresse der Coprozessor bootet usw. und schon sind 
2K voll. Man könnte höchstens tricksen, z.B. auf den Schreibschutz 
verzichten und das dann freie Byte benutzen.

Aber was spricht gegen den Spannungsteiler an einem ADC-Eingang? Das 
braucht nur einen Pin für mehr als 15 Versionen (wie viele würdet ihr 
wagen?). Solange man mit sowieso nötigen Widerstandswerten auskommt, 
kostet das praktisch nichts. Solange die Platine richtig bestückt ist, 
passt es ganz von alleine, ohne manuelle Zuordnung und Eingabe.

Ja, der eine Pin muss für alle Zeiten festgelegt sein, man sucht sich 
natürlich einen, auf dem sonst nicht viel drauf ist. Und ja, der 
kleinste H7 hat nur 8 ADC-Eingänge wenn man HS-USB braucht. Opfer müssen 
gebracht werden ;)

Wenn zufällig ein I2C-LED-Treiber auf der Platine ist, kann mit dessen 
/Adress/-Pins fast 100 Versionen unterscheiden.

: Bearbeitet durch User
von Gerald M. (gerald_m17)


Lesenswert?

Wir haben angefangen RFID-Chips mit I2C Schnittstelle mit auf die 
Platine zu packen. Der Bestücker programmiert Datum und Hardwarerevision 
beim Bestücken mit rein. Über die I2c Schnittstelle kann ich die Version 
abfragen und auf Kompatibilität prüfen.

von Peter D. (peda)


Lesenswert?

Ich hab dafür 8 Portpins mit 0-Ohm Widerständen vorgesehen, die MCs 
haben ja heutzutage massig IO-Pins.
Der Vorteil ist, man kann bequem verschiedene Bestückungsvarianten 
pflegen und die Firmware erkennt automatisch, welche Variante die 
Platine hat.
In der Regel hat man auch massig Flash, so daß man alle Varianten in 
einer Firmware pflegen kann.

Die Unterscheidung nur mit einem Speicher hat den Nachteil, daß man von 
außen nicht erkennen kann, welche Variante das ist. Und in der Fertigung 
ist ein zusätzlicher Schritt nötig, diesen Speicher mit der richtigen 
Signatur zu programmieren und es darf dabei kein Fehler passieren. 
Schnell ist mal das falsche Hexfile angeklickt oder die falsche Platine 
aus der Schütte gegriffen.
Ohne die Hardwareerkennung gab es bei der Variantenpflege ständig Ärger.

von Birke E. (baeumekommunizierene)


Lesenswert?

Gerald M. schrieb:
> Wir haben angefangen RFID-Chips mit I2C Schnittstelle mit auf die
> Platine zu packen. Der Bestücker programmiert Datum und Hardwarerevision
> beim Bestücken mit rein. Über die I2c Schnittstelle kann ich die Version
> abfragen und auf Kompatibilität prüfen.

Das klingt jedoch nicht nach Massenproduktion und nicht jedermann seine 
Loesung, doch finde ich sie cool, besonders wenn man das mit einem MES 
verbindet -> optische Lesegeraete entfallen.

> Der Bestücker programmiert Datum und Hardwarerevision
> beim Bestücken mit rein.

War ist das fuer ein Bestuecker, kommen die RFID´s nicht von einem 
Feeder?

Klingt interessant!

: Bearbeitet durch User
von Gerald M. (gerald_m17)


Lesenswert?

Birke E. schrieb:
> Das klingt jedoch nicht nach Massenproduktion und nicht jedermann seine
> Loesung

Das ist tatsächlich genau die Lösung für die Produkte die hunderte bis 
tausende Male im Jahr produziert werden. Für viele ist das nicht 
Massenproduktion, für uns ist das das obere Ende des Verarbeitbaren.

Birke E. schrieb:
> War ist das fuer ein Bestuecker, kommen die RFID´s nicht von einem
> Feeder?

Doch, aber auf dem Band nach dem Löten zum Abkühlen ist ein Schreibgerät 
angebracht. Das ist alles Vollautomatisch.

von martin (Gast)


Lesenswert?

Gerald M. schrieb:
> Über die I2c Schnittstelle kann ich die Version
> abfragen und auf Kompatibilität prüfen.

Eine Nummer einfacher als RFID wäre auch ein I2C-Port Expander mit 
unterschiedlich beschalteten Pull-Ups/Downs. Je nach Anzahl der zu 
erwarteten Revisionen sind problemlos 16 oder 256 Revisionen 
realisierbar mit wenig PCB-Fläche. Auslesen in der Software wäre immer 
gleich.

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.