已解决
STM32H7 硬件CRC实现常用CRC算法
来自网友在路上 162862提问 提问时间:2023-09-26 08:16:45阅读次数: 62
最佳答案 问答题库628位专家为你答疑解惑
利用STM32硬件CRC模块实现常规的CRC算法,相比软件模拟,可以显著提高计算效率,常用于通信数据、升级文件、固件包校验。
硬件CRC模块运算速度快,但对于OS场景中的多线程,需要考虑CRC模块的资源共享保护,否则导致计算结果不可靠。另外由于 CRC模块初始化完成后,只支持一种算法运算,对于一个项目或者产品在同一个MCU中需要用到多种CRC算法,则每次切换时需要重新初始化CRC模块,这个初始化过程会占用一定的时间。需要考虑CRC算法的切换频率,综合苹果初始化时间和软件CRC之间的比较,在一个平衡点上选择软件CRC还是硬件CRC。因此,硬件CRC也不一定就是最好的选择。
- CRC-32
#include "crc.h"static CRC_HandleTypeDef hcrc;void crc32_config_init(void)
{hcrc.Instance = CRC;hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;hcrc.Init.InitValue = 0xffffffffU;hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE;hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;(void)HAL_CRC_Init(&hcrc);
}void HAL_CRC_MspInit(CRC_HandleTypeDef* crcHandle)
{if(crcHandle->Instance==CRC){__HAL_RCC_CRC_CLK_ENABLE();}
}void HAL_CRC_MspDeInit(CRC_HandleTypeDef* crcHandle)
{if(crcHandle->Instance==CRC){__HAL_RCC_CRC_CLK_DISABLE();}
}uint32_t hw_crc32(uint8_t *ptr, uint32_t len)
{uint32_t temp = 0;temp = HAL_CRC_Calculate_byte(&hcrc, ptr, len);temp ^= 0xffffffffU;return temp;
}
- CRC16/MODBUS
#include "crc.h"static CRC_HandleTypeDef hcrc;void crc16_modbus_config_init(void)
{(void)HAL_CRC_DeInit(&hcrc);hcrc.Instance = CRC;hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;hcrc.Init.InitValue = 0xffffU;hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE;hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;hcrc.Init.CRCLength = CRC_POLYLENGTH_16B;hcrc.Init.GeneratingPolynomial = 0x8005U;hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;(void)HAL_CRC_Init(&hcrc);
}void HAL_CRC_MspInit(CRC_HandleTypeDef* crcHandle)
{if(crcHandle->Instance==CRC){__HAL_RCC_CRC_CLK_ENABLE();}
}void HAL_CRC_MspDeInit(CRC_HandleTypeDef* crcHandle)
{if(crcHandle->Instance==CRC){__HAL_RCC_CRC_CLK_DISABLE();}
}uint16_t hw_crc16_modbus(uint8_t *ptr, uint32_t len)
{volatile uint32_t temp = 0;temp = HAL_CRC_Calculate_byte(&hcrc, ptr, len);return (uint16_t)temp;
}
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"STM32H7 硬件CRC实现常用CRC算法":http://eshow365.cn/6-13814-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!