490|0

190

帖子

0

资源

一粒金砂(中级)

【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)

2.png

 

二、代码实现

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的值(多个值得校验不能用这个网址提供的计算器来验证),如下:

4.png

 

测试结果如下,单值计算结果和上述一致:

3.png

 

 

 

 

 

 

此帖出自GD32 MCU论坛

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    关闭
    站长推荐上一条 1/7 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表