X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
国产芯片交流
[MCU] 【AT-START-F425测评】No.04 CRC
韵湖葱白
2022-4-22 20:02
楼主
## 前言 AT32F425支持硬件CRC(CRC32)。 跟GD32F450和STM32F4**相比,它有如下的特点: - 支持初始值自定义。 - 支持输入数据按8,16,32位反转。 - 支持输出数据反转。 这几个特点等价于它可以在有限的范围内自定义CRC了。 下图是之前文章中描述的0x34和0x00000034的CRC码计算过程,供想学习的同学一个参考。 ![0x34和0x00000034的CRC32计算过程](https://s2.loli.net/2022/04/22/jJHZ4RI2EQSz6FY.jpg) 我曾经写过一篇解释CRC的文章,可以围观一把:[史上解释CRC最清楚的文章](https://mp.weixin.qq.com/s/DbAdErPmk6dv_nS_w6-ASQ) 在线CRC网址:[在线CRC](http://www.ip33.com/crc.html) --- AT32F425的CRC是CRC32。 - 对应的标准是:CRC32/MPEG-2 - 多项式是:x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1,即:0x04C11DB7 - =初始值是:0xFFFFFFFF - =输入数据反转:false - =输出数据反转:false - 结果异或值是:0x00000000 上面标等号的是可自定义的部分。 ## 代码 接口如下: ``` uint32_t crc_one_word_calculate(uint32_t data); uint32_t crc_block_calculate(uint32_t *pbuffer, uint32_t length); ``` 需要注意的是: **每次计算完crc后需要调用`crc_data_reset`复位寄存器,否则它会把上一次的值作为初始值。** 测试过程比较简单: ``` static void crc_test(void) { #ifdef CRC_TEST uint32_t data = 0xabcd1234; #if defined(GD32) || defined(STM32) uint32_t crc_data = crc_single_data_calculate(data); crc_data_register_reset(); #endif #if defined(GD32M0) uint32_t crc_data[3]; crc_data[0] = crc_single_data_calculate(data, INPUT_FORMAT_WORD); crc_data_register_reset(); crc_data[1] = crc_single_data_calculate(data, INPUT_FORMAT_HALFWORD); crc_data_register_reset(); crc_data[2] = crc_single_data_calculate(data, INPUT_FORMAT_BYTE); crc_data_register_reset(); #endif #if defined(AT32) // crc_reverse_output_data_set(CRC_REVERSE_OUTPUT_DATA); // crc_reverse_input_data_set(CRC_REVERSE_INPUT_BY_BYTE); // crc_init_data_set(0); uint32_t crc_data = crc_one_word_calculate(data); crc_data_reset(); #endif #if defined(STM32) printf("STM32: crc32 of 0x%X = 0x%X\r\n", data, crc_data); #endif #if defined(GD32) printf("GD32: crc32 of 0x%X = 0x%X\r\n", data, crc_data); #endif #if defined(GD32M0) printf("GD32: crc32 of 0x%X = [32]0x%X [16]0x%X [8]0x%X\r\n", data, crc_data[0], crc_data[1], crc_data[2]); #endif #if defined(AT32) printf("AT32: crc32 of 0x%X = 0x%X\r\n", data, crc_data); #endif #endif } ``` 不同情况下CRC的计算结果(输入值0xABCD1234): 配置 | CRC ---|--- CRC-MPEG2(默认) | 0xF7018A40 输入数据(BYTE)反转 | 0x49FC6721 输出数据反转 | 0x25180EF 初始值0x00000000 | 0x3005573B 初始值0xF0F0F0F0 | 0x9C6F4F19 ## 测试结果 1秒打印一次。 ![CRC测试结果](https://s2.loli.net/2022/04/22/Hhyv7gVxF9PuAKU.gif) ![](https://s2.loli.net/2022/03/28/xnJPMjvEfwHs1IS.gif)
点赞
回复评论 (1)
沙发
Jacktang
这个CRC(循环冗余校验)在线计算比较方便,怎么发现的,不错
点赞
2022-4-24 07:31
最新活动
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
PI 电源小课堂|无 DC-DC 变换实现多路高精度输出反激电源
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
随便看看
防水鞋套
咨询LT6100运放的电压范围问题
我的STM32两轮平衡车
FPAG初学者,找不出问题
镜面旋转LED屏(含C源码、原理图全部资料)
单片机外围电路之二《电容》
pxa270-s自定wince内核为何不识别activesync和usb鼠标?
使用袋鼠芯做遥控小车 无线芯片NRF24L01
有时LDO和DC/DC如何抉择?
89美金FPGA开发板试用风暴来袭
(转贴)国标字库的使用
LED的应用优势及存在问题解答
最近问题比较多,各位别介意。TTL-RS232
while ((IFG1 & UTXIFG0)==0); 停止怎么解决?
顶层模块例化一个好风格
应用技巧/单片机复位电路的可靠性分析
急求MSP430不同IO口并行输出问题
编程实例分享:msp430 Low Power Module
vs2005开发环境,C#语言开发的pda程序怎么不能操作sqlce2.0数据库怎么办
各位大虾:请教滤波器在对含突变点信号滤波的问题
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复