Допустим вы решили сделать "умный дом", изготовили 5 датчиков движения и поместили их во все дверные проёмы в квартире. Все они связываются с некоторым сервером и сообщают о своём состоянии. Как вы будите различать устройства между друг другом?
xxxxxxxxxx
Выход, но не самый элегантный — вам придётся перекомпилировать прошивку для каждого устройства. А что если таких устройств у вас тысяча? А десять тысяч? А что, если вы выпускаете iPhone, тираж которых числится сотней миллионов?
Во всем микроконтроллерах STM32 на этапе производства вшит уникальный идентификатор длиной 96 бит (3 слова). Адрес по которому он заняться можно найти в Reference Manual, в разд. 30.2 Unique device ID register (96 bits). Ниже приведён пример обращения.
xxxxxxxxxx
// mcu.h
void mcu_id_init(void);
uint8_t mcu_id_get_part(uint8_t num);
uint32_t mcu_mem_size(void);
// mcu.c
// example of id: FFAAFFAA23456789ABCDEF01
static uint8_t hex_id[24];
void id_init(void) {
static uint8_t hex[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
};
uint32_t mcu_id[3];
for (uint32_t i = 0; i < 3; i++)
mcu_id[i] = flash_read(ID_ADDRESS + i * sizeof(uint32_t));
for (uint32_t id = 0; id < 3; id++)
for (uint32_t shift = 0; shift < sizeof(uint32_t) * 8; shift += sizeof(uint32_t))
hex_id[ id * 8 + 7 - shift / sizeof(uint32_t) ] =
hex[ ((mcu_id[id] & (0xF << shift)) >> shift) ];
}
/* num = 0 .. 23 */
uint8_t id_get(uint8_t num) {
return num >= 24 ? 0 : hex_id[num];
}
// in kb
uint32_t mcu_mem_size(void) {
return flash_read(MEMORY_SIZE);
}
Кроме того, вы можете считать ревизию микроконтроллера, его модель и узнать сколько у него flash-памяти. Изучите документацию самостоятельно.
Код на github: CMSIS.
Назад | Оглавление | Дальше