STM32 唯一ID读取方法

7 篇文章 0 订阅
3 篇文章 1 订阅

 

STM32微控制器有一个96位的产品唯一身份标识,在任何情况下都是唯一且不允许修改这个96位的产品唯一身份标识,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。

想要读取唯一ID,就需要知道它的存储地址,在不同系列的MCU中地址是有差别的,我们查询了部分MCU的资料并将其总结如下:

 

 

//读取FlashSize

uint16_t cpuGetFlashSize(void)
{

   return (**(volatile u16*)(0x1FFF7A22));
   // return (*(volatile u32*)(0x1FFF7A20))>>16;
}

//读取ChipID

void cpuidGetId(void)
{
    mcuID[0] = *(volatile u32*)(0x1FFF7A10);
    mcuID[1] = *(volatile u32*)(0x1FFF7A14);
    mcuID[2] = *(volatile u32*)(0x1FFF7A18);
}

 

	  Send_data3 = ((CpuID[0]) >> 24)|0x00;
	  Uart1Write(&Send_data3, 1);
					
		Send_data3 = (CpuID[0] >> 16)|0x00;
	  Uart1Write(&Send_data3, 1);
					
  	Send_data3 = (CpuID[0] >> 8)|0x00;
	  Uart1Write(&Send_data3, 1);
		
	  Send_data3 = (CpuID[0] )|0x00;
	  Uart1Write(&Send_data3, 1);
	
	  Send_data3 = ((CpuID[1]) >> 24)|0x00;
	  Uart1Write(&Send_data3, 1);
					
		Send_data3 = (CpuID[1] >> 16)|0x00;
	  Uart1Write(&Send_data3, 1);
					
  	Send_data3 = (CpuID[1] >> 8)|0x00;
	  Uart1Write(&Send_data3, 1);
		
	  Send_data3 = (CpuID[1] )|0x00;
	  Uart1Write(&Send_data3, 1);
		
		Send_data3 = ((CpuID[2]) >> 24)|0x00;
	  Uart1Write(&Send_data3, 1);
					
		Send_data3 = (CpuID[2] >> 16)|0x00;
	  Uart1Write(&Send_data3, 1);
					
  	Send_data3 = (CpuID[2] >> 8)|0x00;
	  Uart1Write(&Send_data3, 1);
		
	  Send_data3 = (CpuID[2] )|0x00;
	  Uart1Write(&Send_data3, 1);

 

通过串口发送到PC就可以看到了。

串口发送程序;

printf("CPUID IS 0X%X %X %X.\r\n", mcuID[0], mcuID[1], mcuID[2] );   
printf("Flash size is %d KB\r\n",cpuGetFlashSize());

 

 

也可以通过 STLink Utility 查看

 

 

利用STM32的ID编码结合来进行产品加密,产品唯一的身份标识非常适合:
● 用来作为序列号(例如USB字符序列号或者其他的终端应用)
● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。
● 用来激活带安全机制的自举过程
96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。
这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。
基地址:0x1FFF F7E8

每个CPU 出厂的时候都
配置的一个ID,96 位的.这个唯一码可以利用作软件加密.......

static u32 CpuID[3];
static u32 Lock_Code;

void GetLockCode(void)
{
 //获取CPU唯一ID
 CpuID[0]=*(vu32*)(0x1ffff7e8);
 CpuID[1]=*(vu32*)(0x1ffff7ec);
 CpuID[2]=*(vu32*)(0x1ffff7f0);
 //加密算法,很简单的加密算法
 Lock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);
}

 

示例:

 STM32使用 CPUID加密算法,很简单的加密算法
Lock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);
 CpuID[0]CpuID[1]CpuID[2]Lock_CodeCpuID[0]>>1CpuID[0]>>2CpuID[0]>>3
1号CPU0668FF303037564E4302321617A29B6D3347F98C0DD5938604642
2号CPU066AFF303037564E4302444917A39DB43357F98C0DD5938604889
3号CPU066CFF303037564E4302155117A497D53367F98C0DD59386042AA
4号CPU066BFF303037564E4302471617A41E0D335FF98C0DD59386048E2
5号CPU066CFF303037564E4302385117A49C353367F98C0DD593860470A
6号CPU066DFF373235564E431527371826FA14336FF9BC8D5593862A4E6

 

参考:

https://blog.csdn.net/ybhuangfugui/article/details/52597133

https://blog.csdn.net/foxclever/article/details/80294516

https://www.cnblogs.com/zyqgold/p/3378993.html

http://www.openedv.com/posts/list/41972.htm

  • 7
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值