
STM32硬件CRC的使用0 C) ^, }8 Q: X" y, B9 \0 s STM32硬件的CRC不占用MCU的计算资源,和软件查表计算消耗的存储空间。但其结果与平常使用的CRC不一样,导致很多人还是在用软件计算CRC。, Y" |+ Y- Y6 T5 i; y 其实结果的差别,只是由于计算方式导致的,调整计算方式以后也可以输出普通计算的结果。 % Y* w( F7 p l0 }6 }0 B 异同 与普通计算方式相同,以CRC32举例,其默认多项式也是: z; u* _. ]5 p/ K3 K1 o- P X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1,但也可以自定义。2 x3 n% O4 Q8 d& W1 B 计算的初值不同:STM32为0,普通CRC计算为0xffffffff 计算的顺序不同:STM32从最低位开始计算,普通CRC从最高位开始计算 输出结果:最高位到最低位,与普通CRC刚好相反,而且普通CRC的输出结果为计算结果与0xffffffff异或后输出,STM32就少了这个异或。 * R# i, |3 v1 B& r( @ 处理- {1 \# y- z7 w3 f0 r. _8 G, c 知道了不同之处,接下来的处理就很简单了。在CRC的设置中按下图 ![]() 编程
验证 b* D6 T* k: U' S 硬件crc的结果为0x8c9792a5, C( O. h! s& c- ?! N8 ?2 C $ p$ [* P/ K5 _- O( T) C7 ~% | ![]() 结果相符。) y2 F5 E2 I) F [8 R CRC16的计算方法又有区别 对于CRC16有些不同,要计算CRC16时,第1个参数选Disable,然后多项式可以自定义 而且计算方法也和CRC32不同,注意看区别 ![]() 1 i0 H" N/ T( E9 y5 J* G 设置或更改的内容如下: 默认的多项式是不对的,常规应该是0x8005,按位设置好就是X15+X2+X07 P1 T2 z7 K- L( K: G; J* Q9 C$ u+ p$ ^ 默认的初值置0$ B8 \. z$ t5 V) v# {5 O 输入反转,输出不反。 计算结果不异或。. n, v4 k) W) ?! ~/ O
结果验证:( c& v j: ^, c; {3 w3 v 对于0x07, 0x02, 0x00, 0x10, 0x00,硬件CRC计算结果为0x9D1D3 Y9 [8 }4 d% b& X9 D" H) J5 w + M) k6 `1 a4 s6 K , M; j! ^& ~1 N6 n ; i% _' e. v) K( i( L* ^ 结果相符3 r/ c% I2 k) r$ W" I( g 3 K2 y# P+ d1 j MODBUS MODBUS一般是8个字节,其中CRC16占用最后的2个字节,正文共6个字节,在这里也示例一下 5 B* m0 e! D' s" k ![]() 代码如下:& F# p$ ]: a; {6 b " V" w5 H, n! ^ x: x; I
![]() 0 O H& v! v6 |2 _ H9 s6 v. Z 当然有很多种计算CRC的参数模型,按照上面的方法套一下即可。 ———————————————— 版权声明:老李的森林* h- _5 A- `/ I( y0 ~ ; W. m5 D, _0 S$ a3 q 2 p5 c6 f7 K/ i0 c$ }, |4 f9 K4 } |
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南
ST 微控制器电磁兼容性 (EMC) 设计指南