Forum: Mikrocontroller und Digitale Elektronik unique id STM32f103


von bremseinheit (Gast)


Lesenswert?

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

1
uint32_t a = *((uint32_t*)0x1FFF7A10);
2
  uint32_t b = *((uint32_t*)0x1FFF7A14);
3
  uint32_t c = *((uint32_t*)0x1FFF7A18);
4
  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. (Gast)


Lesenswert?


von bremseinheit (Gast)


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:

Lesenswert?

Hier wird das erklärt:

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

Ab dieser Tabelle im Anhang wird es interessant.

von Stefan F. (Gast)


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.

von Christian K. (the_kirsch)


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
1
#include <stm32f1xx.h>
2
3
uint32_t uuid_31_0 = *((uint32_t *)UID_BASE);
4
uint32_t uuid_63_32 = *((uint32_t *)(UID_BASE + 4U));
5
uint32_t uuid_95_64 = *((uint32_t *)(UID_BASE + 8U));

: Bearbeitet durch User
von bremseinheit (Gast)


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)


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)


Lesenswert?

Sorry wenn ich nochmal Frage

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


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

von Christian K. (the_kirsch)


Lesenswert?

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

von pegel (Gast)


Lesenswert?

bremseinheit schrieb:
> 0x1FFF7A10

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

von bremseinheit (Gast)


Lesenswert?

Ok jetzt habe ich es verstanden.
Danke für die Hilfe

von Stefan F. (Gast)


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:

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)


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?
1
/**
2
  * @brief  Returns first word of the unique device identifier (UID based on 96 bits)
3
  * @retval Device identifier
4
  */
5
uint32_t HAL_GetUIDw0(void)
6
{
7
  return (READ_REG(*((uint32_t *)UID_BASE)));
8
}
9
10
/**
11
  * @brief  Returns second word of the unique device identifier (UID based on 96 bits)
12
  * @retval Device identifier
13
  */
14
uint32_t HAL_GetUIDw1(void)
15
{
16
  return (READ_REG(*((uint32_t *)(UID_BASE + 4U))));
17
}
18
19
/**
20
  * @brief  Returns third word of the unique device identifier (UID based on 96 bits)
21
  * @retval Device identifier
22
  */
23
uint32_t HAL_GetUIDw2(void)
24
{
25
  return (READ_REG(*((uint32_t *)(UID_BASE + 8U))));
26
}

von pegel (Gast)


Lesenswert?

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

von pegel (Gast)


Lesenswert?

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

von Stefan F. (Gast)


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)


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)


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:

Lesenswert?

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

von Bauform B. (bauformb)


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
1
Exact information about valid bits not fixed to 0 for
2
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
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.