STM32笔记之特殊地址(识芯)

本文详细介绍了STM32微控制器中的唯一设备ID和器件ID的用途、获取方法及其在不同型号芯片上的地址。唯一ID用于序列号、安全加密和自举过程,不可更改。器件ID则包含在DBGMCU_IDCODE寄存器中,可用于芯片识别和版本辨别。通过STM32的ID,可以有效检测芯片真伪和防止容量欺诈。

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

写在前面:

本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。



一、唯一 ID号

在 STM32的全系列 MCU中均有一个 96位的唯一设备标识符。在 ST的相关资料中,对其功能的描述有 3各方面:

  • 用作序列号(例如 USB 字符串序列号或其它终端应用程序)
  • 在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时用作安全密钥以提高 Flash 中代码的安全性
  • 激活安全自举过程等

96 位的唯一设备标识符提供了一个对于任何设备和任何上下文都唯一的参考号码。用户永远不能改变这些位。

96 位的唯一设备标识符也可以以单字节/半字/字等不同方式读取,然后使用自定义算法连接起来。

对于不同型号的 STM32芯片来讲,其唯一设备 ID 寄存器(96 位)的地址是不一样的:

在这里插入图片描述

例如,STM32F4系列的:

在这里插入图片描述

当我们在应用中时,只需要用下面的程序读取出来就好了:

typedef struct
{
    uint32_t id[3];
} ChipID;

typedef enum {
  STM32F0 = 0x1FFFF7AC,
  STM32F1 = 0x1FFFF7E8,
  STM32F2 = 0x1FFF7A10,
  STM32F3 = 0x1FFFF7AC,
  STM32F4 = 0x1FFF7A10,
  STM32F7 = 0x1FF0F420,
  STM32L0 = 0x1FF80050,
  STM32L1 = 0x1FF80050,
  STM32L4 = 0x1FFF7590,
  STM32H7 = 0x1FF0F420,
}MCUTypedef;

ChipID Get_ChipID(MCUTypedef MCU)
{
    ChipID chipid = {0};

    chipid.id[0] = *(__I uint32_t *)(MCU + 0x00);
    chipid.id[1] = *(__I uint32_t *)(MCU + 0x04);
    chipid.id[2] = *(__I uint32_t *)(MCU + 0x08);

//    DEBUG_PRINTF("ID Code:0x%08X\r\n", chipid.id[0]);
//    DEBUG_PRINTF("ID Code:0x%08X\r\n", chipid.id[1]);
//    DEBUG_PRINTF("ID Code:0x%08X\r\n", chipid.id[2]);

    return chipid;
}

至于后期怎么利用这个 ID,采取怎样的办法加密就看个人了。


二、芯片容量

在上图中可以看到,还有一个特殊地址,那就是容量地址。

同样的,对于不同型号的 STM32芯片,其地址也是不一样的,这个可以看上面的图。

当我们用 ST-LINK Utility读取 STM32F1系列的容量信息时,得到下图:

在这里插入图片描述

地址中框选的 “0080” 表示的是十六进制,它的数据存储位数是 16位数据,所以我们用 16bit来显示,接着我们看下它的寄存器描述:

在这里插入图片描述

可以看到,地址所对应的容量对的上芯片的实际容量,而且也跟右上角的 “Flash Size” 给出的 128KBytes对的上。


三、器件 ID号

用 ST-LINK Utility读取芯片信息时,可以看到下图的显示信息:

在这里插入图片描述

  • 第一个 Device:这个好理解,就是芯片类型嘛。
  • 第四个 Flash Size:这个就是上面第二大点所说的读取出来的容量大小。

那么,第二跟第三的这俩个 ID是在哪里读取出来的呢?

这就是要讲的器件 ID号了,注意这个 ID跟上面第一大点所阐述的唯一 ID号不同,上面所说的唯一 ID相当于一个物理介质,是固定不变全球唯一的、伴随它终身的一个烙印;而现在这个器件 ID是可以相同的,属于那种种族标识符。

它存在于 DBGMCU_IDCODE寄存器中,对于不同的 STM32型号,其描述都不一样,例如:

  • STM32F10x:

在这里插入图片描述

  • STM32F4xx:

在这里插入图片描述

在这里,可以看到,即使是同系列的 STM32F4,也会再细分不同的器件 ID。

如此一来,到了这里应该就知道上述的:第二个 Device ID是属于 DBGMCU_IDCODE寄存器里的 DEV_ID[11:0]这个集合里面的;第三个 Revision ID是属于 DBGMCU_IDCODE寄存器里的 REV_ID[15:0]这个集合里面的。

而至于 Revision ID,在对应的勘察手册上,有对该类不同版本的芯片描述:

在这里插入图片描述

在这里插入图片描述


四、其它

扯了这么多,其实想说的是,利用第二、三大点,可以有效的识别 STM32的芯片是不是假芯或者是否以小(容量)充大(容量)的;翻新的谁也救不了,毕竟能用主义。

好家伙,官板还有这般操作?莫非这就是究极版

在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值