stm32根据芯片ID计算mac地址

该博客介绍了如何利用STM32芯片的12字节唯一ID计算生成一个大概率唯一的MAC地址,以供网络初始化时使用。针对STM32F1和STM32F4系列,提供了读取CPU唯一ID的代码,并展示了将这些ID转换为MAC地址的过程。通过计算和位操作,确保了MAC地址的生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32芯片具备eth网口功能,但其出厂时没有配置唯一的MAC地址,而网络初始化时需要用到MAC地址。我们可以通过STM32的12字节的唯一芯片ID进行计算,得到一个大概率唯一的MAC地址来使用。
大家可以修改自己的计算规则,生成自己专属的mac地址,如下代码仅供参考:

/**
 * @brief 获取mac地址
 * 
 * @param pMacBuf 存储MAC地址buffer的首地址
 */
void getmac(uint8_t* pMacBuf)
{
    if(pMacBuf == NULL)
        return;

	uint32_t uiMcuId = 0;
	uint8_t pMcuID[15] = {0};
	int i = 0;
    uint32_t 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]=*(uint32_t*)(0x1fff7a10);
	CpuID[1]=*(uint32_t*)(0x1fff7a14);
	CpuID[2]=*(uint32_t*)(0x1fff7a18);
#endif
    printf("MCU UID: %08X-%08X-%08X\r\n",CpuID[0],CpuID[1],CpuID[2]);
    printf("Flash Size: %dK\r\n", *(uint16_t *)(0X1FFF7a22));
	
	//按字节(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);

	uiMcuId = (CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);

	for(i=0; i<12; i++) //获取McuID[12]
	{
		pMcuID[12] += pMcuID[i];	
	}
	for(i=0; i<12; i++)	//获取McuID[13]
	{
		pMcuID[13] ^= pMcuID[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] = pMcuID[12];
	pMacBuf[5] = pMcuID[13];
    
    return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值