【简介】
在软件开发中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.