[其他ST产品] stm32根据芯片ID计算mac地址

[复制链接]
850|2
 楼主| g36xcv 发表于 2023-7-26 18:14 | 显示全部楼层 |阅读模式
STM32芯片具备eth网口功能,但其出厂时没有配置唯一的MAC地址,而网络初始化时需要用到MAC地址。我们可以通过STM32的12字节的唯一芯片ID进行计算,得到一个大概率唯一的MAC地址来使用。
大家可以修改自己的计算规则,生成自己专属的mac地址,如下代码仅供参考:


  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] 获取mac地址
  3. *
  4. * @param pMacBuf 存储MAC地址buffer的首地址
  5. */
  6. void getmac(uint8_t* pMacBuf)
  7. {
  8.     if(pMacBuf == NULL)
  9.         return;

  10.         uint32_t uiMcuId = 0;
  11.         uint8_t pMcuID[15] = {0};
  12.         int i = 0;
  13.     uint32_t CpuID[3] = {0};
  14. //获取CPU唯一ID
  15. #if 0//STM32F1系列
  16.         CpuID[0] =*(vu32*)(0x1ffff7e8); //按全字(32位)读取
  17.         CpuID[1] =*(vu32*)(0x1ffff7ec);
  18.         CpuID[2] =*(vu32*)(0x1ffff7f0);
  19. #endif
  20.        
  21. #if 1//STM32F4系列
  22.         CpuID[0]=*(uint32_t*)(0x1fff7a10);
  23.         CpuID[1]=*(uint32_t*)(0x1fff7a14);
  24.         CpuID[2]=*(uint32_t*)(0x1fff7a18);
  25. #endif
  26.     printf("MCU UID: %08X-%08X-%08X\r\n",CpuID[0],CpuID[1],CpuID[2]);
  27.     printf("Flash Size: %dK\r\n", *(uint16_t *)(0X1FFF7a22));
  28.        
  29.         //按字节(8位)读取
  30.         pMcuID[0] = (uint8_t)(CpuID[0] & 0x000000FF);
  31.         pMcuID[1] = (uint8_t)((CpuID[0] & 0xFF00) >>8);
  32.         pMcuID[2] = (uint8_t)((CpuID[0] & 0xFF0000) >>16);
  33.         pMcuID[3] = (uint8_t)((CpuID[0] & 0xFF000000) >>24);
  34.        
  35.         pMcuID[4] = (uint8_t)(CpuID[1] & 0xFF);
  36.         pMcuID[5] = (uint8_t)((CpuID[1] & 0xFF00) >>8);
  37.         pMcuID[6] = (uint8_t)((CpuID[1] & 0xFF0000) >>16);
  38.         pMcuID[7] = (uint8_t)((CpuID[1] & 0xFF000000) >>24);
  39.        
  40.         pMcuID[8] = (uint8_t)(CpuID[2] & 0xFF);
  41.         pMcuID[9] = (uint8_t)((CpuID[2] & 0xFF00) >>8);
  42.         pMcuID[10] = (uint8_t)((CpuID[2] & 0xFF0000) >>16);
  43.         pMcuID[11] = (uint8_t)((CpuID[2] & 0xFF000000) >>24);

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

  45.         for(i=0; i<12; i++) //获取McuID[12]
  46.         {
  47.                 pMcuID[12] += pMcuID[i];       
  48.         }
  49.         for(i=0; i<12; i++)        //获取McuID[13]
  50.         {
  51.                 pMcuID[13] ^= pMcuID[i];       
  52.         }

  53.         pMacBuf[0] = (uint8_t)(uiMcuId & 0xF0);
  54.         pMacBuf[1] = (uint8_t)((uiMcuId & 0xFF00) >>8);
  55.         pMacBuf[2] = (uint8_t)((uiMcuId & 0xFF0000) >>16);
  56.         pMacBuf[3] = (uint8_t)((uiMcuId & 0xFF000000) >>24);
  57.         pMacBuf[4] = pMcuID[12];
  58.         pMacBuf[5] = pMcuID[13];
  59.    
  60.     return;
  61. }



yiy 发表于 2023-7-26 20:26 | 显示全部楼层
其实只要在一个局域网里不冲突就行了,广域网无所谓的。
地瓜patch 发表于 2023-7-26 21:27 来自手机 | 显示全部楼层
就是用唯一的数据来计算
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

412

帖子

0

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