gygp 发表于 2023-12-28 10:07

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的意义都没有详细文档描述。

tpgf 发表于 2024-2-2 08:17

是不是不同厂家的芯片的uid都是96位的呢

zljiu 发表于 2024-2-2 09:17

看来在uid中特定的位还有特定的含义

nawu 发表于 2024-2-3 07:31

这个序列号的存储地址都是一样的吧

aoyi 发表于 2024-2-3 08:13

在给芯片生成这个序列号的时候是随机生成的吗

gwsan 发表于 2024-2-3 08:48

如果这样定义的话 就有可能有两片的uid是一样的了吧

tfqi 发表于 2024-2-3 09:22

硬件版本有什么不同的呢 这个怎么进行区别啊

药无尘 发表于 2024-2-6 09:48

这个整理的好,可以免去查手册

h_x_zhong 发表于 2024-12-16 10:07

AT32F435芯片 为什么用这个去读取 UID 程序就跑到 HardFault_Handler   ?
页: [1]
查看完整版本: AT32的序列号获取