TT#5 Unique ID, czyli podpis elektroniczny w STM32

Przy masowej produkcji urządzeń zdarzają się sytuacje, że potrzebujemy zidentyfikować poszczególne egzemplarze produktu. Możemy stworzyć własny system nadawania numerów seryjnych, ale wymaga to konfiguracji każdego urządzenia i nadania mu niepowtarzalnego oznaczenia. Dodatkowo, jeżeli chcemy mieć do dyspozycji ten numer z poziomu aplikacji, musimy go jakoś przechowywać. Stwarza to wiele problemów i dodatkowych wyzwań. Możemy je jednak ominąć poprzez wykorzystanie podpisu elektronicznego zakodowanego w STM32.

Materiał jest częścią Tips and Tricks – serii artykułów dotyczących ciekawostek o STM32

czyli przydatnych, choć rzadko opisywanych elementów z ekosystemu STM32.

Podpis elektroniczny STM32 (Device electronic signature) to swojego rodzaju identyfikator, który pozwala odczytać podstawowe cechy układu. Jest przechowywany w obszarze pamięci systemowej Flash i może być odczytany za pomocą interfejsu debugowania lub przez procesor z poziomu kodu programu. Zawiera zaprogramowane fabrycznie dane identyfikacyjne i kalibracyjne, które umożliwiają oprogramowaniu układowemu użytkownika lub innym urządzeniom zewnętrznym automatyczne dopasowanie do charakterystyki mikrokontrolera.

Z czego składa się podpis elektroniczny?

Podstawowym elementem podpisu elektronicznego w STM32 jest numer ID (Unique ID), czyli 96-bitowy rejestr przechowujący unikalny identyfikator mikrokontrolera. Idealnie sprawdza się np. jako numer seryjny urządzenia albo element klucza bezpieczeństwa w przypadku, gdy każdego urządzenia musi mieć indywidualny znacznik. Może być również przechowywany np. w zewnętrznej bazie danych i być stosowany jako klucz główny.

Wchodząc w szczegóły, Unique ID składa się z :

  • numeru wafla krzemu
  • współrzędnych X i Y na waflu krzemu
  • numeru serii produkcyjnej

Taka kombinacja zapewnia unikalność każdego numeru ID. Poza Unique ID, w skład podpisu elektronicznego wchodzą jeszcze dwa elementy: rejestr przechowujący rozmiar pamięci flash oraz rodzaj obudowy.

Rejestr Flash size jest 16-bitowym rejestrem tylko do odczytu. Przechowuje wartość reprezentującą rozmiar pamięci Flash przedstawioną w kB np. wartość 0x080 oznacza 128 kB.

Rejestr Package data przechowuje informację o rodzaju obudowy mikrokontrolera. Dla każdej serii układów STM32 poszczególne wartości mogą oznaczać inny rodzaj obudowy. Przykładowo dla serii STM32L4 rejestr jest 5-bitowy i może przyjmować wartości:

  • 00000 dla LQFP64
  • 00010 dla LQFP100
  • 00011 dla UFBGA132
  • 00100 dla LQFP144, UFBGA144, WLCSP81 lub WLCSP72
  • 10000 dla UFBGA169
  • 10001 dla WLCSP100

Oficjalnie wg dokumentacji ST w skład podpisu elektronicznego wchodzą trzy rejestry przedstawione powyżej. Warto jednak wspomnieć jeszcze o rejestrze debugowym ID Codes, w którym przechowywana jest informacja o identyfikatorze serii mikrokontrolerów oraz rewizji układu. W przypadku STM32L4 rejestr ten ma 32 bity, z czego pierwsze 12 bitów oznacza Device ID:

  • 0x461 dla STM32L49x/L4Ax
  • 0x415 dla STM32L47x/L48x

Natomiast bity od 16 do 31 (16 bitów) oznacza Revision ID:

  • Dla STM32L47x/L48x:
    • 0x1000: Rev 1
    • 0x1001: Rev 2
    • 0x1003: Rev 3
    • 0x1007: Rev 4
  • Dla STM32L49x/L4Ax:
    • 0x1000: Rev A
    • 0x2000: Rev B

Gdzie znajdziemy informację o podpisie elektronicznym i jak go odczytać?

Szczegółowe informacje o podpisie elektronicznym znajdziemy w dokumentacji Reference Manual mikrokontrolera. Umieszczona jest ona pod koniec dokumentu jako rozdział Device electronic signature (Unique ID, Flash size i Package data) oraz Debug support (Device ID i Revision ID). Odczytamy z niej dokładny adres przechowywania poszczególnych elementów podpisu, ich rozmiar oraz informację o tym, co oznaczają poszczególne wartości.

Podpis elektroniczny możemy odczytać z poziomu komputera np. za pomocą ST-Linka lub z poziomu kodu programu.

Do odczytu numeru Unique ID z poziomu komputera wykorzystamy STM32CubeProgrammer. Nie znalazłem w poszczególnych zakładkach możliwości odczytania konkretnie Unique ID, ale możemy to zrobić za pomocą głównej zakładki Memory & File edition. W polu adresu wpisujemy adres rejestru (w moim przypadku dla STM32L476 będzie to 0x1FFF7590), rozmiar 12 bajtów oraz długość danych 32 bity. Otrzymujemy numer Unique ID.

Numer Unique ID możemy odczytać również z poziomu kodu mikrokontrolera.

#define STM32_UNIQUE_ID_ADDRESS		0x1FFF7590

uint32_t unique_ID[3];

unique_ID[0] = *((unsigned long *)STM32_UNIQUE_ID_ADDRESS);
unique_ID[1] = *((unsigned long *)STM32_UNIQUE_ID_ADDRESS + 1);
unique_ID[2] = *((unsigned long *)STM32_UNIQUE_ID_ADDRESS + 2);

Jak możemy zauważyć, odczyt jest analogiczny do uzyskanego wcześniej w STM32CubeProgrammer.

Podpis elektroniczny urządzenia w STM32 daje nam zatem duże możliwości pod względem identyfikacji poszczególnych urządzeń, ale także w zakresie wprowadzania mechanizmów bezpieczeństwa (szyfrowanie). Może być użytecznym narzędziem przy masowej produkcji urządzeń, o którym warto mieć świadomość, ponieważ może nam znacznie ułatwić pracę.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *