zoukankan      html  css  js  c++  java
  • STM32的硬件CRC

    简介

    基于STM32F105介绍STM32的硬件CRC和使用方法,并记录软件检验实现。

    STM32的CRC介绍


    手册中说明STM32的CRC硬件校验使用的是32位CRC校验,多项式为0x04C11DB7;CRC计算时一次性运算32bits,不是按照字节运算;CRC_DR寄存器的复位值为0xFFFFFFFF,即CRC计算的初始值。

    STM32的CRC使用

    • STM32的CRC_DR寄存器既作为输入寄存器又作为输出寄存器
    • 作为输入寄存器时直接写入要进行CRC计算的数据
    • 作为输出寄存器时,通过读操作返回上次CRC计算结果
    • 每一次写入数据寄存器的计算结果是前一次计算结果和新计算结果的组合;在新的数据块进行CRC计算之前,需要复位CRC_DR寄存器

    以STM32F105的标准库为例,介绍CRC计算的步骤

    uint32_t buff[4] = {0x01,0x02,0x03,0x04};
    CRC_ResetDR();
    CRC_CalcBlockCRC(buff,4);
    delay(5);
    ret = CRC_GetCRC();
    

    STM32的CRC软件实现

    STM32硬件CRC计算出来的结果与常用的CRC32计算出的CRC值不一样,如果通信中用到了STM32的硬件CRC计算值,需要外部实现与硬件CRC一致的计算结果,详细代码如下,提供参考链接

    uint32_t crc32_st(uint32_t *pbuf, uint32_t size)
    {
    	const uint32_t st_const_value = 0x04c11db7;
    	uint32_t	crc_value = 0xffffffff;
    	uint32_t	xbit;
    	uint32_t 	bits;
    	uint32_t	i;
    
    	for (i = 0; i < size; i++)
    	{
    		xbit = 0x80000000;
    		for (bits = 0; bits < 32; bits++)
    		{
    			if (crc_value & 0x80000000)
    			{
    				crc_value <<= 1;
    				crc_value ^= st_const_value;
    			}
    			else
    			{
    				crc_value <<= 1;
    			}
    			if (pbuf[i] & xbit)
    			{
    				crc_value ^= st_const_value;
    			}
    			xbit >>= 1;
    		}
    	}
    	return crc_value;
    }
    

    总结

    其它平台与STM32通信时,如果用到CRC值,可以通过这种软件计算与STM32的CRC保持一致。

  • 相关阅读:
    css3正方体效果
    单行文本溢出和多行文本溢出变省略号
    iscroll的滑动效果
    angular笔记
    html页面的css样式、meta最常用的最基本最常规的配置参数
    解决webstorm卡顿问题
    pc端网页的设计尺寸
    时间字符串解析成日期时间格式
    Inf2Cat, signability test failed.
    #pragma once 与 #ifndef 解析(转载)
  • 原文地址:https://www.cnblogs.com/niu-li/p/12585813.html
Copyright © 2011-2022 走看看