单片机中uid的使用方法

2023-05-16

uid:unique ID

每个单片机芯片出厂后唯一的ID,不会重复。
uid有很多用途,我们可以用来作为mac地址,可以用来记录唯一的日志,也可以用来防止固件被拷贝使用。
本文所描述的是固件被拷贝使用的问题,即:固件从单片机中通过Jlink回读出来,然后再烧到其他芯片中运行,以atmel的samv71犀利为例。

1、定义uid校验码存放区

在链接文件xxx.ld文件中定义我们要存放的uid校验码在flash中的区域:
uid_encryption

/* Memory Spaces Definitions */
MEMORY
{
  rom (rx)  : ORIGIN = 0x00400000, LENGTH = 0x00020000
  ram (rwx) : ORIGIN = 0x20400000, LENGTH = 0x00060000
}

/* The stack size used by the application. NOTE: you need to adjust according to your application. */
STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : 0x4000;
__ram_end__ = ORIGIN(ram) + LENGTH(ram) - 4;

/* The heapsize used by the application. NOTE: you need to adjust according to your application. */
HEAP_SIZE = DEFINED(HEAP_SIZE) ? HEAP_SIZE : 0x4000;

/* Section Definitions */
SECTIONS
{
    .text :
    {
        . = ALIGN(4);
        _sfixed = .;
        KEEP(*(.vectors .vectors.*))
        *(.text .text.* .gnu.linkonce.t.*)
        *(.glue_7t) *(.glue_7)
        *(.rodata .rodata* .gnu.linkonce.r.*)
        *(.ARM.extab* .gnu.linkonce.armextab.*)

        ......

        KEEP (*crtbegin.o(.dtors))
        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
        KEEP (*(SORT(.dtors.*)))
        KEEP (*crtend.o(.dtors))

		. = ALIGN(4);
        KEEP (*(SORT(.uid_encryption.*)))
        KEEP (*(.uid_encryption))

        . = ALIGN(4);
        _efixed = .;            /* End of text section */
    } > rom
	......

2、定义uid校验码变量

定义32位校验码

__attribute__((used, section(".uid_encryption")))  static uint32_t uid_encry = 0xFFFFFFFF;

3、读取uid并处理后保存

初次运行时,将uid从芯片中读取,经处理后保存到flash中,本文采用的是crc32处理,其他可根据自身情况进行修改:

static void uid_save()
{
	flash_read_unique_id(uid, sizeof(uid)/sizeof(uint32_t));
	//printf("uid: %#x %#x %#x %#x\r\n", uid[0], uid[1], uid[2], uid[3]);
	
	if (uid_encry == 0xFFFFFFFF) {
		uint32_t crc;
		uint32_t addr = &uid_encry;
		
		crc = crc32((uint8_t*)uid, sizeof(uid));
		
		flash_init(FLASH_ACCESS_MODE_128, 6);
		flash_write(addr, &crc, sizeof(crc), 0);
		//printf("save crc:%#x\r\n", crc);
	}
}

4、认证

之后每次运行,都会从芯片中将uid读取出来,经处理之后,与存放在flash中的校验码进行对比验证,若不一致,则代码运行在不同的芯片上,不会继续往下运行正常的程序。

static bool uid_authentication()
{
	uint32_t local_crc;
	uint32_t auth_crc;
	
	local_crc = uid_encry;
	
	auth_crc = crc32((uint8_t*)uid, sizeof(uid));
	if (auth_crc == local_crc) {
		return true;
	}
	else {
		return false;
	}
}

5、效果

如此,代码如果从当前芯片中回读出来,然后烧录到其他芯片上,则会在认证阶段无法通过,就不会运行正常的功能程序。

本文只是简单的uid使用方法,当前还有其他的复杂更高效的使用方法,可学习和探索。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机中uid的使用方法 的相关文章

随机推荐

  • openrave 生成ikfast 第一步遇到的问题

    1 rosrun collada urdf urdf to collada jszn robot description with sensor gazebo xacro jszn robot description with sensor
  • 单视图测量 (2D变换、影消点线、单视图重构)

    写在前面 xff1a 本篇Blog仅作为学习笔记 xff0c 学习内容来自于北邮CV XUEBA团队的三维重建 精简版 xff0c 鲁鹏 课程 回顾经典2D变换 等距变换 旋转矩阵 Rotate Matrix 的性质分析 证明 xff1a
  • libpng warning: iCCP: known incorrect sRGB profile 报错

    libpng warning iCCP known incorrect sRGB profile 警告 xff0c 问题解决 目录 libpng warning iCCP known incorrect sRGB profile 警告 xf
  • 卷积神经网络核心概念再复习+Pytorch一维卷积的实现

    蓝色 紫色 红色 深度学习之卷积神经网络 基本的图像分类模型架构 卷积层 xff1a 用来提取图像的底层特征 池化层 xff1a 防止过拟合 xff0c 减小数据维度 全连接层 xff1a 汇总卷积层和池化层得到的底层特征和信息 xff0c
  • Ubuntu20.04安装过程 【磁盘分区】

    前言 首先 要了解你的电脑配置 xff08 我实验室的如下 xff09 xff1a 整个安装Ubuntu系统的过程大致如下 xff1a 华硕主板按F2 F8 xff0c 这个可以百度 也可以重新启动 xff0c 在你的第一个界面上能看到 按
  • KLT光流跟踪特征点对

    前言 本篇所述为KLT光流跟踪两个视频中匹配特征点对的具体实现 61 gt 源码见Github openCV版本 xff1a 4 5 5 函数详解 1 特征提取 1 SIFT特征提取调用方式 sift span class token op
  • Ubuntu 20.04桌面文件夹图标消失及文件系统无法打开

    前言 之前遇到过服务器上桌面图标突然消失的情况 在更换系统语言之后 xff0c 桌面出现过一次这种情况 xff0c 经过重启之后就恢复了 再后来又莫名其妙出现了这么个问题 xff0c 最开始搜索的解决方案是 让你打开任务管理器 gnome
  • 【论文笔记】Deblur-NeRF == HKU ==CVPR‘2022

    蓝色 紫色 红色 Deblur NeRF Neural Radiance Fields from Blurry Images Author From Abstract 神经辐射场 xff08 NeRF xff09 由于其显著的合成质量 xf
  • Linux安装 metashape

    1 下载软件 3D三维建模软件 Agisoft Metashape Pro 2 安装 span class token comment 进入root模式 xff0c 如果之前没有设置过密码 span span class token fun
  • Information Collection

    港澳新地区 香港理工大学 杨波 助理教授 vLAR实验室 欧洲 ETH Z rich Marc Pollefeys Computer Vision and Geometry Group TU Delft 3D geoinformation
  • 804半导体物理 中科院半导体所考研经验

    本人2021考研 xff0c 半导体研究所 xff0c 物理电子学 xff0c 数一英语一 xff0c 专业课804半导体 自己之前在备考的时候就感觉专业课的资料和备考经验比较少 xff0c 现在就写一些自己总结的经验 xff0c 放一些资
  • 一些cmake error fixed

    建完虚拟环境后 运行 pip install 出现报错 xff0c 显示svox2安装出错 xff0c 然后开始进入到svox2中进行手动编译和安装 1 cmake svox2 csrc pybind11找不到 conda span cla
  • metashape-pro python scripts render specified viewpoint

    官方python脚本使用文档 主函数 xff1a render 61 chunk model renderImage 1 实现特定视角的渲染需要通过脚本方式进行 xff0c 原本的metashape pro中是没有这个功能的 首先在meta
  • 【mega-nerf】调包失败&pip install失败解决方案

    Problem 1 调包失败 在这样的层级架构里调包 xff0c 输出无法找到 mega nerf 直接用 sys path append 没有作用 span class token comment import sys span span
  • 使用 rust 开发 stm32:前言

    更多分享内容可访问我的个人博客 https www niuiic top 本系列教程全部置于stm32专栏 本文为使用 rust 开发 stm32 系列教程前言 Why Rust Rust 特性就不用多介绍了 xff0c 有个编译器管着有时
  • docker与virtualbox切换使用

    管理员模式打开cmd 查看hyper v状态 xff1a bcdedit span class token operator span findstr hyperv 若状态显示 hypervisorlaunchtype Auto 则当前可支
  • 内存管理学习

    简单的内存分配算法学习 系统中一块剩余不用的大块连续内存 当需要分配内存块时 xff0c 将从这个大的内存块上分割出相匹配的内存块 xff0c 每个内存块都包含一个管理用的数据头 xff0c 通过这个头把使用块与空闲块用双向链表的方式链接起
  • 模拟I2C

    I2C具体内容参考资料 https blog csdn net sternlycore article details 85600668 https blog csdn net qq 43460068 article details 122
  • 巴特沃斯滤波器使用-butter

    matlab的函数butter 低通滤波使用方法 span class token punctuation span B A span class token punctuation span span class token operat
  • 单片机中uid的使用方法

    uid xff1a unique ID 每个单片机芯片出厂后唯一的ID xff0c 不会重复 uid有很多用途 xff0c 我们可以用来作为mac地址 xff0c 可以用来记录唯一的日志 xff0c 也可以用来防止固件被拷贝使用 本文所描述