当前位置:   article > 正文

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

stm32芯片id读取

每个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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

可根据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];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/309526
推荐阅读
相关标签
  

闽ICP备14008679号