打印
[STM32F1]

VSCODE STM32 裸机之STM32唯一身份标识UID读取方法

[复制链接]
1413|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
开发环境:VSCODE(gcc编译链)+STM32CubeMX(也可以使用HUAWEI-LiteOS-Studio) 。
代码:链接:https://pan.baidu.com/s/1uXfIR0GFQOBZPl1NfQP08w  
提取码:6b0c

每一个STM32微控制器都自带一个96位的唯一ID,也就是Unique Device ID或称为UID,这个唯一ID在出厂时已经设定好,任何情况下都不允许修改。

在开发过程中,可能需要用到这个UID,比如将此唯一标识与软件加解密算法结合使用,提高代码的安全性。

那么这96位的UID怎么读取呢?可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。

这里需要注意的是UID的首地址问题,不同型号的STM32芯片的首地址可能不同。
F0系列的UID起始地址是 0x1FFFF7AC,
F1系列的是0x1FFFF7E8,
F3系列的是0x1FFFF7AC,
F7系列的是0x1FF0F420,
而STM32F207/STM32F40X系列MCU的UID首地址是0x1FFF7A10。
uint32_t ID_Addr_Table[]={
      [STM32F0_] = 0x1FFFF7AC,  /*STM32F0唯一ID起始地址*/
                        [STM32F1_] = 0x1FFFF7E8,  /*STM32F1唯一ID起始地址*/
                        [STM32F2_] = 0x1FFF7A10,  /*STM32F2唯一ID起始地址*/
                        [STM32F3_] = 0x1FFFF7AC,  /*STM32F3唯一ID起始地址*/
                        [STM32F4_] = 0x1FFF7A10,  /*STM32F4唯一ID起始地址*/
                        [STM32F7_] = 0x1FF0F420,  /*STM32F7唯一ID起始地址*/
                        [STM32L0_] = 0x1FF80050,  /*STM32L0唯一ID起始地址*/
                        [STM32L1_] = 0x1FF80050,  /*STM32L1唯一ID起始地址*/
                        [STM32L4_] = 0x1FFF7590,  /*STM32L4唯一ID起始地址*/
                        [STM32H7_] = 0x1FF0F420}; /*STM32H7唯一ID起始地址*/

可以自己从起始地址处读取UID,更为简便的方法是使用库函数中的HAL_GetUID(uint32_t *UID)函数直接读取。

#include "STUID.h"

uint32_t ID_Addr_Table[]={
            [STM32F0_] = 0x1FFFF7AC,  /*STM32F0唯一ID起始地址*/
                        [STM32F1_] = 0x1FFFF7E8,  /*STM32F1唯一ID起始地址*/
                        [STM32F2_] = 0x1FFF7A10,  /*STM32F2唯一ID起始地址*/
                        [STM32F3_] = 0x1FFFF7AC,  /*STM32F3唯一ID起始地址*/
                        [STM32F4_] = 0x1FFF7A10,  /*STM32F4唯一ID起始地址*/
                        [STM32F7_] = 0x1FF0F420,  /*STM32F7唯一ID起始地址*/
                        [STM32L0_] = 0x1FF80050,  /*STM32L0唯一ID起始地址*/
                        [STM32L1_] = 0x1FF80050,  /*STM32L1唯一ID起始地址*/
                        [STM32L4_] = 0x1FFF7590,  /*STM32L4唯一ID起始地址*/
                        [STM32H7_] = 0x1FF0F420}; /*STM32H7唯一ID起始地址*/

void Get_ChipID2(void)
{
    uint32_t id[3] = {0}; //保存唯一96位的ID
    uint8_t size = sizeof(ID_Addr_Table)/sizeof(ID_Addr_Table[0]);  
    for (uint8_t i = 0; i < size; i++)
    {
        if(ID_Addr_Table[i] == UID_BASE)
        {
            
                id[0] = *(uint32_t*)(ID_Addr_Table[i]);
                id[1] = *(uint32_t*)(ID_Addr_Table[i]+4);
                id[2] = *(uint32_t*)(ID_Addr_Table[i]+8);
                printf("\r\n芯片的唯一ID为: %#lx -%#lx-%#lx\r\n",id[0],id[1],id[2]);
        }

    }
   
}


void getSTM32SeriesID(void)
{
    uint32_t UIDw[3];
    uint32_t HalVersion  = HAL_GetHalVersion();
    uint32_t REVID       = HAL_GetREVID();
    uint32_t DEVID       = HAL_GetDEVID();
    UIDw[0]              = HAL_GetUIDw0();
    UIDw[1]              = HAL_GetUIDw1();
    UIDw[2]              = HAL_GetUIDw2();
        printf("\r\n芯片的HAL库版本号为: %lu\r\n",HalVersion);
        printf("\r\n芯片修订标识符为: %lu\r\n",REVID);
        printf("\r\n芯片标识符为: %lu\r\n",DEVID);
        printf("\r\n芯片的唯一ID为: %#lx-%#lx-%#lx\r\n",UIDw[0],UIDw[1],UIDw[2]);

    printf("\r\n芯片flash的容量为: %dK \r\n", STM32_Flsah);
}


// #define STM32F1_UID  0x1ffff7e8 /*STM32F1唯一ID起始地址*/

// void Sysid_Read(void)
// {
//         static uint8_t id[12];
         
//         for(uint8_t i=0;i<12;i++)
//         {
                 
//                  id[i] = *(uint8_t*)(STM32F1_UID +i);
                                 
//                  printf("%#X,",id[i]);
//         }
//     printf("\n");
// }



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

89

帖子

1

粉丝