[APM32F1] 极海APM32F103系列CRC32外设实验

[复制链接]
 楼主| jobszheng 发表于 2025-6-10 10:44 | 显示全部楼层 |阅读模式
极海APM32F103系列CRC32外设实验
在传输数据存储数据时,均需对数据的完整性进行校验。试想一下,保存着你的工资数值的flash存储块恰巧坏了一下——归零了!那你这一个月岂不是白忙活了!又比如传输一帧数据的长度,在出现干扰后,长度变成了0xFFFFFFFF, 那咱们这一帧数据要接收到猴年马月去呀!
在学习CRC32外设时,极海的datasheet里面介绍相对较少,其实也是因为CRC32是一个公共基础知识,理应自己学习,但在B站上面,极海的技术微课介绍就非常全面了。
CRC32是32位循环冗余校验算法,它能基于数学原理验证数据是否完整,为我们数据可靠传输、安全传输提供保证。CRC32有许多算法,主要针对不同的应用场景。今天讨论CRC32的算法,是极海工业级MCU内置的CRC32硬件模块所采用的CRC32-MPEG2算法。
极海CRC实验01.png
根据视频讲解可知,CRC32-MPEG2的参数如下:
  • 多项式:0x04C11DB7
  • 初始值:0xFFFFFFFF
  • 输入反转:false
  • 输出反转:false
  • 结果异或:0x00000000

接下来,我们根据课堂的讲解做一个小实验,看看硬件CRC32计算模块如何计算的?我是基于极海APM32F103系列MCU,使用Keil编译环境,源代码如下:
  1. const uint32_t calc_data[16] = {
  2.     0x01020304, 0x05060708, 0x090a0b0c, 0x0d0e0f00,
  3.     0x01020304, 0x05060708, 0x090a0b0c, 0x0d0e0f00,
  4.     0x01020304, 0x05060708, 0x090a0b0c, 0x0d0e0f00,
  5.     0x01020304, 0x05060708, 0x090a0b0c, 0x0d0e0f00};

  6. int main(void)
  7. {
  8.     uint32_t i;
  9.     uint32_t ret = 0;
  10.     uint8_t *ptr;
  11.     hal_sysclock_set();

  12.     SysTick_Config(SystemCoreClock / 1000);

  13.     hal_board_init();

  14.     time_base_tick = 1000;

  15.     ptr = (uint8_t *)calc_data;

  16.     CRC_ResetDATA();
  17.     for (i = 0; i < 16; i++)
  18.     {
  19.         ptr = (uint8_t *)&calc_data[i];
  20.         ret = sprintf(log_buf, "%02X %02X %02X %02X ", ptr[0], ptr[1], ptr[2], ptr[3]);
  21.         log_buf[ret] = 0;
  22.         log_printf(log_buf);

  23.         ret = CRC_CalculateCRC(calc_data[i]);
  24.     }

  25.     ret = sprintf(log_buf, "\r\nCRC32 result = 0x%08X\r\n", ret);
  26.     log_buf[ret] = 0;
  27.     log_printf(log_buf);

  28.     while (1)
  29.     {
  30.         if (time_base_tick == 0)
  31.         {
  32.             time_base_tick = 1000;
  33.             log_printf(hello_str);
  34.             led_toggle();
  35.         }
  36.     }
  37. }
通过串口输出结果如下:
极海CRC实验02.png
通过上面的代码可以得出,利用极海APM32F103的CRC32外设计算校验值,代码长度超级短,而且硬件运行效益也高——仅需要4个AHB的时钟周期。
极海B站的APM32技术微课内容满满,干货满满。附上本次学习的B站链接:
【【APM32技术微课 | 第23讲】APM32的CRC应用分享】 https://www.bilibili.com/video/BV1hvxFegE7h/?share_source=copy_web&vd_source=65d181aad673c4302ac1a268837e19e2
@Gfan 参加活动


阳光爆裂 发表于 2025-6-11 11:07 | 显示全部楼层
楼主的 CRC32的校验大小端是不是搞错了?
 楼主| jobszheng 发表于 2025-6-12 09:49 | 显示全部楼层
阳光爆裂 发表于 2025-6-11 11:07
楼主的 CRC32的校验大小端是不是搞错了?

CRC32的硬件数据使用大端,匹配网络数据传输的规范
心跳回响 发表于 2025-6-12 20:02 | 显示全部楼层
我去验证了一下。
切换为大端模式后,就是这样的。
CRC32验证.png

海洋凝视 发表于 2025-6-12 21:03 | 显示全部楼层
楼主,这个CRC32输出值是大端,还是小端的数值?
 楼主| jobszheng 发表于 2025-6-13 10:15 | 显示全部楼层
确实有上面两位说的疑问啊
幻影书记 发表于 2025-6-18 15:53 | 显示全部楼层
也就是说,我们硬件CRC32是不支持按字节写入。要使用CRC32,一定是4字节对齐的方式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:热爱开源,乐于分享。在嵌入式技术领域里面,主攻通讯协议,Modbus,TCP/IP以及虚拟化和RTOS

30

主题

740

帖子

23

粉丝
快速回复 在线客服 返回列表 返回顶部