【GD32L233C-START评测】9. CRC检验
[复制链接]
本帖最后由 hehung 于 2022-2-11 19:33 编辑
之前的帖子可以参考:
【GD32L233C-START评测】1.开箱
【GD32L233C-START评测】2.手把手创建新工程
【GD32L233C-START评测】3.移植FreeRTOS到GD32L233
【GD32L233C-START评测】4. 移植RT-Thread到GD32L233
【GD32L233C-START评测】5. IIC驱动OLED
【GD32L233C-START评测】6. 获取RTC时间并通过OLED显示
【GD32L233C-START评测】7. PWM驱动LED
【GD32L233C-START评测】8. TRNG真随机数生成
CRC校验在单片机通信领域使用的很多,主要是用于对数据进行校验,通信数据传输的时候一般发送方在数据末尾加上CRC校验值,接收方接收到数据之后会将数据再次CRC校验之后与发送方发送的值进行比较,当然这是比较简单的数据验证,往往数据验证还需要加上随机数等信息。
CRC校验还可以用来检查FLASH数据的完整性,用在在线更新代码等场合。
CRC校验的原理可以在百度搜索,有很多比较完整的解释,GD32提供了CRC模块,不需要用软件来实现了,在没有CRC模块的单片机中,CRC校验可以通过软件来实现。
本文将讲解如何使用GD32L233C的CRC模块。
一、数据手册
查看数据手册,了解到相关操作逻辑以及寄存器。
参考《用户手册》8.循环冗余校验计算单元(CRC)
二、代码实现
1. 时钟初始化
在使用CRC校验功能之前需要对CRC的时钟进行初始化,使能RCU_CRC时钟。
/* enable CRC clock */
rcu_periph_clock_enable(RCU_CRC);
2. CRC初始化
CRC使用之前按照手册需要设置一些初始化化操作,GD已经为我们提供了deinit()接口,也就是恢复初始化设置。直接调用即可。
crc_deinit();
3. 计算CRC值
直接使用GD提供的接口即可。
crc_single_data_calculate:计算单个数值的CRC32值;
crc_block_data_calculate:计算多个数的CRC值;
完整代码如下,计算了0x12345678的CRC32以及数组multiple_data的CRC32值:
uint32_t single_data = 0x12345678;
uint32_t multiple_data[16] = {
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10
};
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
/* configure systick */
systick_config();
/* USART configuration */
gd_eval_com_init(EVAL_COM);
/* enable CRC clock */
rcu_periph_clock_enable(RCU_CRC);
crc_deinit();
/* calculate single value */
printf("Single data - CRC calculate result is 0x%x\r\n", crc_single_data_calculate(single_data, INPUT_FORMAT_WORD));
crc_data_register_reset();
/* calculate multiple value */
printf("Multiple data - CRC calculate result is 0x%x\r\n", crc_block_data_calculate(multiple_data, 16, INPUT_FORMAT_WORD));
crc_data_register_reset();
while(1)
{
}
}
三、试验效果以及数据验证
CRC在线计算网址,我直接在百度搜索了一个,还是很好用的:http://www.ip33.com/crc.html
这个网址提供了两种CRC32的校验方式,一种是CRC32,一种是CRC32 /MPEG-2,也就是GD32L233C使用的方式,这两种方式主要是在结果异或值上存在区别,一个是0xFFFFFFFF,一个是0x00000000。
我们可以用这个网址计算0x12345678的值(多个值得校验不能用这个网址提供的计算器来验证),如下:
测试结果如下,单值计算结果和上述一致:
|