Перейти к содержанию

Уникальный идентификатор STM32 (UID)

У большинства серий STM32 каждый кристалл при производстве получает 96-битный номер, который нельзя изменить. Его читают как серийный номер устройства, как основу для MAC-адреса или USB serial number и как исходные данные для ключей.

Обновлено Редакция GAW

Уникальный идентификатор (unique device ID, UID) — 96-битный номер, который ST записывает на заводе в микроконтроллеры большинства серий STM32. Не у всех: в CMSIS-заголовках STM32F030 (stm32f030x6.h, stm32f030xc.h) адреса UID_BASE нет. Он хранится в системной области флеш-памяти, доступен только для чтения и, по словам ST, уникален для любого устройства (RM0090, разд. 39.1). Номер читают как процессором, так и отладчиком по SWD или JTAG.

Что внутри

СмещениеБитыСодержание у STM32F4
0x00UID[31:0]координаты X и Y кристалла на пластине
0x04UID[39:32]номер пластины (ASCII)
0x04UID[63:40]номер партии, часть 1 (ASCII)
0x08UID[95:64]номер партии, часть 2 (ASCII)

Состав полей — по RM0090 (разд. 39.1). Рядом в той же области лежит объём флеш-памяти в килобайтах (F_SIZE, у STM32F4 — по адресу 0x1FFF 7A22, разд. 39.2).

Адреса по сериям

СерияUID_BASE
STM32F0 (F042, F072, F091)0x1FFFF7AC
STM32F10x1FFFF7E8
STM32F40x1FFF7A10
STM32F7 (F746, F750, F767)0x1FF0F420
STM32G0, G4, L40x1FFF7590
STM32H7 (H743, H750)0x1FF1E800

Адреса — из CMSIS-заголовков ST для перечисленных моделей. Слова читают как обычную память; порядок байтов в памяти у STM32F4 — little-endian (RM0090, разд. 2.2).

Применение

ST называет три назначения: серийный номер устройства (в том числе строка serial number в дескрипторе USB), основа ключей вместе с программной криптографией и привязка безопасной загрузки к кристаллу. Привязка прошивки к UID — проверка, что код работает только на «своём» кристалле, — защищает слабо, если не включена защита от чтения: без неё прошивку можно прочитать и исправить проверку. Это наш вывод. Обзор семейств — в разделе STM32.

Частые вопросы

Как прочитать UID в программе?

Это три 32-битных слова только для чтения по адресу UID_BASE — у STM32F4 это 0x1FFF 7A10 (RM0090, разд. 39.1). В CMSIS-заголовке серии этот адрес определён как UID_BASE, и слова читают как обычную память: UID_BASE, UID_BASE + 4 и UID_BASE + 8. В HAL есть функции HAL_GetUIDw0…w2.

Можно ли использовать UID как MAC-адрес или серийный номер?

Как серийный номер — да, для этого ST его и предлагает (RM0090, разд. 39.1). MAC-адрес из него получают свёрткой 96 бит в 48 или 24 бита — это наш вывод, и уникальность после свёртки не гарантирована.

Одинаковые ли адреса UID у всех STM32?

Нет, адрес зависит от серии: например, 0x1FFFF7E8 у STM32F1, 0x1FFF7A10 у STM32F4, 0x1FFF7590 у G0, G4 и L4, 0x1FF1E800 у H7 (CMSIS-заголовки ST). Поэтому в переносимом коде берут константу UID_BASE из заголовка серии, а не пишут адрес вручную.

Источники

  1. STMicroelectronics. RM0090 Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439, Rev 21 — гл. 39 — электронная подпись хранится во флеш-памяти, читается по JTAG/SWD или процессором; 39.1 — 96-битный UID уникален для любого устройства, пользователь не может его изменить; применение: серийный номер (например, строка USB serial number), ключи безопасности вместе с криптографией, безопасная загрузка; базовый адрес 0x1FFF 7A10; смещение 0x00 — UID[31:0] координаты X и Y на пластине; 0x04 — UID[39:32] номер пластины (WAF_NUM), UID[63:40] номер партии LOT_NUM[23:0] в ASCII; 0x08 — LOT_NUM[55:24] в ASCII; читать можно байтами, полусловами и словами; 39.2 — объём флеш-памяти F_SIZE по адресу 0x1FFF 7A22 в КБ
  2. STMicroelectronics. CMSIS device headers cmsis-device-f0, -f1, -f4, -f7, -g0, -g4, -l4, -h7 (коммиты из SOURCES.md кэша stm32-flash-sectors) — UID_BASE: 0x1FFFF7AC (stm32f042x6, f072xb, f091xc), 0x1FFFF7E8 (stm32f103x6/xb/xe/xg, f105xc), 0x1FFF7A10 (stm32f401xc, f407xx, f411xe, f429xx, f446xx), 0x1FF0F420 (stm32f746xx, f750xx, f767xx), 0x1FFF7590 (stm32g031/070/071/0b0/0b1, g431/474/491, l432/476/4r5), 0x1FF1E800 (stm32h743xx, h750xx); в stm32f030x6.h и stm32f030xc.h UID_BASE не определён; stm32f4xx_hal.h (HAL v1.8.5) — функции HAL_GetUIDw0, HAL_GetUIDw1, HAL_GetUIDw2

Нашли ошибку?