打印
[应用相关]

AN109 AT32 CRC应用指南

[复制链接]
335|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 muyichuan2012 于 2024-3-6 17:44 编辑

1 简介
循环冗余校验(CRC)是一种检测数据错误的技术,主要用在数据通信和数据存储方面,但它只能检测到传输或存储的数据是否有误,没有将错误纠正的功能。
AT32 MCU 片上 CRC 外设采用 CRC-32 标准(多项式为:X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1,简记式:0x4C11DB7),每次输入输出 32-bit 数据,并支持输入输出数据按设定格式 bit 逆转。

2 CRC 标准
在进行 CRC 计算时会有指定的多项式或标准来对验证方和被验证方进行约束。以下将对标准、多项
式和简记式进行描述,常用的标准有以下几种(但不仅限于):

CRC-12 码通常用来传送 6-bit 字符串,CRC-16 码及 CRC-CCITT 码通常用来传送 8-bit 字符串,CRC-32 码通常用来进行点对点的同步传输。
不同的 CRC 标准具有不一样的多项式,其中多项式中 XY可以简单理解为 bit Y 为 1,以 CRC-8 举
例,多项式的释义如下:

不同 CRC 标准下其最高位都默认为 1,通常简记式的表示方**忽略最高位进行标记。多项式非固定某个值或某个标准,只要计算方及校验方合理采用一致的多项式即可。

3 CRC 计算方法
3.1 CRC 算法
CRC 的计算方法采用异或运算方式。在进行 CRC 计算时可能存在目标数据串位宽比多项式位宽更短,并且计算过程希望保证到目标数据串中的每一位都有被处理到,因此通常的做法是在目标位数据串的后面加上简记式位宽 W 个“0”,再进行异或求余,示例如下:
多项式 = 1011(宽度 W=3)
目标数据串 = 11100110
Bit 流 = 目标数据串 + W 个“0” = 11100110000
CRC result = 100
计算过程图示如下:

3.2 AT32 CRC 外设
AT32 CRC 外设特性:
  • 采用 CRC-32 标准。
  • 一次 CRC 计算需要 4 个 HCLK。
  • 输入输出数据格式可逆转。
  • 数据写入及结果读出都通过同一个数据寄存器(32 位 CRC_DT)。

3.2.1数据格式逆转
AT32 CRC 外设支持输入数据按字节、半字、字格式逆转,输出数据按字格式逆转的特性可配,默认情况下都不逆转。数据格式逆转指对指定数据按一定的数据格式进行高低位逆转的处理方式。16 位数据按字节和半字的逆转图示如下,其余格式与此类似:


3.2.2 AT32 CRC 计算
AT32 CRC 外设在进行计算时的大致流程如下图所示:

其流程描述如下:
  • 首先配置好 CRC 后,复位 CRC_DT 会将 CRC 初始化寄存器中的值更新到 CRC_DT 中。
  • 将输入数据按 32-bit 数据格式写入到 CRC_DT 寄存器,硬件会按输入数据逆转设定是否对数据进行逆转。
  • 数据逆转处理后的输入数据与 CRC_DT 中的结果数据进行异或计算。
  • 异或计算后的结果再按循环冗余校验算法进行处理,并得出每次计算结果。
  • 循环输入数据直到所有数据计算完毕。
  • 读 CRC_DT 获取计算结果,硬件会按输出数据逆转设定是否对数据逆转并给到 CRC_DT 寄存器

4 代码配置解析
以下将以库函数接口为核心来对 CRC 配置流程和方法进行说明。
4.1 函数接口
各系列产品对应提供的 BSP 中对 CRC 外设的设置部分已封装好接口函数以供调用,以下罗列出常用的函数接口,各函数的具体参数及返回值类型等请参考 at32xxxx_crc.c/.h 文件。


/* 数据寄存器 CRC_DT 的复位函数,默认值为 0xFFFFFFFF */
void crc_data_reset(void);
/* 输入一个 32-bit 的数据进行 CRC 计算并返回结果 */
uint32_t crc_one_word_calculate(uint32_t data);
/* 按数据块进行 CRC 计算并返回结果 */
uint32_t crc_block_calculate(uint32_t *pbuffer, uint32_t length);
/* 读取当前 CRC 数据寄存器 */
uint32_t crc_data_get(void);
/* 设置 CRC 通用寄存器,可当做独立的 8-bit 数据存储使用 */
void crc_common_data_set(uint8_t cdt_value);
/* 读取 CRC 通用寄存器存储的数据值 */
uint8_t crc_common_date_get(void);
/* 初始化寄存器 CRC_IDT 值设置 */
void crc_init_data_set(uint32_t value);
/* 按数据类型设置输入数据 bit 逆转 */
void crc_reverse_input_data_set(crc_reverse_input_type value);
/* 输出数据 bit 逆转设置 */
void crc_reverse_output_data_set(crc_reverse_output_type value);
/* CRC 多项式值设置 */
void crc_poly_value_set(uint32_t value);
/* CRC 多项式值读取 */
uint32_t crc_poly_value_get(void);
/* CRC 多项式宽度设置 */
void crc_poly_size_set(crc_poly_size_type size);
/* CRC 多项式宽度读取 */
crc_poly_size_type crc_poly_size_get(void);

CRC 配置流程
按常规应用来讲解 CRC 配置流程,其内容可大致分为如下步骤:

步骤大致描述如下:
  • 首先在进行 CRC 操作之前应开启 CRC 的外设时钟。
  • 设置初始化寄存器(CRC_IDT)值,在对数据寄存器(CRC_DT)进行软复位时,会将初始化寄存器里的值直接写入到 CRC_DT 寄存器作为初始值,如不设置,此寄存器默认值为0xFFFFFFFF。
  • 设置多项式宽度。
  • 设置多项式值。
  • 设置输入输出数据逆转模式。
  • Reset CRC_DT 后将数据按 32-bit 格式逐个写入到 CRC_DT 进行计算。
  • 读 CRC_DT 寄存器,检查计算结果。

示例代码如下:
crm_periph_clock_enable(CRM_CRC_PERIPH_CLOCK, TRUE); // 使能 CRC 外设时钟
crc_init_data_set(0x11223344); // 设置初始化寄存器为 0x11223344
crc_poly_size_set(CRC_POLY_SIZE_32B); // 设置多项式宽度为 32 位
crc_poly_value_set(0x4C11DB7); // 设置多项式值为 0x4C11DB7
crc_reverse_output_data_set(CRC_REVERSE_OUTPUT_DATA); // 配置输出数据逆转
crc_reverse_input_data_set(CRC_REVERSE_INPUT_BY_BYTE); // 配置输入数据字节逆转
crc_data_reset(); // 复位 CRC_DT
crc_value = crc_block_calculate((uint32_t *)data_buffer, BUFFER_SIZE); // block data CRC 计
算并返回结果

5 案例 CRC 计算
5.1 功能简介
在 main.c 里选择不同的宏定义,测试不同配置下的 CRC 计算值,通过串口打印最终的 CRC 计算结果。
5.2 资源准备
1) 硬件环境:
    对应产品型号的 AT-START BOARD
2) 软件环境
    AN0109_SourceCode\utilities\AN0109_demo
5.3 软件设计
1) 配置流程
  • 软件选择不同宏定义。
  • 开启 CRC 外设时钟。
  • 配置输入输出数据逆转模式。
  • 输入需要计算的数据块。
  • 判断计算结果。

2) 代码介绍
CRC 计算数据块

宏定义描述


5.4 实验效果
在 main.c 里选择不同的宏定义,测试不同配置下的 CRC 计算值,通过串口打印最终的 CRC 计算结果。
5.4.1 宏定义选择 CRC32_TEST_1
表 7. 参数配置


图 6.上位机配置


图 7.串口打印结果



AN0109_AT32_MCU_CRC_Application_Note_ZH_V2.0.2.pdf

1.31 MB

AN0109_AT32_MCU_CRC_Application_Note_V2.0.2.zip

9.54 MB

使用特权

评论回复
沙发
micoccd| | 2024-3-11 11:54 | 只看该作者
MODBUS RTU能用这个CRC计算吗

使用特权

评论回复
评论
muyichuan2012 2024-3-11 16:55 回复TA
可以 
板凳
muyichuan2012| | 2024-3-11 16:57 | 只看该作者
如图

2749165eec7622b8fb.png (83.03 KB )

2749165eec7622b8fb.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

126

帖子

1

粉丝