读取STM32芯片的唯一ID和MAC地址

每个STM32微控制器都自带一个96位的唯一ID,这个ID在任何情况下都是唯一且不允许修改的,这96位的ID可以以字节(8位)为单位读取,也可以以半字(16位)或全字(32位)读取。不同型号的STM32芯片首地址不同,UID首地址也不同。

  1. F1系列UID首地址——0x1ffff7e8
  2. F2和F4系列 ——0x1fff7a10
  3. F3和F0系列 ——0x1ffff7ac
  4. F7系列 ——0x1ff0f420
  5. L0和L1系列 ——0x1ff80050
  6. L4系列 ——0x1fff7590
  7. 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];
}
  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值