转自 | 瑞萨嵌入式小百科
点击查看大图
网络上关于CRC基础原理的内容比较多,可以搜索关键词“循环冗余校验”进行查询。
今天结合瑞萨RA MCU自带硬件CRC计算单元给大家讲讲其原理及监听应用。
瑞萨RA单片机硬件CRC计算单元采用固定的多项式发生器来计算8位或者32位数据的CRC校验值,对数据传输或数据存储的一致性、完整性进行验证。这篇文章重点介绍RA MCU中的CRC模块和使用方法。
RA MCU中的CRC 计算单元规格如下:

点击查看大图
注1. 该函数不能划分CRC计算中使用的数据。以8位或32位为单位写入数据。
CRC 计算单元框图如下:

那么接下来就是如何使用了,打开工程中的configuration.xlm文件,在Stacks窗口中,可以通过“New Stack → Monitoring → CRC (r_crc)”添加该模块。该模块的属性窗口如下:

点击查看大图
在应用程序中使用CRC模块的基本例程如下:
void crc_example (){uint32_t length;uint32_t uint8_calculated_value;length = sizeof(g_data_8bit) / sizeof(g_data_8bit[0]);crc_input_t example_input ={.p_input_buffer = g_data_8bit,.num_bytes = length,.crc_seed = 0,};/* Open CRC module with 8 bit polynomial */R_CRC_Open(&crc_ctrl, &g_crc_test_cfg);/* 8-bit CRC calculation */R_CRC_Calculate(&crc_ctrl, &example_input, &uint8_calculated_value);}
● CRC监听功能
另外CRC单元还具有监听功能 ,可以监视指定 I/O 寄存器地址的读取和写入,并自动对寄存器地址读取和写入的数据进行CRC计算。不是对数据块调用 R_CRC_Calculate,而是调用 R_CRC_SnoopEnable 来开始监视读/写,并使用 R_CRC_CalculatedValueGet 来获取当前CRC。
请注意,监听模式仅适用于SCI上的发送/接收操作。
注:并非所有RA MCU的CRC单元都有监听功能,RA2A1、RA2L1、RA2E1、RA2E2、RA4M1
、RA4W1、RA6M1、RA6M2、RA6M3、RA6T1、RA6T2的CRC单元有监听功能,而RA4M2、RA4M3、RA4T1、RA4E1、RA4E2、RA6M4、RA6M5、RA6T3、RA6E1、RA6E2的CRC单元没有监听功能,具体请参考各MCU的硬件手册。
以下参考代码展示了CRC监听操作:
void crc_snoop_example (){/* Open CRC module with 8 bit polynomial */R_CRC_Open(&crc_ctrl, &g_crc_test_cfg);/* Open SCI Driver *//* Configure Snoop address and enable snoop mode */R_CRC_SnoopEnable(&crc_ctrl, 0);/* Perfrom SCI read/Write operation depending on the SCI snoop address configure *//* Read CRC value */R_CRC_CalculatedValueGet(&crc_ctrl, &g_crc_buff);}
在使用CRC32多项式函数时,CRC模块会产生与流行的在线CRC32计算器相同的结果,但请务必记住一些要点:
● 在线CRC32计算器允许输入任意数量的字节。而FSP CRC32 API函数使用32位。这意味着在线计算时必须“填充”为32位。
● 在线CRC32计算器通常会先对输出取反,然后再将其呈现为结果。如果需要,由应用程序决定是否包含此步骤。
● 在线CRC32计算器和R_CRC模块API(CRC32 多项式)都需要使用种子值 0xFFFFFFFF。
● 确保R_CRC CRC32的位方向设置为LSB,并且选择了CRC32而不是CRC32C。
● 一些在线CRC工具将最终结果与0xFFFFFFFF进行异或。
瑞萨RA MCU全系列产品都具有CRC外设, 对CRC的计算提供硬件支持,为应用程序节省了代码空间。
最后,现在很多单片机都自带有硬件CRC单元,大家开发项目的时候,如果用到了CRC,记得使用硬件CRC哦!
———— END ————

嵌入式系统中的人工智能包含哪些要点?

嵌入式界的机器视觉Vision Board开发板来了

在MCU编程中局部变量赋初始值的重要性