Serj78 0 5 августа, 2010 Опубликовано 5 августа, 2010 · Жалоба Хотел найти что-то для идентификации устройства, например индивидуальный номер, зашитый в процессор. ( STM32F103) Посмотрел описание регистра CPUID в NVIC ... по нему , получается, только ревизию установить можно... Возник вопрос- а есть ли у SЕM32F103 индивиальный номер? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 5 августа, 2010 Опубликовано 5 августа, 2010 (изменено) · Жалоба в Reference Manual - 28.2 Unique device ID register (96 bits) The 96-bit unique device identifier provides a reference number which is unique for any device and in any context. Кстати, а что это у вас CPUID делает в контроллере прерываний? :blink: upd: вы похоже смотрите ARMовскую документацию, а нуже STшный RM, тут например http://www.st.com/mcu/devicedocs-STM32F103RE-110.html Изменено 5 августа, 2010 пользователем Flexz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serj78 0 5 августа, 2010 Опубликовано 5 августа, 2010 · Жалоба Спасибо! С первого раза в RM008 не нашел, и привыкши что все остальное написано в DDI0337E (Cortex M3 RM) полез туда, с радостью обнаружил CPUID, и обломался внимательно прочитамши :) Пользуюсь кейлом uVision 4.10 Посмотрев стандартный ST-шный STM32F10x_map.h не увидел там такого регистра вообще :( ! Понятно, что он должен быть разбит на два 16-ти битных и 1 32 битный, но как его указать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 5 августа, 2010 Опубликовано 5 августа, 2010 · Жалоба ммм, а в чем проблема ручками считать? адрес есть, все 96 бит без дырок расположены, особых требований к чтению не предъявляется. Сейчас специально проверил - побайтно считывается нормально. Кстати, 2 регистра по 16 бит и 2 по 32, интересно есть ли в этом некий тайный смысл?) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 1 5 августа, 2010 Опубликовано 5 августа, 2010 · Жалоба Читать можно, к примеру, так: typedef __packed struct { unsigned short b15_0; unsigned short b16_31; unsigned int b32_63; unsigned int b64_95; } UNIQUE_ID; const UNIQUE_ID *id = (UNIQUE_ID*) 0x1FFFF7E8; unsigned int id_l, id_m, id_h; id_l = id->b15_0 | (id->b16_31 << 16); id_m = id->b32_63; id_h = id->b64_95; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serj78 0 6 августа, 2010 Опубликовано 6 августа, 2010 · Жалоба Спасибо, буду пробовать.. никогда не работал с указателями таким образом, это трудное для моего понимания место: const UNIQUE_ID *id = (UNIQUE_ID*) 0x1FFFF7E8; сначала мы объявили структуру, а потом всю ее объявили как константу, и назначили ей место в памяти?... при присваивании выдает много ошибок, вероятно так это делать нельзя или в настройках компилятора дело? похоже указатель на id ему сильно не нравится t-arm.c(138): error: #77-D: this declaration has no storage class or type specifier t-arm.c: id_l = id->b15_0 | (id->b16_31 << 16); t-arm.c: ^ t-arm.c(138): error: #147: declaration is incompatible with "unsigned int id_l" (declared at line 136) t-arm.c: id_l = id->b15_0 | (id->b16_31 << 16); t-arm.c: ^ t-arm.c(138): error: #28: expression must have a constant value t-arm.c: id_l = id->b15_0 | (id->b16_31 << 16); t-arm.c: ^ t-arm.c(139): error: #77-D: this declaration has no storage class or type specifier t-arm.c: id_m = id->b32_63; t-arm.c: ^ t-arm.c(139): error: #147: declaration is incompatible with "unsigned int id_m" (declared at line 136) t-arm.c: id_m = id->b32_63; t-arm.c: ^ t-arm.c(139): error: #28: expression must have a constant value t-arm.c: id_m = id->b32_63; t-arm.c: ^ t-arm.c(140): error: #77-D: this declaration has no storage class or type specifier t-arm.c: id_h = id->b64_95; t-arm.c: ^ t-arm.c(140): error: #147: declaration is incompatible with "unsigned int id_h" (declared at line 136) t-arm.c: id_h = id->b64_95; t-arm.c: ^ t-arm.c(140): error: #28: expression must have a constant value t-arm.c: id_h = id->b64_95; t-arm.c: ^ t-arm.c: t-arm.c: 0 warnings, 10 errors Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 1 6 августа, 2010 Опубликовано 6 августа, 2010 · Жалоба Странно, а Вы в чём компилируете? У меня в Кейле никаких проблем, да и откуда тут могут быть проблемы, обычная запись... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serj78 0 6 августа, 2010 Опубликовано 6 августа, 2010 · Жалоба Странно, а Вы в чём компилируете? У меня в Кейле никаких проблем, да и откуда тут могут быть проблемы, обычная запись... кейл uVision 4.10. Просто скопировал ваш код в рабочий проект, хотел на usart вывести . PS: сейчас попробовал в 3-м кейле (версия 3.85) - все нормально!! (не ругается по крайней мере) буду пробовать на реальном устройстве ... Если не сложно, поясните , пожалуйста что делает такая запись: const UNIQUE_ID *id = (UNIQUE_ID*) 0x1FFFF7E8; , хочется научиться понимать как это работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 1 6 августа, 2010 Опубликовано 6 августа, 2010 · Жалоба кейл uVision 4.10. ... Если не сложно, поясните , пожалуйста что делает такая запись: const UNIQUE_ID *id = (UNIQUE_ID*) 0x1FFFF7E8; , хочется научиться понимать как это работает. У меня Кейл 4.00. Хм, что же надо было напортачить в 4.10, чтобы оно ругаться стало? :) const UNIQUE_ID *id = (UNIQUE_ID*) 0x1FFFF7E8; - это объявление указателя на структуру UNIQUE_ID, данные внутри которой являются константами (мы ведь не можем их изменить). Ну и сразу инициализируем этот указатель нужным адресом, приведя его перед этим (UNIQUE_ID*) к нужному типу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться