这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 极海APM32F103系列CRC32外设实验

共1条 1/1 1 跳转至

极海APM32F103系列CRC32外设实验

院士
2025-06-20 10:41:17     打赏

在传输数据存储数据时,均需对数据的完整性进行校验。试想一下,保存着你的工资数值的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编译环境,源代码如下:

const uint32_t calc_data[16] = {
    0x01020304, 0x05060708, 0x090a0b0c, 0x0d0e0f00,
    0x01020304, 0x05060708, 0x090a0b0c, 0x0d0e0f00,
    0x01020304, 0x05060708, 0x090a0b0c, 0x0d0e0f00,
    0x01020304, 0x05060708, 0x090a0b0c, 0x0d0e0f00};

int main(void)
{
    uint32_t i;
    uint32_t ret = 0;
    uint8_t *ptr;
    hal_sysclock_set();

    SysTick_Config(SystemCoreClock / 1000);

    hal_board_init();

    time_base_tick = 1000;

    ptr = (uint8_t *)calc_data;

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

        ret = CRC_CalculateCRC(calc_data[i]);
    }

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

    while (1)
    {
        if (time_base_tick == 0)
        {
            time_base_tick = 1000;
            log_printf(hello_str);
            led_toggle();
        }
    }
}

通过串口输出结果如下:

极海CRC实验02.png





关键词: APM32F103     CRC32    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]