AT32的序列号获取
UID总共96位,即12个字节,标记为Byte0-Byte11,起始地址为0x1FFEF7E8最后一个字节Byte11为芯片型号,在用户手册上都能查到,已知型号为:
0x02:AT32F403
0x04:AT32F413
0x05:AT32F415
0x07:AT32F403A
0x08:AT32F407
0x09:AT32F421
0x0D:AT32F435
0x0E:AT32F437
0x0F:AT32F425
倒数第3个字节即Byte9的bit共3位表示芯片的版本,取值0-7,对应版本A、B、C...
如果嫌96位作为基序列号太长,可以将96位压缩为32位,按位取值为:,按字节取为:
Byte10的全部位
Byte9的最高位
Byte4的低两位
Byte3的高半字节
Byte2的最低位
Byte1的全部位
Byte0的全部位
AT32读取MCU型号的函数:
const char *AT32_GetMcuSeries(void)
{
const uint8_t *p = (const uint8_t *)UNIQUE_ID_ADDR;
char *model = NULL;
switch(p)
{
case 0x02:
model = "AT32F403";
break;
case 0x04:
model = "AT32F413";
break;
case 0x05:
model = "AT32F415";
break;
case 0x07:
model = "AT32F403A";
break;
case 0x08:
model = "AT32F407";
break;
case 0x09:
model = "AT32F421";
break;
case 0x0D:
model = "AT32F435";
break;
case 0x0E:
model = "AT32F437";
break;
case 0x0F:
model = "AT32F425";
break;
default:
model = "UNKNOWN";
break;
}
return model;
}
AT32读取MCU硬件版本的函数:
char AT32_GetMcuRevision(void)
{
const uint8_t *p = (const uint8_t *)UNIQUE_ID_ADDR;
return 'A' + (((p&0x70))>>4);
}
从96位UID获取32位UID的函数:
uint32_t AT32_GetUID32(void)
{
const uint8_t *p = (const uint8_t *)UNIQUE_ID_ADDR;
return ((uint32_t)p<<24) | ((uint32_t)p<<8) | p
| (((p&0x80)|((p&0x03)<<5)|((p&0xF0)>>3)|(p&0x01))<<16);
}
其它厂家,似乎对96位UID的意义都没有详细文档描述。
是不是不同厂家的芯片的uid都是96位的呢 看来在uid中特定的位还有特定的含义 这个序列号的存储地址都是一样的吧
在给芯片生成这个序列号的时候是随机生成的吗
如果这样定义的话 就有可能有两片的uid是一样的了吧
硬件版本有什么不同的呢 这个怎么进行区别啊
这个整理的好,可以免去查手册 AT32F435芯片 为什么用这个去读取 UID 程序就跑到 HardFault_Handler ?
页:
[1]