0
点赞
收藏
分享

微信扫一扫

[单片机框架][bsp层][cx32l003][bsp_crc] 硬件CRC配置和使用


循环冗余校验(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 值,操作流程如下所示:

  1. 向 CRC_RESULT.RESULT 写入 0xFFFF,初始化 CRC 计算。
  2. 将待编码的原始数据按 8 位/16 位/32 位的组织方式,依次写入 CRC_DATA 寄存器。
  3. 读取 CRC_RESULT.RESULT,即为 CRC 值。

CRC 检验模式

检验模式可以检验已编码的数据是否被篡改,操作流程如下所示

  1. 向 CRC_RESULT.RESULT 写入 0xFFFF,初始化 CRC 计算。
  2. 将已编码的数据按 8 位/16 位/32 位的组织方式,依次写入 CRC_DATA 寄存器。

注:按 8 位组织方式写 CRC 值到 CRC_DATA 寄存器时,应先写入低 8 位,后写入高 8 位。

  1. 读取 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


举报

相关推荐

0 条评论