【简介】
在软件开发中CRC(Cyclic Redundancy Check)是一种经常被使用的一种校验算法,我么继续使用S32K146的硬件CRC功能来校验编译的镜像的完整性。以下是常用的CRC32算法参数配置说明,主要涉及以下5个参数配置。
Poly:CRC 算法多项式配置,不同的场景使用的多项式是不一样的
Init:CRC 计算配置的初始值
RefIn/RefOut:这两个参数是保持一致的,对应数据计算的格式为MSB or LSB
XorOut:输出的数据是否需要与0xffffffff 或者 0x00000000进行异或操作

介绍完了CRC计算的参数说明,我们在以下的S32K146 的CRC框图:

从上述框图上查看CRC硬件模块计算逻辑还是比较清晰的,跟CRC32算法相关的控制信号主要有以下几组信号
Poly:多项式参数通过 CRC Polynomial register (GPOLY) 寄存器进行配置

Init 通过seed 及WAS 进行设置,当WAS 为1时将seed 值即初始值配置到CRC计算单元


RefIn/RefOut: 参数配置对应TOT/TOTR 信号配置转换送入CRC计算模块的数据格式,及用户读取到的数据转换


XorOut 参数配置通过FXOR 信号来配置,输出结果是否进行翻转


【S32DS配置】
介绍完了CRC 模块的配置,我们继续使用S32DS 对CRC进行配置,我们使用标准CRC32算法进行参数配置

CRC 的时钟配置使用的内部bus时钟


【功能验证】
配置好CRC参数后我们使用CRC模块来计算字符串“123456789”的CRC32数值是否和网页工具计算的一致来确认CRC模块的工作状态。以下是在线工具对于“123456789” 字符串的计算结果
我们以上面的运算结果为期待值,选取CRC32/BZIP2 CRC32/ISO-HDLC CRC32/MEF 这几组来验证CRC模块的功能,编写如下测试代码
unsigned int crc32_test(char argc,char *argv[])
{
uint8_t * p = "123456789";
/* CRC-32/ISO-HDLC test */
CRC_DRV_Deinit(INST_CRC_1);
crc_1_Cfg0.readTranspose = CRC_TRANSPOSE_BITS_AND_BYTES;
crc_1_Cfg0.writeTranspose = CRC_TRANSPOSE_BITS_AND_BYTES;
crc_1_Cfg0.complementChecksum = true;
crc_1_Cfg0.polynomial = 0X04C11DB7UL;
crc_1_Cfg0.seed = 0xFFFFFFFFUL;
CRC_DRV_Init(INST_CRC_1,&crc_1_Cfg0);
CRC_DRV_WriteData(INST_CRC_1,p,9);
if( 0xCBF43926 == CRC_DRV_GetCrcResult(INST_CRC_1))
{
LOG_I("CRC-32/ISO-HDLC test ok");
}
/* CRC-32/ISO-BZ2 test */
CRC_DRV_Deinit(INST_CRC_1);
crc_1_Cfg0.readTranspose = CRC_TRANSPOSE_NONE;
crc_1_Cfg0.writeTranspose = CRC_TRANSPOSE_NONE;
crc_1_Cfg0.complementChecksum = true;
crc_1_Cfg0.polynomial = 0X04C11DB7UL;
crc_1_Cfg0.seed = 0xFFFFFFFFUL;
CRC_DRV_Init(INST_CRC_1,&crc_1_Cfg0);
CRC_DRV_WriteData(INST_CRC_1,p,9);
if( 0xFC891918 == CRC_DRV_GetCrcResult(INST_CRC_1))
{
LOG_I("CRC-32/BZIP2 test ok");
}
/* CRC-32/ISO-MEF test */
CRC_DRV_Deinit(INST_CRC_1);
crc_1_Cfg0.readTranspose = CRC_TRANSPOSE_BITS_AND_BYTES;
crc_1_Cfg0.writeTranspose = CRC_TRANSPOSE_BITS_AND_BYTES;
crc_1_Cfg0.complementChecksum = false;
crc_1_Cfg0.polynomial = 0x741B8CD7;
crc_1_Cfg0.seed = 0xFFFFFFFFUL;
CRC_DRV_Init(INST_CRC_1,&crc_1_Cfg0);
CRC_DRV_WriteData(INST_CRC_1,p,9);
if( 0xD2C22F51 == CRC_DRV_GetCrcResult(INST_CRC_1))
{
LOG_I("CRC-32/MEF test ok");
}
return 0;
}上述代码运行验证运行后,计算结果跟在线工具(https://crccalc.com/?crc=123456789&method=CRC-32&datatype=ascii&outtype=hex)计算的一致,说明硬件CRC功能验证OK.

我要赚赏金
