Forum: Mikrocontroller und Digitale Elektronik unique id STM32f103


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von bremseinheit (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,
ich wollte einem Stm32F103 seine unique Id entlocken.
Dazu wollte ich  ganz banal dies hier tun.

uint32_t a = *((uint32_t*)0x1FFF7A10);
  uint32_t b = *((uint32_t*)0x1FFF7A14);
  uint32_t c = *((uint32_t*)0x1FFF7A18);
  printf("uniqueid= %lx_%lx_%lx\n", a,b,c);


Leider funktioniert dies nun nicht.
Wo ist mein Denkfehler? Hat jemand dazu Doku von St griffbereit?
Danke

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert

von bremseinheit (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> Siehe
> 
https://stackoverflow.com/questions/29323699/how-to-find-the-device-id-of-a-stm32f103ret

Hmm verstehe ich jetzt nicht ganz.
Warum kommt es in meinen Code zu einen Hard Fault?

von pegel (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier wird das erklärt:

https://wrongbaud.github.io/stm-xbox-jtag/

Ab dieser Tabelle im Anhang wird es interessant.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
bremseinheit schrieb:
> Warum kommt es in meinen Code zu einen Hard Fault?

Vielleicht, weil du alle Register als 32bit liest, aber einige davon 
haben nur 16bit. Oder weil die Adressen falsch sind.

: Bearbeitet durch User
von Christian K. (the_kirsch)


Bewertung
0 lesenswert
nicht lesenswert
Nutze doch die CMSIS Header

https://github.com/STMicroelectronics/STM32CubeF1/tree/master/Drivers/CMSIS/Core/Include
https://github.com/STMicroelectronics/STM32CubeF1/tree/master/Drivers/CMSIS/Device/ST/STM32F1xx/Include
#include <stm32f1xx.h>

uint32_t uuid_31_0 = *((uint32_t *)UID_BASE);
uint32_t uuid_63_32 = *((uint32_t *)(UID_BASE + 4U));
uint32_t uuid_95_64 = *((uint32_t *)(UID_BASE + 8U));

: Bearbeitet durch User
von bremseinheit (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Christian K. schrieb:
> Nutze doch die CMSIS Header
>
> 
https://github.com/STMicroelectronics/STM32CubeF1/tree/master/Drivers/CMSIS/Core/Include
> 
https://github.com/STMicroelectronics/STM32CubeF1/tree/master/Drivers/CMSIS/Device/ST/STM32F1xx/Include
> #include <stm32f1xx.h>
>
> uint32_t uuid_31_0 = *((uint32_t *)UID_BASE_ADDRESS);
> uint32_t uuid_63_32 = *((uint32_t *)(UID_BASE_ADDRESS + 4U));
> uint32_t uuid_95_64 = *((uint32_t *)(UID_BASE_ADDRESS + 8U));

Ich verwende die Hal. Kann ich mit der auch die Unique Id auslesen?
Dein Beispiel kennt UID_BASE_ADDRESS nicht.

Danke für die Hilfe

von Christian K. (the_kirsch)


Bewertung
1 lesenswert
nicht lesenswert
Aus dem HAL Header stm32f1xx_ll_utils.h:
#define UID_BASE_ADDRESS              UID_BASE

Aus dem CMSIS Header stm32f103xb.h:
#define UID_BASE              0x1FFFF7E8UL    /*!< Unique device ID 
register base address */

Du nutzt die falsche Adresse

von bremseinheit (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Sorry wenn ich nochmal Frage

Aber was ist der unterschied zwischen meiner Variante
uint32_t a = *((uint32_t*)0x1FFF7A10);
  uint32_t b = *((uint32_t*)0x1FFF7A14);
  uint32_t c = *((uint32_t*)0x1FFF7A18);
  printf("uniqueid= %lx_%lx_%lx\n", a,b,c);
und dieser Varante


uint32_t uuid_31_0 = *((uint32_t *)UID_BASE);
uint32_t uuid_63_32 = *((uint32_t *)(UID_BASE + 4U));
uint32_t uuid_95_64 = *((uint32_t *)(UID_BASE + 8U));
Ich finde es ist das selbe

von Christian K. (the_kirsch)


Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht wo du deine Adresse her hast, aber für den F103 stimmt 
sie nicht
0x1FFF7A10 != 0x1FFFF7E8UL

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
bremseinheit schrieb:
> 0x1FFF7A10

Ist für F2/F4.
Siehe Tabelle oben 17:24 Uhr.

von bremseinheit (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ok jetzt habe ich es verstanden.
Danke für die Hilfe

von Stefan ⛄ F. (stefanus)


Bewertung
-2 lesenswert
nicht lesenswert
bremseinheit schrieb:
> Ich verwende die Hal. Kann ich mit der auch die Unique Id auslesen?

Braucht man wirklich einen Abstraktions-Layer, um ein paar Zahlen direkt 
aus dem Speicher auszulesen?

von bremseinheit (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal.
Ich habe jetzt mit der richtigen Adresse was gelesen.
Wollte es jetzt mit dem Tool von St "STM32 ST-LINK Utility" prüfen.
Leider kann ich die Adresse nicht anzeigen.
Was mache ich falsch?

von Vincent H. (vinci)


Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> bremseinheit schrieb:
>> Ich verwende die Hal. Kann ich mit der auch die Unique Id auslesen?
>
> Braucht man wirklich einen Abstraktions-Layer, um ein paar Zahlen direkt
> aus dem Speicher auszulesen?

Hast du dir die Funktionen überhaupt angesehn bevor du deinen Beißreflex 
befriedigt hast?
/**
  * @brief  Returns first word of the unique device identifier (UID based on 96 bits)
  * @retval Device identifier
  */
uint32_t HAL_GetUIDw0(void)
{
  return (READ_REG(*((uint32_t *)UID_BASE)));
}

/**
  * @brief  Returns second word of the unique device identifier (UID based on 96 bits)
  * @retval Device identifier
  */
uint32_t HAL_GetUIDw1(void)
{
  return (READ_REG(*((uint32_t *)(UID_BASE + 4U))));
}

/**
  * @brief  Returns third word of the unique device identifier (UID based on 96 bits)
  * @retval Device identifier
  */
uint32_t HAL_GetUIDw2(void)
{
  return (READ_REG(*((uint32_t *)(UID_BASE + 8U))));
}

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Oben rechts steht, dass es ein F1 ist.
Du versuchst schon wieder an der Adresse des F2/F4 zu lesen!

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Und auch nicht so viel lesen, Size: 0x8 oder 0xc sollten genügen.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
bremseinheit schrieb:
> Wollte es jetzt mit dem Tool von St "STM32 ST-LINK Utility" prüfen.
> Leider kann ich die Adresse nicht anzeigen.
> Was mache ich falsch?

Ich schätze mal, dass dieses Tool nur den Flash Speicher auslesen kann. 
Die ID ist woanders.

von Frank L. (florenzen)


Bewertung
0 lesenswert
nicht lesenswert
Weil es mich interessiert hab ich das gerade mal ausprobiert. Mit dem 
STM32 ST-Link Utility lässt sich einwandfrei auch außerhalb des Flash 
lesen. Bei einem F103 und der Adresse 0x1ffff7e8, Size 0xC kommen drei 
32-Bit Werte. Das schaut doch vielversprechend aus.

Gruß,
f

von bremseinheit (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Frank L. schrieb:
> Weil es mich interessiert hab ich das gerade mal ausprobiert. Mit dem
> STM32 ST-Link Utility lässt sich einwandfrei auch außerhalb des Flash
> lesen. Bei einem F103 und der Adresse 0x1ffff7e8, Size 0xC kommen drei
> 32-Bit Werte. Das schaut doch vielversprechend aus.
>
> Gruß,
> f

Kaum macht man es richtig schon funktionierts

von bremseinheit (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Was mir noch aufgefallen ist verstehe ich das richtig sind effektiv nur 
80 Bit belegt?

von Bauform B. (bauformb)


Bewertung
0 lesenswert
nicht lesenswert
bremseinheit schrieb:
> verstehe ich das richtig sind effektiv nur 80 Bit belegt?

Effektiv im Sinne der Kryptografie sind es noch viel weniger, alleine 56 
Bit sind ASCII-Text. Die 96 Bits enthalten eine Seriennummer, zu mehr 
sind sie nicht zu gebrauchen. Selbst als Seriennummer kann man sie nicht 
direkt verwenden, weil es nur zum Teil ASCII ist. 8 Bit sind binär, 
zweimal 16 Bit sind wahrscheinlich BCD kodiert.

Noch schlimmer: diese Information ist nur der Mittelwert aus mehreren¹ 
Reference Manuals und gerade das RM0008 für deinen F103 trägt nicht 
besonders viel dazu bei. Außerdem ist es Glaubenssache, ob das Schema 
nie geändert wurde. Ich glaube, dass das Prinzip für alle STM32 gilt, 
"nur" die Adressen sind für jeden Chip anders, also evt. auch die 
Reihenfolge der Bytes.

ST hat diverse Folien zu den neuen STM32, aber die sagen auch kaum mehr 
als
Exact information about valid bits not fixed to 0 for
given devices are available up on the request
Die Frage wird auch im ST-Forum ständig gestellt und nicht wirklich 
beantwortet. @clive1 ist eigentlich für gute Antworten bekannt, aber er 
sagt:
>> The unique number is specific to ST, want answers from them
>> you'll need to inquire through your local representative, or FAE.

>> It's not a MAC ID either, they aren't random they are allocated.
>> Burn your OWN number in OTP

>> There was supposedly some relation to the wafer id, and die location.


1) RM0008, RM0351, RM0376, RM0377, RM0392, RM0394, RM0440, RM0444

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.