循环冗余校验(CRC)计算单元是根据固定的生成多项式得到任意字节数据的 CRC 计算结果。在应用中, CRC 技术主要应用于核实数据传输或者数据存储的正确性和完整性。
本模块算法遵从 ISO/IEC13239 的定义,采用 16 位长度的 CRC,计算多项式为:
𝑥16+ 𝑥12+ 𝑥5+ 𝑥
计算初始值为 0xFFFF。
本模块功能包括:
⚫ CRC 编码和 CRC 校验
⚫ 3 种位宽访问方式:8 位、16 位、32 位
⚫ 8 位位宽下输入数据示例为 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77
⚫ 16 位位宽下输入数据示例为 0x1100, 0x3322, 0x5544, 0x7766
⚫ 32 位位宽下输入数据示例为 0x33221100, 0x77665544
CRC 编码模式
编码模式可以对原始数据编码以计算其 CRC 值,操作流程如下所示:
- 向 CRC_RESULT.RESULT 写入 0xFFFF,初始化 CRC 计算。
- 将待编码的原始数据按 8 位/16 位/32 位的组织方式,依次写入 CRC_DATA 寄存器。
- 读取 CRC_RESULT.RESULT,即为 CRC 值。
CRC 检验模式
检验模式可以检验已编码的数据是否被篡改,操作流程如下所示
- 向 CRC_RESULT.RESULT 写入 0xFFFF,初始化 CRC 计算。
- 将已编码的数据按 8 位/16 位/32 位的组织方式,依次写入 CRC_DATA 寄存器。
注:按 8 位组织方式写 CRC 值到 CRC_DATA 寄存器时,应先写入低 8 位,后写入高 8 位。
- 读取 CRC_RESULT.FLAG,以判定 CRC 校验是否成功。
/********************************************************************************
* @file bsp_crc.c
* @author jianqiang.xue
* @version V1.0.0
* @date 2021-04-15
* @brief CRC校验
********************************************************************************/
#include "RTE_Components.h"
#include CMSIS_device_header
#include "cx32l003_hal.h"
static CRC_HandleTypeDef g_crc_config =
{
.Instance = CRC
};
void bsp_crc_init(void)
{
__HAL_RCC_CRC_CLK_ENABLE();
HAL_CRC_Init(&g_crc_config);
}
uint32_t bsp_crc_calculate(uint8_t *data, uint32_t len)
{
return HAL_CRC_Calculate(&g_crc_config, data, len);
}
/********************************************************************************
* @file bsp_crc.h
* @author jianqiang.xue
* @version V1.0.0
* @date 2021-04-15
* @brief NULL
********************************************************************************/
#ifndef __BSP_CRC_H
#define __BSP_CRC_H
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
/* Public Function Prototypes ------------------------------------------------*/
void bsp_crc_init(void);
uint32_t bsp_crc_calculate(uint8_t *data, uint32_t len);
#endif
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升