STM32F107的CRC错误
STM32F107的CRC错误
关于STM32F107的CRC计算结果错误,通常涉及以下几个关键原因及解决方法:
? 1. 配置错误(最常见原因)
- 多项式不匹配:
- STM32F107的CRC单元默认使用 CRC-32 多项式(0x4C11DB7),且输入/输出不反转(与标准CRC-32如Zip、以太网等不同)。
- 问题: 如果你需要计算标准CRC-32(如IEEE 802.3),其多项式是0x04C11DB7但要求输入/输出位反转。STM硬件默认不反转。
- 解决:
- 软件修正: 在写入数据前对每个字节进行位反转(或按32位反转),并在读取CRC结果后进行位反转。参考手册通常提供示例代码。
- 配置选项 (如果可用): 检查你的芯片参考手册 (RM0008 Rev 21) 中CRC章节。STM32F107的CRC模块相对基础,可能不支持硬件反转配置。如果确实不支持,只能靠软件处理反转。
? 2. 数据写入方式错误
- 对齐问题:
- CRC数据寄存器 (
CRC_DR) 是32位的。写入8位或16位数据时: - 8位写入:数据应放在
DR[7:0](最低字节)。 - 16位写入:数据应放在
DR[15:0](低半字)。 - 问题: 错误地将字节/半字数据写入高位部分会导致计算错误。
- CRC数据寄存器 (
- 写入顺序:
- 小端架构: STM32是小端架构。写入32位字时,内存中的第一个字节(低地址)会被写入
DR[7:0]。 - 问题: 如果数据缓冲区是按大端组织,或者写入顺序(字节、半字、字的顺序)与预期不符,会导致CRC错误。
- 小端架构: STM32是小端架构。写入32位字时,内存中的第一个字节(低地址)会被写入
- 未重置CRC: 在开始新计算前,必须将CRC初始值寄存器(
CRC_INIT)设置为期望的初始值(通常是0xFFFFFFFF用于标准CRC-32),或者通过写CRC_CR寄存器的RESET位(如果支持)来复位CRC计算器到初始值(CRC_INIT)。连续计算时忘记重置会导致结果叠加。 - 数据长度非字对齐:
- 如果数据总长度不是4字节的倍数,最后需要写入剩余字节(1、2或3个)时,必须使用
*(__IO uint8_t*)&CRC_DR或*(__IO uint16_t*)&CRC_DR进行8位或16位访问。强行用32位写入会引入无效的填充数据。
- 如果数据总长度不是4字节的倍数,最后需要写入剩余字节(1、2或3个)时,必须使用
? 3. 参考手册理解偏差
- 仔细阅读手册: STM32F10xxx参考手册 (RM0008) 第24章详细描述了CRC单元。务必理解:
- 默认多项式 (
0x4C11DB7)。 - 数据寄存器(
CRC_DR)的写入机制(不同宽度数据的放置)。 - 初始值寄存器(
CRC_INIT)的作用和复位值。 - 控制寄存器(
CRC_CR)中RESET位的用法(如果存在)。 - 手册中提供的计算示例代码。
- 默认多项式 (
⚙ 4. 硬件问题(较少见)
- 时钟问题: 确保为CRC外设提供了正确的时钟(通过RCC使能)。
- 芯片故障: 极少数情况下可能是硬件缺陷。可以用已知的简单数据(如全0、全1)计算CRC,并与预期值(可在线计算器验证)对比进行基本测试。
? 诊断和解决步骤
- 确认需求: 你需要计算哪种CRC?标准CRC-32 (IEEE 802.3/POSIX cksum)?还是STM默认的CRC-32?
- 检查初始化:
- 复位CRC计算器 (
CRC_CR.RESET = 1或设置CRC_INIT = 0xFFFFFFFF)。 - 确认AHB时钟已使能CRC (
RCC_AHBENR.CRCEN = 1)。
- 复位CRC计算器 (
- 检查数据写入:
- 顺序: 确保按正确的内存顺序(小端)写入数据。
- 宽度: 根据数据长度选择合适的写入宽度(8/16/32位),尤其是非对齐数据结尾。
- 地址: 使用正确的强制类型转换访问
CRC_DR以写入不同宽度数据:- 32位:
CRC->DR = myUint32; - 16位:
*(__IO uint16_t *)&(CRC->DR) = myUint16; - 8位:
*(__IO uint8_t *)&(CRC->DR) = myUint8;
- 32位:
- 处理反转 (如果使用标准CRC-32):
- 输入反转: 在写入每个字节(或32位字)到
CRC_DR之前,对其进行位反转 (e.g.,__RBIT指令然后移位,或手动反转)。 - 输出反转: 读取
CRC->DR结果后,对其进行位反转,然后异或0xFFFFFFFF(~result或result ^ 0xFFFFFFFF)。
- 输入反转: 在写入每个字节(或32位字)到
- 使用已知向量测试: 用简单的测试数据(如字符串
"123456789")计算CRC,将结果与在线CRC计算器或标准库(如Pythonbinascii.crc32)的结果对比。 - 查阅手册示例: 仔细研读RM0008第24.3节的计算示例,模仿其步骤。
? 关键总结
- STM32F107默认CRC与标准CRC-32的主要区别在于位反转。这是最常见的问题根源。
- 数据写入的宽度、顺序和对齐至关重要。
- 每次计算前务必重置CRC计算器。
- 仔细阅读并理解参考手册中的说明和示例。
通过系统检查配置、数据输入过程和反转需求,应该能解决大部分STM32F107 CRC计算错误的问题。??
请问STM32F207的MCO是否比STM32F107差?
我用STM32F107做一个带以太网通讯功能的产品,超频到100MHz左右,一切工作正常。于是换成STM32F207,我拿了两个STM32F20
STM32F107通过以太网实现在应用中编程(IAP)
电子发烧友网站提供《STM32F107通过以太网实现在应用中编程(IAP).pdf》资料免费下载
资料下载
fansz
2023-09-21 11:52:37
AN3411_基于stm32F107的IEEE1588高精度时间协议演示
AN3411_基于stm32F107的IEEE1588高精度时间协议演示
资料下载
佚名
2022-11-21 08:11:30
STM32F107移植LWIP 精选资料分享
STM32F107上移植LWIP2.0.3 因为最近需要在STM32F107上实现TCP/IP协议栈,所以网上查了一下,准备使用LWIP,虽然大多数用的是1.4.1版本但是官方说2系大版本修复了
STM32F107通过LWIP实现MQTT发布和订阅框架 精选资料分享
STM32F107通过LWIP实现MQTT发布和订阅框架原料创建STM32F107的BasecodeMQTT源码获取添加MQTT源码到工程修改mqtt接口文件(transport.c/h)建立
STM32F107的LWIP内存溢出
最近在用STM32F107做以太网,移植了LWIP1.3.1进行TCP客户端/服务器通讯,,,短时间通讯没问题,每200ms发送1300字节,串口发给以太网,以太网发给串口这样交互。但是在长时间通讯
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机