开发环境: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");
// }
|