每个STM32微控制器都自带一个96位的唯一ID,这个ID在任何情况下都是唯一且不允许修改的,这96位的ID可以以字节(8位)为单位读取,也可以以半字(16位)或全字(32位)读取。不同型号的STM32芯片首地址不同,UID首地址也不同。
- F1系列UID首地址——0x1ffff7e8
- F2和F4系列 ——0x1fff7a10
- F3和F0系列 ——0x1ffff7ac
- F7系列 ——0x1ff0f420
- L0和L1系列 ——0x1ff80050
- L4系列 ——0x1fff7590
- H7系列 ——0x1ff0f420
获取MCU的唯一ID:
/*******************************************************************************
* Function Name : Get_MCU_ID
* Description : 读取MCU的唯一ID
* Input : pMcuID -- ID存放区指针
* Output : McuID
* Return : 全字UID
* Attention : STM32 96位(12字节)的产品唯一身份标识 基地址:0x1FFF F7E8
*******************/
uint32 Get_MCU_ID(uint8_t* pMcuID)
{
uint32 CpuID[3] = {0};
//获取CPU唯一ID
#if 0//STM32F1系列
CpuID[0] =*(vu32*)(0x1ffff7e8); //按全字(32位)读取
CpuID[1] =*(vu32*)(0x1ffff7ec);
CpuID[2] =*(vu32*)(0x1ffff7f0);
#endif
#if 1//STM32F4系列
CpuID[0]=*(vu32*)(0x1fff7a10);
CpuID[1]=*(vu32*)(0x1fff7a14);
CpuID[2]=*(vu32*)(0x1fff7a18);
// /* printf the chipid */
// rt_kprintf("\r\n芯片的唯一ID为: %X-%X-%X\r\n",
// CpuID[0],CpuID[1],CpuID[2]);
// rt_kprintf("\r\n芯片flash的容量为: %dK \r\n", *(rt_uint16_t *)(0X1FFF7a22));
#endif
//按字节(8位)读取
pMcuID[0] = (uint8_t)(CpuID[0] & 0x000000FF);
pMcuID[1] = (uint8_t)((CpuID[0] & 0xFF00) >>8);
pMcuID[2] = (uint8_t)((CpuID[0] & 0xFF0000) >>16);
pMcuID[3] = (uint8_t)((CpuID[0] & 0xFF000000) >>24);
pMcuID[4] = (uint8_t)(CpuID[1] & 0xFF);
pMcuID[5] = (uint8_t)((CpuID[1] & 0xFF00) >>8);
pMcuID[6] = (uint8_t)((CpuID[1] & 0xFF0000) >>16);
pMcuID[7] = (uint8_t)((CpuID[1] & 0xFF000000) >>24);
pMcuID[8] = (uint8_t)(CpuID[2] & 0xFF);
pMcuID[9] = (uint8_t)((CpuID[2] & 0xFF00) >>8);
pMcuID[10] = (uint8_t)((CpuID[2] & 0xFF0000) >>16);
pMcuID[11] = (uint8_t)((CpuID[2] & 0xFF000000) >>24);
return (CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);
}
可根据MCU的唯一ID读取出MCU的MAC地址。
读取MCU的MAC地址:
/***********************************************************************************************
* Function Name : CreateSysMAC
* Description : 读取MCU的MAC地址
* Input : None
* Output : MAC
* Return : None
***********************************************************************************************/
void CreateSysMAC(uint8_t Key, uint8_t* pMacBuf)
{
uint32 uiMcuId = 0;
uint8_t McuID[15] = {0};
int i = 0;
uiMcuId = Get_MCU_ID(McuID);
for(i=0; i<12; i++) //获取McuID[12]
{
McuID[12] += McuID[i];
}
for(i=0; i<12; i++) //获取McuID[13]
{
McuID[13] ^= McuID[i];
}
pMacBuf[0] = (uint8_t)(uiMcuId & 0xF0);
pMacBuf[1] = (uint8_t)((uiMcuId & 0xFF00) >>8);
pMacBuf[2] = (uint8_t)((uiMcuId & 0xFF0000) >>16);
pMacBuf[3] = (uint8_t)((uiMcuId & 0xFF000000) >>24);
pMacBuf[4] = McuID[12];
pMacBuf[5] = McuID[13];
}