unique id STM32f103

Gast #6274617
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
#6274782
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));
Gast #6274797
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
Gast #6274821
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
Gast #6275114
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?
Angehängte Dateien:
#6275118
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
}
Gast #6275405
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
#6278690
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

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