目录
- 一、ID的作用
- 二、ID的说明
- 产品唯一身份标识
- MCU ID code
- JTAG ID
- JEDEC-106 ID
- 三、自定义ID
一、ID的作用
在物联网系统中产品的ID不可或缺,产品组网后就需要一个身份去让网里其它的设备去识别自己;
ID表示的含义可能多种多样,如一个生产批次中的产品编号、mac地址、设备条形码等,可能是设备通信中用于表示自己身份的编号,也可能是产品外壳的一个硬件层面的编号;
ID编码的规则也多种多样,只要在一个系统里彼此都认可的一个编号规则即可,最好能考虑安全性;
stm32f1xx中有几个自身的ID可以用于一些场景,下面做下总结;
二、ID的说明
产品唯一身份标识
【1】位于基地址 0x1FFFF7E8,只读不可修改,每个芯片是唯一的;
【2】一共96bit,一共占12个字节,分四组
0x1FFFF7E8~0x1FFFF7E9 , 0 ~ 15bit为一组, uint16_t id_0 = (uint16_t *)(0x1FFFF7E8);
0x1FFFF7EA~0x1FFFF7EB,16 ~ 31bit为一组, uint16_t id_1 = (uint16_t *)( 0x1FFFF7EA);
0x1FFFF7EC~0x1FFFF7EF,32 ~ 63bit为一组, uint32_t id_2 = (uint32_t *)(0x1FFFF7EC);
0x1FFFF7F0~0x1FFFF7F3,64 ~ 95bit为一组, uint32_t id_3 = (uint32_t *)(0x1FFFF7F0);
实际使用中可以将四组进行一些操作,如分别取hash,结果再取hash等,获得方便存储的、不易重复的32位ID作为一种编码;
MCU ID code
【1】虽然称作MCU ID 但不是每个芯片都有一个不一样的这个ID,确切表示是一种 批次、容量的ID编号;
【2】手册中定义为硅片版本和容量编码;
【3】基地址为0xE0042000, 占用四个字节;
uint32_t mcu_id = (uint32_t *)(0xE0042000);
【4】含义
可以结合寄存器闪存容量寄存器0x1FFFF7E0和小、中、大容量对应存储大小定义可以校验确定mcu id 信息;
【5】mcu id虽然对每个芯片不是唯一的,但是可以判断是不是一类芯片,比如项目中有pin to pin芯片替换但是容量不一样需要在软件上做些适配判断时,可以考虑使用mcu id 的信息;
JTAG ID
【1】ARM Cortex-M3的TAP有一个JTAG ID编码。这个ID编码是ARM默认的,且没有被修改过,只能通过JTAG调试口访问。此编码是0x3BA00477(对应于Cortex-M3 r1p1)
【2】实际软件编程中代码无法使用;
JEDEC-106 ID
【1】ARM 的 Cortex-M3 有 一 个 JEDEC-106 ID 编 码 。 它 位 于 映 射 到 内 部 PPB 总 线 地 址 为0xE00FF000_0xE00FFFFF的4KB ROM表中
【2】获取方式
uint16_t Get_JEDEC_ID(void)
{
if( *( uint8_t *)( 0xE00FFFE8 ) & 0x08 )
{
return (( *( uint8_t *)( 0xE00FFFD0 ) & 0x0F ) << 8 ) |
( ( *( uint8_t *)( 0xE00FFFE4 ) & 0xFF ) >> 3 )
| ( ( *( uint8_t *)( 0xE00FFFE8 ) & 0x07 ) << 5 ) + 1 ;
}
return 0;
}
【3】此id也不是每个芯片唯一的,类似mcu id 能区分一类芯片,实际根据芯片的选型实测验证差异;
三、自定义ID
实际中可以自定义编码将ID存储到EEPROM或者芯片特定的flash地址,在产线生产时进行写入;
参考如下: