0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32芯片UID话题

茶话MCU 来源:ST MCU 信息交流 2020-06-15 10:00 次阅读

绝大多数STM32系列的芯片都在固定的地方放置了长度为96位的唯一身份识别码,简称UID,只有极少数STM32系列芯片内部没有该UID,比方超值型STM32F0x0系列,STM32F100系列。具体到哪颗芯片到底有没有UID,在芯片数据手册的首页都有明确的说明,无需猜测。如下图所以:

芯片所对应的参考手册里,有对该UID存放地址的详细介绍。地址因不同系列或子序列而不同。

关于这个UID常有人有些疑问,有几个问题在这里稍微总结下:

1、有无问题。上面说了绝大部分STM32都内置UID,具体以查看数据手册为准。

2、唯一性问题。该UID的唯一性是靠96位这个整体来保证其唯一性,你若截取部分就不保证了。

3、内容问题。有人对这个UID内容似乎很好奇,这点在STM32参考手册里并无详细描述,但这并不影响使用。【因为STM8有些芯片也有96位UID,那里有较为详细的介绍,涉及芯片WAFER生产加工工程中的一些各种坐标信息、wafer编号信息、产品批号信息等】

4、地址问题。芯片UID的存放地址要到芯片对应的参考手册里去查对。特别要提醒的是,并非所有STM32系列的UID信息存放在某个起始地址开始的连续空间内。

5、怎么用的问题。说实在的,这个就很难说了,反正STM32有这个特性在,肯定没有固定不变的用法。具体怎么用就看你自己了。对于该UID,STM32参考手册给了些大致应用方向的介绍:

简单点说,该UID可以做特定序列号;做FLASH编程的安全密钥;激活安全启动流程。据我所知,曾有人拿这个UID码作为唯一发射码。中间按个做密钥配合加密技术的应用涉及到很专业的内容, ST官方也有不少这方面的培训材料,有兴趣的可以找相关资料进一步了解学习。

相对用的比较多的就是基于该UID设计用户程序的安全启动。其大致原理就是,用户程序第一次运行时将预定的未被改写过FLASH地址写入本芯片UID数据,之后每次启动都会重读UID数据并与特定FLASH地址的内容进行比对,若比对成功则正常运行,否则进入异常处理,不予正常运行程序。一般来讲,编写UID那一步在产品出厂前就完成了。

这里所说的第一次运行,就是指程序运行后,到预定的FLASH地址去读取内容,发现该处是被擦除过且未被改写的数据状态[一般为全1状态],并将UID数据写入相应的FLASH区域,这次运行视为第一次运行。

下面使用STM32L4芯片就上面应用做个简单的代码实现示范,仅供参考。注意,不同STM32芯片在FLASH编程这个地方并不完全一样。

先做些基本的准备工作。

我们根据实际应用程序情况预留出一块地址空间,我在下面示例中将STM32L476RG内部FLASH中间位置抽出1页来存放UID【注:很多STM32系列都具备OTP空间,也可以将UID写在这个区域】。STM32L4的FLASH编程采用双字编程,在给定FLASH编程地址时,注意8字节对齐。到相应的参考手册查找UID的地址及存放情况【即是连续存放还是分散存放】。

准备工作差不多了,就可以尝试组织程序代码了。

程序流程很简单。先判断指定FLASH地址是否为全1,如果是读取当前芯片UID并填写到相应地址;如果不是全1,则读取指定FLASH地址空间内容跟当前芯片UID数据比较,若正确,正常运行程序,若二者不符,则进入异常处理,不正常运行功能代码。

【下面是监测到指定flash地址未被改写过,进入UID内容填充的FLASH编程代码】

【下面是监测到指定flash地址已被改写过,进入比较判断及相应处理的代码】

上面代码是基于STM32L476芯片和STM32L4Cube库而编写的,主要介绍下大致实现过程,简单直观,无须过多解释。

不过,在实际应用过程中,这段功能代码就不要如此直白明了。这里给几点参考建议:

1、代码编写过程中,FLASH地址尽量不要一次性直接给出,最好几经变换后得出;

2、被存放的UID在不破坏唯一性的情况下可以适当做些变换后存放;

3、将这部分代码拆分成几个相互独立而有一定关联的不同函数块来处理。可以考虑将有的功能块放在用户主程序里,有的夹在正常的中断程序里,包括嵌套的中断程序里。

4、用来存放UID的flash地址尽量不要连续,最好在不同功能块访问相应的地址;

5、如果可能,考虑使用两套完全独立的UID改写、比对处理代码。即使用两套FLASH存储区域和比对代码,只有两套都比对成功后才正常运行程序,否则任何一套比对失败都进入保护状态。

因为刚好最近有人谈起这方面的话题,就顺便聊聊上面这些,权作参考。另外,还应该充分利用芯片的读写保护机制以及某些系列已经具有的信息安全保护机制,如PCROP、TrustZone等。还有,我们可以根据自身产品特点设计出一些结合硬件线路、机械组装的特定自检流程,让盗版者在生产加工环节遇到麻烦。这些地方都留给每个设计者大量的发挥空间,来保护自己的知识产权。

总之,关于产品的产权保护,应该从产品规划之初就着手考虑应对方案了,从最早的芯片选型开始,最好回避选用市面上使用过于普遍且老旧的芯片系列。相信芯片商在推陈出新的过程中也有安全性这方面的考量,使得芯片在这方面的性能越来完善和强大。

最后顺便提醒下,当我们的程序监测到发生侵权进入保护状态时,目的是保护自己的产权不受侵害。这个过程中我们可能会对代码采取些行动,阻止其正常运行,但注意不要因此而给第三方带来人身伤害。打个比方,假设你设计的产品是马达控制类交通工具,当发现有人盗版时,如果你在代码里只是简单粗暴地对代码进行破坏而完全不顾破坏后的异常代码可能导致什么后果,那就不妙了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    453

    文章

    50360

    浏览量

    421636
  • 身份识别
    +关注

    关注

    1

    文章

    40

    浏览量

    12633
  • STM32芯片
    +关注

    关注

    0

    文章

    38

    浏览量

    4365

原文标题:STM32芯片UID话题

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    UID加密安全启动原理分析

    本文导读 ZDP14x0系列芯片是内置开源GUI引擎的图像显示专用驱动芯片,在实际产品开发中需要加密保护,防止应用程序被读取和盗用,本文将介绍如何实现UID加密安全启动。 UID加密安
    的头像 发表于 11-11 11:49 274次阅读
    <b class='flag-5'>UID</b>加密安全启动原理分析

    如何读取多张卡的UID,有偿

    应用场景是在一摞卡片,需要通过循环读取卡片的UID,来获取所有卡片的UID。但是普通MFRC522模组的磁场强度无法给多张卡供电,想咨询如何给一摞卡供电,当然模组可以移动,或许只需要给部分卡片供电即可。红包200元,财力有限,请见谅。
    发表于 08-17 21:50

    STM32复位电路用复位芯片和阻容复位电路区别

    STM32是一款广泛使用的微控制器,其复位电路设计对于系统的稳定性和可靠性至关重要。本文将详细介绍STM32复位电路中使用复位芯片和阻容复位电路的区别,以及各自的优缺点和应用场景。 引言 在微控制器
    的头像 发表于 08-06 10:26 1121次阅读

    STM32F10xx芯片资料

    电子发烧友网站提供《STM32F10xx芯片资料.pdf》资料免费下载
    发表于 07-08 14:56 1次下载

    NVS分区生成器用于量产UID应该怎么使用好呢?

    我把UID写入.csv文件,再生成.bin文件。但是我每次还是得改.csv文件,然后再生成.bin文件,自我感觉不方便,请教下有什么工具或者有什么思路和方法吗?
    发表于 06-26 07:02

    求助,用户可以获取ESP32芯片UID吗?

    如题,想要使用芯片本身的UID作为设备的唯一标识码,但是没找到UID的获取方法。 请问用户是否可以获取芯片UID呢?如果可以的话,应该如何
    发表于 06-20 07:19

    怎样从STM32F407的UID码中提取生产年份和月份信息?

    请问怎样从STM32F407的UID码中提取生产年份和月份信息?
    发表于 06-03 06:28

    请问STM8L051是不是没有UID的?

    STM8L051是不是没有UID的?在手册找了很久也没有见到,希望知道的大神说一说。
    发表于 05-15 06:50

    如何通过STVP programming toolkit读取芯片UID

    问题一、无法通过GetProtectionList获取芯片的保护级别列表 在调用GetProtectionList的时,发现无法获取芯片(STM32F405RG为例子)支持的保护级别列表,通过调用
    发表于 05-11 08:11

    同样的代码,stm32l072cbt6改用stm32l053c8t6就出出现了HardFault_Handler的原因?

    我之前使用的是stm32l072cbt6芯片,现在改用stm32l053c8t6,结果在调取芯片uid时出现了同样的代码,却产生了错误
    发表于 03-11 08:31

    ARM系列STM32F103芯片的解密方法

    本文介绍ARM系列STM32F103芯片的解密方法,其内核是Cortex-M3,内存从16K-512K都有。
    发表于 02-28 11:20 1559次阅读

    m451系列mcu的96位UID怎么读取?

    m451系列mcu的96位UID怎么读取
    发表于 01-16 07:35

    M451的96位UID具体的意思是什么?

    M451的96位UID具体的意思是什么?
    发表于 01-16 06:53

    话题通信接口的定义和运行效果

    话题接口的定义与使用 话题通信接口的定义也是类似的,继续从之前的机器视觉案例中来衍生,我们想把服务换成话题,周期发布目标识别的位置,不管有没有人需要。 运行效果 现在我们会运行三个节点: 第一个节点
    的头像 发表于 12-01 15:32 418次阅读
    <b class='flag-5'>话题</b>通信接口的定义和运行效果

    神秘又有趣的话题——芯片引脚顺序!

    亲爱的“芯”朋友,你们有没有发现,每颗芯片上都布满了密密麻麻的引脚,犹如一座迷宫,让人无从下手?今天,我们一起来揭开这个迷宫的神秘面纱,探索一下这个既神秘又有趣的话题——芯片引脚顺序!芯片
    的头像 发表于 11-28 09:33 1.4w次阅读
    神秘又有趣的<b class='flag-5'>话题</b>——<b class='flag-5'>芯片</b>引脚顺序!