STMCU小助手
发布时间:2022-3-19 20:31
|
每一个STM32单片机出厂的时候都有全球唯一的ID,当在数据安全性比较高的地方,需要对每一个接入系统的芯片进行身份验证,那么这个芯片自身的ID号就可以作为它的身份信息。 产品唯一的身份标识非常适合: 用来作为序列号(例如USB字符序列号或者其他的终端应用) 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。 用来激活带安全机制的自举过程 96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。 这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以 半字(16位)或者全字(32位)读取。
不仅可以读取到芯片的ID,还能读出芯片的存储器容量。
芯片型号也同样可以读出来。
下面就通过代码来读取这几个数据。
通过串口打印出芯片的ID 此芯片唯一ID为: 0x66eff51-51578248-87074312 芯片闪存容量大小为: 40 芯片型号为: 0x20036410
然后通过单步调试,直接观察内存中的数据。
然后观察内存中地址0x1FFFF7E0开始的数据
可以看出0x1FFFF7E0开始的16位数据为0x0040换算为10进制数据就是64,说明当前用的芯片的容量是64K。接下来从0x1ffff7e8地址开始的12个字节,也就是96位存储的就是芯片的ID。内存中ID号存储为低位在前高位在后,而打印出来的数据是高位在前,低位在后。打印的前32位是 06 6e ff 51对应在内存中的存储顺序51应该是第一位,06是最后一位。 最后在0xE0042000地址查看单片机的型号。
低12位数据是 0x410,也就是设备编码为0x410,通过对比文档可以看出这个是中容量产品。高16位是0x2003,对比文档可以看出,这个是中容量产品,版本号为Y。 由于这些ID号都存储在指定的内存地址中,而系统没有提供专用的读取这些ID号的函数,所以读取数据的时候,只能通过指针的方式去读取,首先将数据加一级指针转换为地址,然后加二级指针,表示读取当前地址中存储的内容。这种操作方法在库函数的头文件中使用的比较多。比如在stm32f10x.h中就可以看到对GPIOA的定义。
将地址值逐个替换后为 #define GPIOA ((GPIO_TypeDef *) 0x4001 0800),相当于在 0x4001 0800 地址处定义了GPIOA的结构体。查阅芯片资料可知,GPIOA的起始地址就是0x4001 0800。
这样操作GPIOA的的时候就和上面读取ID的方法是一样的,相当于直接读写对应地址中的值。 |
微信公众号
手机版