当前位置: 首页 > article >正文

STM32 CRC校验与芯片ID应用全解析:从原理到实践 | 零基础入门STM32第九十七步

主题内容教学目的/扩展视频
CRC与芯片ID原理实现CRC校验和读取芯片ID为单片机应用提供数据验证和身份识别的功能。

师从洋桃电子,杜洋老师


📑文章目录

    • 一、CRC校验功能解析
      • 1.1 CRC基本原理
      • 1.2 核心功能对比
    • 二、CRC校验应用实战
      • 2.1 典型应用场景
      • 2.2 程序实现流程
      • 2.3 关键代码解析
    • 三、芯片ID功能解析
      • 3.1 芯片ID特性
      • 3.2 地址映射结构
    • 四、芯片ID应用实战
      • 4.1 典型应用场景
      • 4.2 程序实现流程
      • 4.3 关键代码解析
    • 五、扩展应用设计
      • 5.1 安全增强方案
      • 5.2 调试技巧
    • 六、常见问题解答
      • 附:关键寄存器速查表
    • 七、相关资源


一、CRC校验功能解析

1.1 CRC基本原理

原始数据
CRC计算单元
校验码生成
数据验证
  • 硬件加速:STM32内置32位CRC计算器
  • 多项式:默认使用CRC-32/MPEG-2标准(多项式0x04C11DB7)
  • 特性
    • 支持单个数据/数据块计算
    • 独立用户寄存器(8位)用于临时存储
    • 计算前需复位清空历史数据

1.2 核心功能对比

功能类型操作方式适用场景
单次计算CRC_CalcCRC()离散数据校验
批量计算CRC_CalcBlockCRC()连续数据流校验
独立寄存器CRC_SetIDRegister()临时数据存储

二、CRC校验应用实战

2.1 典型应用场景

  1. Flash完整性校验:验证固件烧录正确性
  2. 通信数据验证:UART/SPI传输数据校验
  3. 文件签名:软件升级包完整性验证

2.2 程序实现流程

MCU CRC 开启时钟(RCC_AHBPeriph_CRC) CRC_ResetDR() CRC_CalcCRC(0x12345678) CRC_CalcBlockCRC(buffer, length) 返回校验结果 MCU CRC

2.3 关键代码解析

// CRC初始化与计算示例
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE); // 启用CRC时钟uint32_t Calc_SingleData(void) {CRC_ResetDR();return CRC_CalcCRC(0x12345678); // 返回单个数据CRC值
}uint32_t Calc_DataBlock(uint32_t *buf, uint32_t len) {CRC_ResetDR();return CRC_CalcBlockCRC(buf, len); // 返回数据块CRC值
}

三、芯片ID功能解析

3.1 芯片ID特性

  • 唯一性:96位全球唯一标识(不可修改)
  • 存储位置:0x1FFFF7E8 ~ 0x1FFFF7F3
  • 读取方式
    • 32位模式读取3个寄存器
    • 16位模式读取6个寄存器
    • 8位模式读取12个寄存器

3.2 地址映射结构

0x1FFFF7E8
ID_Part1
0x1FFFF7EC
0x1FFFF7F0
32位数据
32位数据
32位数据

四、芯片ID应用实战

4.1 典型应用场景

  1. 设备身份认证:硬件加密绑定
  2. 防克隆保护:验证合法硬件
  3. 生产追溯:记录产品序列号

4.2 程序实现流程

定义存储数组
读取ID地址
32位模式读取
验证ID合法性
应用处理

4.3 关键代码解析

// 芯片ID读取示例
uint32_t ChipID[3];
void Read_ChipID(void) {ChipID[0] = *(__IO uint32_t *)(0x1FFFF7E8); // 高位ChipID[1] = *(__IO uint32_t *)(0x1FFFF7EC); // 中位ChipID[2] = *(__IO uint32_t *)(0x1FFFF7F0); // 低位
}// ID验证示例
bool Verify_ChipID(void) {return (ChipID[0] == 0x066EFF34) && (ChipID[1] == 0x3437534D) && (ChipID[2] == 0x43232328);
}

五、扩展应用设计

5.1 安全增强方案

读取芯片ID
加密算法处理
生成设备密钥
固件加密
安全启动验证

5.2 调试技巧

  1. CRC验证工具:使用在线CRC计算器交叉验证
  2. ID读取验证:通过ST-Link Utility直接查看内存
  3. 端序转换:使用__REV宏处理大小端转换

六、常见问题解答

Q1:CRC计算结果与软件算法不一致?

  • 检查多项式配置
  • 确认初始值是否复位
  • 验证数据输入顺序(字节序)

Q2:读取的芯片ID全为0或FFFF?

  • 检查地址是否正确
  • 确认芯片未处于保护模式
  • 验证内存访问权限

Q3:如何防止芯片ID被篡改?

  • 结合加密算法处理原始ID
  • 在安全启动流程中验证
  • 使用OTP区域存储校验值

附:关键寄存器速查表

功能相关地址/寄存器访问方式
CRC计算器CRC_DR直接读写
独立寄存器CRC_IDR8位存取
芯片ID高位0x1FFFF7E832位读取
芯片ID中位0x1FFFF7EC内存映射访问

七、相关资源

[1] 洋桃电子B站课程-STM32入门100步
[2] STM32官方文档手册
[3] STM32F103固件函数库用户手册(中文)
[4] CRC功能测试程序
[5] 芯片ID读取程序
[6] CRC与芯片ID原理.pptx


💬 技术讨论(请在评论区留言~)

📌 下期预告:下一期将探讨回顾总结,欢迎持续关注!

点击查阅🔍往期【STM32专栏】文章

版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志

  • v1.0 初始版本(2025-04-09)

相关文章:

STM32 CRC校验与芯片ID应用全解析:从原理到实践 | 零基础入门STM32第九十七步

主题内容教学目的/扩展视频CRC与芯片ID原理实现CRC校验和读取芯片ID为单片机应用提供数据验证和身份识别的功能。 师从洋桃电子,杜洋老师 📑文章目录 一、CRC校验功能解析1.1 CRC基本原理1.2 核心功能对比 二、CRC校验应用实战2.1 典型应用场景2.2 程序实…...

巴特沃斯滤波器

一、MATLAB 实现 1. 巴特沃斯滤波器函数(支持图像/信号) function H butterworth_filter(D0, size, n, mode) % BUTTERWORTH_FILTER 生成巴特沃斯滤波器 % - D0: 截止频率 % - size: 滤波器尺寸(图像:[height, width]&…...

银河麒麟系统虚拟机网络ping不通的解决方法

问题描述:使用NAT模式搭建了银河麒麟系统虚拟主机,虚拟机内部可以联网,可以查询到具体的ip地址,同时也可以在虚拟机内部ping同宿主机ip,但使用宿主机却无法ping同银河麒麟虚拟机ip,使用ssh、ftp、sftp等工具…...

大数据学习(105)-大数据组件分析

🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...

基于SpinrgBoot+Vue的医院管理系统-026

一、项目技术栈 Java开发工具:JDK1.8 后端框架:SpringBoot 前端:Vue开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 二、功能介绍 (1)…...

Mujoco xml模型

Mujoco xml模型 一个例子compileroptionassetmesh default基本使用childclass与class多个class worldbodybody关系inertialjointgeom XML主要分为以下三个部分&#xff1a; < asset> &#xff1a; 用 tag导入STL文件&#xff1b;< worldbody>&#xff1a;用tag定义…...

LLM 为什么使用ID,每个单词不都是有编码的吗

LLM 为什么使用ID,每个单词不都是有编码的吗 在自然语言处理(NLP)里,把文本转换为整数 ID 来表示是一种常见的做法,以下为你详细阐述使用 ID 的原因,以及是否每个单词都有编码。 使用 ID 的原因 1. 计算机可处理性 计算机没办法直接处理文本数据,因为文本是人类使用的…...

vue专题1---vue中绑定的自定义事件对应的事件处理函数,如何在传递参数的同时接收事件对象 event

在 Vue 中&#xff0c;如果想在事件处理函数中传递参数&#xff0c;可以使用箭头函数或者 v-bind 来实现。下面是两种常见的方法&#xff1a; 方法1&#xff1a;使用箭头函数 你可以直接在事件监听中使用箭头函数来传递参数&#xff0c;同时接收事件对象 e。 <template&g…...

转行嵌入式,需要自学多久?

作为一个本硕都学机械&#xff0c;却阴差阳错进入嵌入式行业的老兵&#xff0c;这个问题我能聊一整天。十几年前我还在工厂车间穿着工装和机床打交道&#xff0c;偶然接触到单片机后就一发不可收拾。 转行这条路我走得异常艰辛&#xff0c;踩过的坑比写过的代码还多。去年我终…...

实现抗隐私泄漏的AI人工智能推理

目录 什么是私人AI? 什么是可信执行环境? TEE 如何在 AI 推理期间保护数据? 使用 TEE 是否存在风险? 有哪些风险? Atoma 如何应对这些风险 为什么去中心化网络是解决方案 人工智能推理过程中还有其他保护隐私的方法吗? 私人人工智能可以实现什么? 隐私驱动的应…...

SeaTunnel系列之:Apache SeaTunnel编译和安装

Apache SeaTunnel编译 Prepare编译克隆源代码本地安装子项目从源代码构建 SeaTunnel构建子模块安装 JetBrains IDEA Scala 插件安装 JetBrains IDEA Lombok 插件代码风格运行简单示例不仅如此 安装下载 SeaTunnel 发布包下载连接器插件从源代码构建 SeaTunnel 运行 SeaTunnel 在…...

数据结构刷题之贪心算法

贪心算法&#xff08;Greedy Algorithm&#xff09; 是一种在每个步骤中都选择当前最优解的算法设计策略。它通常用于解决优化问题&#xff0c;例如最小化成本或最大化收益。贪心算法的核心思想是&#xff1a;在每一步选择中&#xff0c;都做出局部最优的选择&#xff0c;希望…...

Spring进阶:掌控Bean的作用域与生命周期

在上一篇文章中&#xff0c;我们了解了Spring IoC容器如何接管对象的创建和依赖注入&#xff0c;实现了松耦合。容器创建并管理的对象&#xff0c;我们称之为Bean。 但是&#xff0c;容器仅仅是创建Bean就够了吗&#xff1f;显然不是。我们还需要关心&#xff1a; 这个Bean在容…...

【Leetcode-Hot100】移动零

题目 解答 首先&#xff0c;使用的解题思路是&#xff1a;使用两个指针&#xff0c;分别指向数组的第一个0元素位置&#xff0c;以该元素位置1为起始点寻找接下来第一个非0元素位置。二者确定后&#xff0c;对其进行交换。随后继续寻找下一个0元素位置。重复上述操作。 但第一…...

安装 Calico 的两种主流方式对比

本文对比了 Calico 的两种主流安装方式&#xff1a; 使用 calico.yaml 的 Manifest 安装方式使用 Tigera Operator&#xff08;tigera-operator.yaml custom-resources.yaml&#xff09;安装方式 ✅ 1. 使用 Manifest 方式安装&#xff08;直接部署 calico.yaml&#xff09; …...

leetcode_203. 移除链表元素_java

203. 移除链表元素https://leetcode.cn/problems/remove-linked-list-elements/ 1、题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head …...

常见算法模板总结

文章目录 一、二叉树1. DFS2. BFS 二、回溯模板三、记忆化搜索四、动态规划1. 01背包朴素版本滚动数组优化 2. 完全背包朴素版本滚动数组优化 3. 最长递增子序列LIS朴素版本贪心二分优化 4. 最长公共子序列5. 最长回文子串 五、滑动窗口六、二分查找七、单调栈八、单调队列九、…...

UE5学习笔记 FPS游戏制作44 统一UI大小 sizeBox

如果我们希望多个类似的UI大小一样&#xff0c;例如不同菜单的标题&#xff0c;可以使用sizeBox组件 我们在标题控件上&#xff0c;用sizeBox包裹所有子物体 然后指定他的最小宽高&#xff0c;或最大宽高 如果指定的是最小宽高&#xff0c;当子元素&#xff08;如图片&#xf…...

# 基于BERT的文本分类

基于BERT的文本分类项目的实现 一、项目背景 该文本分类项目主要是情感分析&#xff0c;二分类问题&#xff0c;以下是大致流程及部分代码示例&#xff1a; 二、数据集介绍 2.1 数据集基本信息 数据集自定义类型二分类&#xff08;正面/负面&#xff09;样本量训练集 验证…...

C++学习之服务器EPOLL模型、处理客户端请求、向客户端回复数、向客户端发送文件

目录 1.启动epoll模型 2.和客户端建立新连接 3.接受客户端Http请求数据 4.代码回顾从接受的数据中读出请求行 5.请求行解析 6.正则表达式以及匹配 7.解析请求行以及后续处理 8.对path处理说明 9.如何回复响应数据 10.对文件对应content-type如何查询 11.服务器处理流…...

BUUCTF-web刷题篇(17)

26.BabyUpload 源码&#xff1a;https://github.com/imaginiso/GXY_CTF/tree/master/Web/babyupload 查看题目源码&#xff1a; 写着&#xff1a;SetHandler application/x-httpd-php 通过源码可以看出这道文件上传题目主要还是考察.htaccess配置文件的特性&#xff0c;倘若…...

国网B接口协议调阅实时视频接口流程详解以及检索失败原因(电网B接口)

文章目录 一、B接口协议调阅实时视频接口介绍B.6.1 接口描述B.6.2 接口流程B.6.3 接口参数B.6.3.1 SIP头字段B.6.3.2 SIP响应码B.6.3.3 SDP参数定义B.6.3.4 RTP动态Payload定义 B.6.4 消息示例B.6.4.1 调阅实时视频请求B.6.4.2 调阅实时视频请求响应 二、B接口调阅实时视频失败…...

windows11下pytorch(cpu)安装

先装anaconda 见最下方 Pytorch 官网&#xff1a;PyTorch 找到下图&#xff08;不要求版本一样&#xff09;&#xff08;我的电脑是集显&#xff08;有navdia的装gpu&#xff09;&#xff0c;装cpu&#xff09; 查看已有环境列表 创建环境 conda create –n 虚拟环境名字(…...

NVR接入录像回放平台用EasyCVR打造地下车库安防:大型商居安全优选方案

一、背景分析 随着居民生活品质的提升&#xff0c;大型商业建筑和住宅小区纷纷配套建设地下停车库。但是地下车库盗窃、失火、恶意毁坏车辆、外部人员随意进出等事件频发&#xff0c;部署视频监控系统成为保障地下车库的安全关键举措。 目前&#xff0c;很多商业和住宅都会在…...

玻璃期货数据下载与分析:Python金融实战分享

期货数据下载与分析&#xff1a;Python实战分享 引言 在金融市场中&#xff0c;期货分析是一项重要的工作&#xff0c;而获取准确且及时的数据是进行有效分析的基础。今天&#xff0c;我们将深入探讨一段使用Python编写的代码&#xff0c;该代码用于从郑州商品交易所&#xf…...

excel常见错误包括(#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?、#NULL! )

目录 1. #N/A2. #VALUE!3. #REF!4. #DIV/0!5. #NUM!6. #NAME?7. #NULL!8.图表总结 在 Excel 中&#xff0c;可能会遇到以下常见的错误值&#xff0c;每个都有特定的含义和成因&#xff1a; 1. #N/A 含义&#xff1a; 表示“Not Available”&#xff08;不可用&#xff09;。…...

乾元通渠道商中标川藏铁路西藏救援队应急救援装备项目

乾元通渠道商中标川藏铁路西藏救援队应急救援装备项目&#xff0c;项目内通信指挥车基于最新一代应急指挥车解决方案打造&#xff0c;配合乾元通自研的车载多链路聚合路由及系统&#xff0c;主要用途为保障应急通讯&#xff0c;满足任务执行时指挥协调、通信联络及数据传输的要…...

数学知识——矩阵乘法

使用矩阵快速幂优化递推问题 对于一个递推问题&#xff0c;如递推式的每一项系数都为常数&#xff0c;我们可以使用矩阵快速幂来对算法进行优化。 一般形式为&#xff1a; F n F 1 A n − 1 F_nF_1A^{n-1} Fn​F1​An−1 由于递推式的每一项系数都为常数&#xff0c;因此对…...

左右开弓策略思路

一、策略概述 本策略是一种基于多种技术指标的复杂交易策略&#xff0c;包括自定义指标计算、过滤平滑处理以及交易信号生成。 该策略通过不同的交易平台代码段实现&#xff0c;旨在通过分析历史价格数据来预测未来价格走势&#xff0c;并据此生成交易信号。 二、主要技术指标…...

将jar包制作成deb一键安装包

文章目录 准备环境准备deb包结构构建Deb包测试安装常用操作命令 本文介绍如何将java运行环境、jar程序一起打包成一个deb格式的安装包&#xff0c;创建桌面图标&#xff0c;通过点击图标可使用系统自带浏览器快捷访问web服务的URL&#xff0c;同时注册服务并配置好开机自启。 准…...