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

[复制链接]
 楼主| zero949079783 发表于 2021-10-30 22:44 | 显示全部楼层 |阅读模式
1635604480(1).png 1635604521(1).png
开发环境: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。
  1. uint32_t ID_Addr_Table[]={
  2.       [STM32F0_] = 0x1FFFF7AC,  /*STM32F0唯一ID起始地址*/
  3.                         [STM32F1_] = 0x1FFFF7E8,  /*STM32F1唯一ID起始地址*/
  4.                         [STM32F2_] = 0x1FFF7A10,  /*STM32F2唯一ID起始地址*/
  5.                         [STM32F3_] = 0x1FFFF7AC,  /*STM32F3唯一ID起始地址*/
  6.                         [STM32F4_] = 0x1FFF7A10,  /*STM32F4唯一ID起始地址*/
  7.                         [STM32F7_] = 0x1FF0F420,  /*STM32F7唯一ID起始地址*/
  8.                         [STM32L0_] = 0x1FF80050,  /*STM32L0唯一ID起始地址*/
  9.                         [STM32L1_] = 0x1FF80050,  /*STM32L1唯一ID起始地址*/
  10.                         [STM32L4_] = 0x1FFF7590,  /*STM32L4唯一ID起始地址*/
  11.                         [STM32H7_] = 0x1FF0F420}; /*STM32H7唯一ID起始地址*/

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

  1. #include "STUID.h"

  2. uint32_t ID_Addr_Table[]={
  3.             [STM32F0_] = 0x1FFFF7AC,  /*STM32F0唯一ID起始地址*/
  4.                         [STM32F1_] = 0x1FFFF7E8,  /*STM32F1唯一ID起始地址*/
  5.                         [STM32F2_] = 0x1FFF7A10,  /*STM32F2唯一ID起始地址*/
  6.                         [STM32F3_] = 0x1FFFF7AC,  /*STM32F3唯一ID起始地址*/
  7.                         [STM32F4_] = 0x1FFF7A10,  /*STM32F4唯一ID起始地址*/
  8.                         [STM32F7_] = 0x1FF0F420,  /*STM32F7唯一ID起始地址*/
  9.                         [STM32L0_] = 0x1FF80050,  /*STM32L0唯一ID起始地址*/
  10.                         [STM32L1_] = 0x1FF80050,  /*STM32L1唯一ID起始地址*/
  11.                         [STM32L4_] = 0x1FFF7590,  /*STM32L4唯一ID起始地址*/
  12.                         [STM32H7_] = 0x1FF0F420}; /*STM32H7唯一ID起始地址*/

  13. void Get_ChipID2(void)
  14. {
  15.     uint32_t id[3] = {0}; //保存唯一96位的ID
  16.     uint8_t size = sizeof(ID_Addr_Table)/sizeof(ID_Addr_Table[0]);  
  17.     for (uint8_t i = 0; i < size; i++)
  18.     {
  19.         if(ID_Addr_Table[i] == UID_BASE)
  20.         {
  21.             
  22.                 id[0] = *(uint32_t*)(ID_Addr_Table[i]);
  23.                 id[1] = *(uint32_t*)(ID_Addr_Table[i]+4);
  24.                 id[2] = *(uint32_t*)(ID_Addr_Table[i]+8);
  25.                 printf("\r\n芯片的唯一ID为: %#lx -%#lx-%#lx\r\n",id[0],id[1],id[2]);
  26.         }

  27.     }
  28.    
  29. }


  30. void getSTM32SeriesID(void)
  31. {
  32.     uint32_t UIDw[3];
  33.     uint32_t HalVersion  = HAL_GetHalVersion();
  34.     uint32_t REVID       = HAL_GetREVID();
  35.     uint32_t DEVID       = HAL_GetDEVID();
  36.     UIDw[0]              = HAL_GetUIDw0();
  37.     UIDw[1]              = HAL_GetUIDw1();
  38.     UIDw[2]              = HAL_GetUIDw2();
  39.         printf("\r\n芯片的HAL库版本号为: %lu\r\n",HalVersion);
  40.         printf("\r\n芯片修订标识符为: %lu\r\n",REVID);
  41.         printf("\r\n芯片标识符为: %lu\r\n",DEVID);
  42.         printf("\r\n芯片的唯一ID为: %#lx-%#lx-%#lx\r\n",UIDw[0],UIDw[1],UIDw[2]);

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


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

  46. // void Sysid_Read(void)
  47. // {
  48. //         static uint8_t id[12];
  49.          
  50. //         for(uint8_t i=0;i<12;i++)
  51. //         {
  52.                  
  53. //                  id[i] = *(uint8_t*)(STM32F1_UID +i);
  54.                                  
  55. //                  printf("%#X,",id[i]);
  56. //         }
  57. //     printf("\n");
  58. // }



您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

91

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

33

主题

91

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部