主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
CRC与芯片ID原理 | 实现CRC校验和读取芯片ID | 为单片机应用提供数据验证和身份识别的功能。 |
师从洋桃电子,杜洋老师
功能类型 | 操作方式 | 适用场景 |
---|---|---|
单次计算 | CRC_CalcCRC() | 离散数据校验 |
批量计算 | CRC_CalcBlockCRC() | 连续数据流校验 |
独立寄存器 | CRC_SetIDRegister() | 临时数据存储 |
// 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读取示例
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);
}
Q1:CRC计算结果与软件算法不一致?
Q2:读取的芯片ID全为0或FFFF?
Q3:如何防止芯片ID被篡改?
功能 | 相关地址/寄存器 | 访问方式 |
---|---|---|
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)