你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32硬件CRC的使用

[复制链接]
攻城狮Melo 发布时间:2022-11-13 16:56
STM32硬件CRC的使用
STM32硬件的CRC不占用MCU的计算资源,和软件查表计算消耗的存储空间。但其结果与平常使用的CRC不一样,导致很多人还是在用软件计算CRC。
其实结果的差别,只是由于计算方式导致的,调整计算方式以后也可以输出普通计算的结果。

异同
与普通计算方式相同,以CRC32举例,其默认多项式也是
X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1,但也可以自定义。
计算的初值不同:STM32为0,普通CRC计算为0xffffffff
计算的顺序不同:STM32从最低位开始计算,普通CRC从最高位开始计算
输出结果:最高位到最低位,与普通CRC刚好相反,而且普通CRC的输出结果为计算结果与0xffffffff异或后输出,STM32就少了这个异或。

处理
知道了不同之处,接下来的处理就很简单了。在CRC的设置中按下图

fb756e0acfbb4756b0a611e1c5e9e77b.png

编程
  1. u8 crc_buf[6] = {0xBE, 0xEF, 0x55, 0xaa, 0xcc, 0xdd};

  2. u32 calculate_crc32(u8 *pdata, u16 len)
  3. {
  4.   u32 crc=0;

  5.   //因为主流CRC计算是结果与0xffffffff异或后再输出,而STM32并没有,所以这里要加上异或
  6.   crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len)^0xffffffff;
  7.   return crc;
  8. }
复制代码

验证
硬件crc的结果为0x8c9792a5

82ef316fe3e644e2ae4e17f1b78f012d.png

结果相符。

CRC16的计算方法又有区别
对于CRC16有些不同,要计算CRC16时,第1个参数选Disable,然后多项式可以自定义
而且计算方法也和CRC32不同,注意看区别
9474dffe7fdb404bb3fce2495fbd731b.png

设置或更改的内容如下:
默认的多项式是不对的,常规应该是0x8005,按位设置好就是X15+X2+X0
默认的初值置0
输入反转,输出不反。
计算结果不异或。

  1.   crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len);
复制代码

结果验证:
对于0x07, 0x02, 0x00, 0x10, 0x00,硬件CRC计算结果为0x9D1D



结果相符

MODBUS
MODBUS一般是8个字节,其中CRC16占用最后的2个字节,正文共6个字节,在这里也示例一下

d4726e2f97584323866278a4e934f114.png

代码如下:

  1. crc16 = HAL_CRC_Calculate(&hcrc, (u32*)uart2_receive_buf, 6);
复制代码

fd7a10b3929345f8a346f05c8794c106.png

当然有很多种计算CRC的参数模型,按照上面的方法套一下即可。
————————————————
版权声明:老李的森林


339e28d69265456fb5c977a90b02f18a.png
7345dae16e534a918d8f42fc115e7568.png
收藏 评论0 发布时间:2022-11-13 16:56

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版