打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

循环冗余校验(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

posted on 2022-08-13 11:00  xuejianqiang  阅读(44)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033