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保持一致。

  • 相关阅读:
    Ogre的骨骼动画
    ID卡读取方法(用于区分ID卡读取出来的数据和一般人手录入的数据)
    FastSpring学习笔记一
    数学 方程的解
    单调栈+桶+分治 奇袭
    神奇DP [HNOI2004] 打砖块
    DFS 找硬币
    树DP 树上染色
    android 适配器Adpter的使用总结 之 BaseExpandableListAdapter
    Java删除文件夹以及文件夹下的子目录与文件
  • 原文地址:https://www.cnblogs.com/niu-li/p/12585813.html
Copyright © 2011-2022 走看看