主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
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基本原理
- 硬件加速:STM32内置32位CRC计算器
- 多项式:默认使用CRC-32/MPEG-2标准(多项式0x04C11DB7)
- 特性:
- 支持单个数据/数据块计算
- 独立用户寄存器(8位)用于临时存储
- 计算前需复位清空历史数据
1.2 核心功能对比
功能类型 | 操作方式 | 适用场景 |
---|---|---|
单次计算 | CRC_CalcCRC() | 离散数据校验 |
批量计算 | CRC_CalcBlockCRC() | 连续数据流校验 |
独立寄存器 | CRC_SetIDRegister() | 临时数据存储 |
二、CRC校验应用实战
2.1 典型应用场景
- Flash完整性校验:验证固件烧录正确性
- 通信数据验证:UART/SPI传输数据校验
- 文件签名:软件升级包完整性验证
2.2 程序实现流程
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 地址映射结构
四、芯片ID应用实战
4.1 典型应用场景
- 设备身份认证:硬件加密绑定
- 防克隆保护:验证合法硬件
- 生产追溯:记录产品序列号
4.2 程序实现流程
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 安全增强方案
5.2 调试技巧
- CRC验证工具:使用在线CRC计算器交叉验证
- ID读取验证:通过ST-Link Utility直接查看内存
- 端序转换:使用__REV宏处理大小端转换
六、常见问题解答
Q1:CRC计算结果与软件算法不一致?
- 检查多项式配置
- 确认初始值是否复位
- 验证数据输入顺序(字节序)
Q2:读取的芯片ID全为0或FFFF?
- 检查地址是否正确
- 确认芯片未处于保护模式
- 验证内存访问权限
Q3:如何防止芯片ID被篡改?
- 结合加密算法处理原始ID
- 在安全启动流程中验证
- 使用OTP区域存储校验值
附:关键寄存器速查表
功能 | 相关地址/寄存器 | 访问方式 |
---|---|---|
CRC计算器 | CRC_DR | 直接读写 |
独立寄存器 | CRC_IDR | 8位存取 |
芯片ID高位 | 0x1FFFF7E8 | 32位读取 |
芯片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)