Идентификаторы в STM32F0xx

Преамбула

Пару дней назад я устанавливал на комп тулчейн для ARM-ов. Установил пакет компилятора и утилит gcc-arm-none-eabi и пакет st-link для программатора. Всё обыденно и традиционно, описывать процесс не интересно.

После установки, естественно, понадобилось проверить — а всё ли правильно встало? Компилятор проверить проще всего — просто запустить его с опцией —version.

Проверить st-link немного сложнее. Это не просто программа, которая работает сама по себе и которую можно просто запустить. И если запуск состоялся, то можно считать, что всё работает. Нет! st-link — программа, которая работает с внешним железом. Поэтому нужно проверять ещё способность работы с железом.

Присоединить-то программатор st-link к микроконтроллеру и подключить эту сцепку к компу — мало. Нужно убедиться, что микроконтроллер «видится» и с ним можно работать. Короче, желательно что-нибудь из микроконтроллера считать.

 

Амбула

В микроконтроллерах STM32 есть регистры, которые «только для чтения». Вот их-то и мы сейчас рассмотрим более внимательно.

Поскольку у меня в руках STM32F030, то будем мучить его.

Во первых, STM32F0xx отличаются от STM32F1xx не только по ядру, но и по периферии. И моё мнение такое, что семейство F0xx будет по-навороченнее семейства F1xx, не смотря на то, что первый — это Cortex-M0, а второй — Cortex-M3.

У STM32F0xx в системной памяти (которая ROM, а не flash), имеется несколько регистров, в которых на этапе изготовления кремниевой пластины с чипами заносится идентификационная информация о чипе. В частности записывается не только серийный номер чипа, но и X-Y-расположение его на пластине (на вафле, wafle).

В документации Reference Manual RM0091 на STM32F0xx на старнице 933 эта область незатейливо называется Device Electronic Signature. Область начинается с адреса 0x1FFF F7AC и содержит два регистра.

Первый регистр отвечает за уникальную информацию о чипе и имеет называние Unique device ID register. Регистр находится по смещению +0. Это мощный 96-битный регистр. Он состоит из трех последовательных 32-разрядных слов и (на момент написания этой статьи) занимает в памяти 12 байт, то есть три 32-разрядных слова.

DESПервое 32-разрядное слово, находящееся по смещению +0, содержит XY-координаты чипа на вафле. Данные представлены в формате BCD.

В младшем байте второго слова, которое расположено по смещению +4, содержится номер вафли (WAF_NUMBER) в формате 8-разрядного беззнакового целого.

Оставшиеся три байта, а так же следующее слово по смещению +8 содержит номер лота (LOT_NUMBER), который записан в формате ASCII.

Следующий регистр называется Flash size data register и находится по адресу 0x1FFF F7CC

FLASH_SIZE

Регистр 16-битный. В нём указывается объем flash-памяти, установленной в микроконтрллере, в килобайтах. Так, например, число 0x0010 (десятичное 16) говорит о том, что микроконтроллер имеет 16 кБайт flash-памяти.

Процесс считывания информации из этих регистров и сохранения её в виде файлов удобно автоматизировать с помощью скрипта:

#!/usr/bin/env bash

# Считывание идентификационных констант из STM32F0xx

st-flash read DES_UID 0x1FFFF7AC 0x04
st-flash read DES_WAF_LOT_NUMBERS 0x1FFFF7B0 0x08
st-flash read DES_FLASH_SIZE 0x1FFFF7CC 0x02
st-flash read DBGMCU_IDCODE 0x40015800 0x04

В результате работы скрипта будут созданы четыре файла — DES_UID, DES_WAF_LOT_NUMBERS, DES_FLASH_SIZE и DBGMCU_IDCODE, в которых будет содержаться соответствующая их именам информация о конкретной микросхеме микроконтроллера.

На всякий случай предупрежу, что скрипт работает ТОЛЬКО с семейством STM32F0xx. У других семейств несколько другой состав и расположение расположение регистров.

Наверняка вы заметили, что в скрипте присутствует ещё одна «неопознанная» строка.

В последней строке производится считывание регистра кода микроконтроллера (DBGMCU_IDCODE). Этот 32-битный регистр располагается по адресу 0x4001 5800 и имеет следующий формат:

DBGMCU_IDCODE

В его старших 16 битах записана ревизия микроконтроллера. 16-ричное число 0x1000 соответствует ревизии rev. 1.0. Если тут будет находится 0x2000, то у вас вторая ревизия — rev. 2.0.

Следующие четыре бита всегда равны 0b0110 (то есть это число 6)

Младшие 12 бит содержат код микроконтроллера:

0x440 — STM32F05x
0x442 — STM32F09x
0x444 — STM32F03x
0x445 — STM32F04x
0x448 — STM32F07x

С помощью этого скрипта я опросил пару микроконтроллеров, которые у меня были под руками. Вот, как выглядит информация из первого микроконтроллера:

02 80 36 00 04 57 32 46 31 38 34 20 10 00

вот, из второго:

16 80 12 00 04 57 32 46 31 38 34 20 10 00

Здесь цветом указаны XY-координаты чипа на вафле, номер вафли, номер лота, размер флаш-памяти.

Оба микроконтроллера из одной упаковки, из одной партии. Как видим, они отличаются только YX-расположением чипа на вафле.

Светло голубая строка номера лота в формате ASCII виде выглядит как «W2F184 «. (В конце строки находится пробел.)

Что касается чтения регистра размера флешь-памяти, то из него считывается константа 0x1000 6444, расшифровать которую не составит труда.

Ну, собственно, это всё, что я хотел сказать.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s