Уникальный идентификатор устройства (и размер вспышки)

Rogerclark
Ср 27 мая 2015 г. 1:02
Ребята,

Этот код может быть полезен кому -то .


Возможно прочитать размер флэш -памяти и более интересно уникальный идентификатор устройства

void setup() { Serial.begin(115200); } void loop() { uint16 *flashSize = (uint16 *) (0x1FFFF7E0); uint16 *idBase0 = (uint16 *) (0x1FFFF7E8); uint16 *idBase1 = (uint16 *) (0x1FFFF7E8+0x02); uint32 *idBase2 = (uint32 *) (0x1FFFF7E8+0x04); uint32 *idBase3 = (uint32 *) (0x1FFFF7E8+0x08); Serial.print("Flash size is "); Serial.print(*flashSize ); Serial.println("k"); Serial.print("Unique ID is "); Serial.print(*(idBase0),HEX); Serial.print(*(idBase1),HEX); Serial.print(*(idBase2),HEX); Serial.println(*(idBase3),HEX); delay(500); }

Кешавадк
Пн 25 июля 2016 г., 7:00 утра
Могу ли я узнать, почему идентификатор устройства начинается с адреса 0x1ffff7e8 и почему он должен быть увеличен 2 за четыре раза. Как 0x1ffff7e8+0x02, 0x1ffff7e8+0x04, 0x1ffff7e8+0x04
0x1ffff7e8+0x08

Rogerclark
Пн 25 июля 2016 г., 7:36 утра
Обычно все зарегистрировано в справочном руководстве STM32F103 RM0008 Страница 1079

(Google для этого)
Уникальный регистр идентификатора устройства (96 бит) Вы, вероятно, могли бы прочитать это как три 32 -битных чтения,. Я не уверен, почему пример кода прочитал первый регистр в двух 16 -битных кусках
Тем не менее, справочное руководство говорит.

Мадиас
Пн 25 июля 2016 г. 12:31
Хм. Мое первое размышление об уникальном идентификаторе - настройка сети NRF24L01, и каждый узел является идентификатором, поэтому вам не нужно думать о разных именах узлов. Я просто надеюсь, что «наш» STM32F01 действительно * уникальные *, а не китайские клоны с тем же идентификатором :)

Ахулл
Пн 25 июля 2016 г. 12:33
Мадиас написал:Хм. Мое первое размышление об уникальном идентификаторе - настройка сети NRF24L01, и каждый узел является идентификатором, поэтому вам не нужно думать о разных именах узлов. Я просто надеюсь, что «наш» STM32F01 действительно * уникальные *, а не китайские клоны с тем же идентификатором :)

Rogerclark
Пн 25 июля 2016 г., 21:43
Энди

Я согласен, эти регистры, вероятно, можно записать, но вам нужно знать, к каким другим регистрам доступ к ним, чтобы сделать их. Скорее всего, они просто являются частным блоком вспышки, которая также может содержать другую информацию, которая недоступна вне MCU.

У MCU должны быть специальные блоки вспышки, чтобы удерживать внутренний загрузчик, хотя я полагаю, что они могут быть частью матрицы; Но если бы я проектировал MCU с собственным внутренним SW, мне было бы очень соблазнить поместить этот код в какую -то личную вспышку.

Конечно, это означало бы, что каждый чип должен быть прошит, но я предполагаю, что каждый чип должен иметь свой идентификатор, если только у него не есть код магии, который первым запускает, который вызывает данные об окружающей среде для генерации идентификатора - и это звучит чревато проблемами, если только устройство Содержит выделенный генератор случайных чисел на основе шумного резистора и т. Д

ZMEMW16
Пн 25 июля 2016 г., 21:52
Не могли бы вы просто сделать это на уровне пластины?
Если они могут генерировать запрограммированный EPROM/EFUSE, то серийный номер не может быть проблемой.

SRP

Ахулл
Пн 25 июля 2016 г., 22:01
Уникальный идентификатор, вероятно, запрограммирован на этапе тестирования. В конце концов, все остальные элементы системы нуждаются в тестировании (ОЗУ, вспышка, периферийные устройства и т. Д.) поэтому дополнительная процедура для установки серийного числа не будет существенно повлиять на время тестирования.

Rogerclark
Пн 25 июля 2016 г., 11:02 вечера
Ахулл написал:Уникальный идентификатор, вероятно, запрограммирован на этапе тестирования. В конце концов, все остальные элементы системы нуждаются в тестировании (ОЗУ, вспышка, периферийные устройства и т. Д.) поэтому дополнительная процедура для установки серийного числа не будет существенно повлиять на время тестирования.

Ахулл
Вт 26 июля 2016 г., 7:09
Rogerclark написал:Ахулл написал:Уникальный идентификатор, вероятно, запрограммирован на этапе тестирования. В конце концов, все остальные элементы системы нуждаются в тестировании (ОЗУ, вспышка, периферийные устройства и т. Д.) поэтому дополнительная процедура для установки серийного числа не будет существенно повлиять на время тестирования.

Саймонф
Вт 26 июля 2016 г. 16:52
Мадиас написал:Хм. Мое первое размышление об уникальном идентификаторе - настройка сети NRF24L01, и каждый узел является идентификатором, поэтому вам не нужно думать о разных именах узлов. Я просто надеюсь, что «наш» STM32F01 действительно * уникальные *, а не китайские клоны с тем же идентификатором :)

Александрос
Сб, 07 октября 2017 г., 21:26
Можно ли изменить уникальный идентификатор устройства программно? Я имею в виду замененную оборотную

Martinayotte
Солнце 8 октября 2017 г. 14:30
Неа !

Александрос
Солнце 8 октября 2017 г. 22:10
Большой!

victor_pv
Солнце 8 октября 2017 г. 11:43
Если я помню прямо, есть несколько писать один раз, так что вы можете запрограммировать свой собственный идентификатор.
Не могу вспомнить это наверняка.

Дэнниф
Пн, 09 октября 2017 г. 11:58 утра
Я использую макрос, чтобы сделать все это:
#define U_ID ((const unsigned short *) 0x1FFFF7E8) //U_ID95..0, referenced via U_ID[0], ..., U_ID[5]

Александрос
Сб 14 октября 2017 г. 11:02
Привет, добрый день, чтобы все

Я хотел бы кое -что спросить о FlashSize STM32F103CB
На основании демонстрационного кода Roger, предоставленного в первом сообщении, я получил размер 64K Flash

Теперь смешная часть.
(Я установил вариант Arduino IDE: STM43F103CB 64K, как я должен)

У меня есть эскиз, в котором используется 97% размера вспышки. , Я натолкнул немного дополнительного нездового кода, чтобы добраться до максимального размера, поэтому я получил это красивое MSG
область «ПЗУ» переполнена 5604 байтами

Поэтому я изменил вариант Arduino IDE: STM32F103CB с 64к на 128 тыс., И я сделал это
И это сработало. : шок: : шок: : o

Я также проверяю его с очень большим массивом со значениями, которые проверяли один за другим в цикле и вернули мне правильные результаты..


Вопрос в том, является ли это нормальным дежавиором? Чип включает в себя 128K Flash ?? И почему я получил 64K от демо -кода?

Дэнниф
Сб 14 октября 2017 г. 13:42
Это обсуждалось в N -й степени. Многие из этих чипов имеют больше вспышки, больше eEPROM, больше функций, чем указанные в таблице данных и в регистрах на устройстве.

Это нормально, поскольку они широко распространены. Это не нормально в том смысле, что они не соответствуют таблицу данных.

victor_pv
Сб 14 октября 2017 г., 19:03
На самом деле, если MCU «STM32F103CB», как вы написали, это должно иметь 128 КБ в соответствии с спецификациями.
STM32F103C8 (примечание - это число 8, а не верхний чехол B), как предполагается, имеет только 64 КБ.

Так что, если у вас есть CB с 128 КБ, вы точно находитесь в спецификациях.
Если у вас C8 с 128 КБ, то, как указано Дэнниф.

Алоис
Чт 29 марта 2018 г., 17:40
[Кешавадк - Пн 25 июля 2016 г., 7:00 утра] - Могу ли я узнать, почему идентификатор устройства начинается с адреса 0x1ffff7e8 и почему он должен быть увеличен 2 за четыре раза. Как 0x1ffff7e8+0x02, 0x1ffff7e8+0x04, 0x1ffff7e8+0x04
0x1ffff7e8+0x08
Я сравнил серийный номер клона ST-Link на основе STM32F103C8T6 и уникального идентификатора.
Уникальный идентификатор-FF4966E5549896667164724, а серийный номер ST-Link-49ff6e066689495524471667.
Это такое же число, но в другом формате.
void setup() { // put your setup code here, to run once: Serial.begin(115200); } void PrintHex8(uint8_t data) // prints 8-bit data in hex with leading zeroes { if (data < 0x10) { Serial.print("0"); } Serial.print(data, HEX); } void loop() { // put your main code here, to run repeatedly: uint16 *flashSize = (uint16 *) (0x1FFFF7E0); uint16 *idBase0 = (uint16 *) (0x1FFFF7E8); uint16 *idBase1 = (uint16 *) (0x1FFFF7E8 + 0x02); uint32 *idBase2 = (uint32 *) (0x1FFFF7E8 + 0x04); uint32 *idBase3 = (uint32 *) (0x1FFFF7E8 + 0x08); Serial.print("Flash size is "); Serial.print(*flashSize ); Serial.println("k"); Serial.print("Unique ID is "); Serial.print(*(idBase0), HEX); Serial.print(*(idBase1), HEX); Serial.print(*(idBase2), HEX); Serial.println(*(idBase3), HEX); Serial.print("Device ID is "); byte* bytes = (byte*) idBase0; for (int i = 0; i < 12; i++) { PrintHex8(bytes[i]); } Serial.print(" -> "); for (int i = 0; i < 11; i++) { PrintHex8(bytes[i]); Serial.print("-"); } PrintHex8(bytes[11]); Serial.println(); Serial.println(); delay(5000); }

Zoomx
Пт 30 марта 2018 г., 17:34
Кажется, что каждая пара байтов заменяется.

victor_pv
Пт 30 марта 2018 г., 22:32
Могу поспорить, что один из них читается Byte Byte, а другой - как uint16_t и uint32_t, так что из -за эндосии первые две пары поменяются, а затем следующие две группы или четыре заменяются.
И обмениваться байтами, вы можете использовать инструкцию Arm Rev. Теперь я не знал, что есть встроенный для оборота, но просто проверил, есть ли встроенный, и, очевидно, есть: есть:

Serial.print("Unique ID is "); Serial.print(__builtin_bswap16(*(idBase0)), HEX); Serial.print(__builtin_bswap16(*(idBase1)), HEX); Serial.print(__builtin_bswap32(*(idBase2)), HEX); Serial.println(__builtin_bswap32(*(idBase3)), HEX);

Efftek
Сб 25 августа 2018 г., 17:05
я’M Желаю нескольким модулям, подключенным к моему ПК через Ethernet. Хотя я выиграл’это использую MAC -адрес, мне все еще нужно создать один. Могу ли я использовать 48 байтов из этого идентификационного номера в качестве MAC -адреса, а не изобретать их? Я знаю я’D все еще должен назначать отдельные IP -адреса.

Ура, Стив.

Моду
Четверг 30 августа 2018 г., 11:01
Да, особенно если вы ставите идентификатор в последовательном виде, который выводит ваше необходимое количество цифр для Mac.

Efftek
Сб 01 сентября 2018 г., 20:21
Я обнаружил, что могу использовать идентификационный номер в качестве Mac, при условии, что я установил первый байт на что -то вроде 0xea. Если я этого не сделаю, то это не работает.

Это мой код #include #include byte *id5 = (byte *) (0x1FFFF7EC); byte *id4 = (byte *) (0x1FFFF7EC+0x01); byte *id3 = (byte *) (0x1FFFF7EC+0x02); byte *id2 = (byte *) (0x1FFFF7EC+0x03); byte *id1 = (byte *) (0x1FFFF7EC+0x04); byte mac[] = { 0xEA, *id1, *id2, *id3, *id4, *id5 }; unsigned int localPort = 5000; EthernetServer server(localPort); SPIClass mSpi(2); //USING SPI2 PB12-PB15 void setup() { Serial.begin(115200); delay(1000); Ethernet.init(mSpi, PB12); Ethernet.begin(mac); Serial.print("IP Address assigned "); Serial.println(Ethernet.localIP()); Serial.print("MAC assigned "); for(int i=0; i<5; i++) { Serial.print(mac[i], HEX); Serial.print("-"); } Serial.println(mac[5], HEX); server.begin(); }

Недостаток STM32F103 до 48 МГц

Быстрое битуполовое GPIO/SRAM Access

Измерение задержки прерывания