0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

第十八章 浅谈循环冗余校验(CRC)计算单元

W55MH32 ? 来源:W55MH32 ? 作者:W55MH32 ? 2025-05-29 11:00 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

单芯片解决方案,开启全新体验——W55MH32 高性能以太网单片机

W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm? Cortex-M3核心,其主频最高可达216MHz;配备1024KB FLASH与96KB SRAM,满足存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,拥有独立的32KB以太网收发缓存,可供8个独立硬件socket使用。如此配置,真正实现了All-in-One解决方案,为开发者提供极大便利。

在封装规格上,W55MH32 提供了两种选择:QFN68和QFN100。

W55MH32Q采用QFN68封装版本,尺寸为8x8mm,它拥有36个GPIO、3个ADC、12通道DMA、17个定时器、2个I2C、3个串口、2个SPI接口(其中1个带I2S接口复用)、1个CAN以及1个USB2.0。在保持与同系列其他版本一致的核心性能基础上,仅减少了部分GPIO以及SDIO接口,其他参数保持一致,性价比优势显著,尤其适合网关模组等对空间布局要求较高的场景。紧凑的尺寸和精简化外设配置,使其能够在有限空间内实现高效的网络连接与数据交互,成为物联网网关、边缘计算节点等紧凑型设备的理想选择。 同系列还有QFN100封装的W55MH32L版本,该版本拥有更丰富的外设资源,适用于需要多接口扩展的复杂工控场景,软件使用方法一致。更多信息和资料请进入http://www.w5500.com/网站或者私信获取。

此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及MQTT SSL等,为网络通信安全再添保障。

为助力开发者快速上手与深入开发,基于W55MH32Q这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。

若您想获取芯片和开发板的更多详细信息,包括产品特性、技术参数以及价格等,欢迎访问官方网页:http://www.w5500.com/,我们期待与您共同探索W55MH32的无限可能。

wKgZO2gbOfaAVPzkACJSygzv-rI600.png

第十八章 CRC

1 CRC简介

循环冗余校验(CRC)计算单元是根据固定的生成多项式得到任一 172 位全字的 CRC 计算结果。在其他的应用中,CRC 技术主要应用于核实数据传输或者数据存储的正确性和完整性。标准EN/IEC60335-1 即提供了一种核实闪存存储器完整性的方法。CRC 计算单元可以在程序运行时计算出软件的标识,之后与在连接时生成的参考标识比较,然后存放在指定的存储器空间。

2 CRC主要特性

?使用 CRC-32(以太网)多项式:0x4C11DB7

······X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X4+X2+X+1

?一个 32 位数据寄存器用于输入/输出

?CRC 计算时间:4 个 AHB 时钟周期(HCLK)

?通用 8 位寄存器(可用于存放临时数据)

下图为 CRC 计算单元框图:

wKgZPGg3zIOAK543AAEVxofr4Qg894.png

CRC 计算单元框图

3 CRC功能描述

CRC 计算单元含有 1 个 32 位数据寄存器:

?对该寄存器进行写操作时,作为输入寄存器,可以输入要进行 CRC 计算的新数据。

?对该寄存器进行读操作时,返回上一次 CRC 计算的结果。

每一次写入数据寄存器,其计算结果是前一次 CRC 计算结果和新计算结果的组合(对整个 32 位字进行 CRC 计算,而不是逐字节地计算)。

在 CRC 计算期间会暂停 CPU 的写操作,因此可以对寄存器 CRC_DR 进行背靠背写入或者连续地写-读操作。可以通过设置寄存器 CRC_CR 的 RESET 位来重置寄存器 CRC_DR 为0xFFFF FFFF。该操作不影响寄存器 CRC_IDR 内的数据。

4 CRC寄存器CRC 计算单元包括 2 个数据寄存器和 1 个控制寄存器

4.1 数据寄存器(CRC_DR)

地址偏移:0x00

复位值:0xFFFF FFFF

wKgZPGg3zIKAdzRzAACmKhJ9G_g670.png

4.2 独立数据寄存器(CRC_IDR)

地址偏移:0x04

复位值:0x0000 0000

wKgZO2g3zIKAf25hAACo9-0NB3w911.png

4.3 控制寄存器(CRC_CR)

地址偏移:0x08

复位值:0x0000 0000

wKgZO2g3zIKATUJKAACo9-0NB3w732.png

4.4 CRC 寄存器映像

下表列出了 CRC 的寄存器映像和复位值:

CRC 计算单元寄存器映像和复位值

5 例程设计

5.1 CRC_DifferentCrcMode例程

1.宏定义与结构体:定义了不同 CRC 模式的预期结果,创建了CRC_ResultInfo结构体用于存储 CRC 模式名称和预期结果,同时定义了待计算 CRC 的数据缓冲区Buff。

2.UART 模块:UART_Configuration函数:使能 USART1 和 GPIOA 时钟,配置 GPIO 引脚,初始化 USART 参数(波特率、数据位、停止位等),最后使能 USART1。

?重定向printf函数:通过SER_PutChar和fputc函数将printf输出重定向到 USART1,方便输出调试信息。

3.CRC 测试模块:CRC_DifferentModeTest函数:遍历不同的 CRC 模式,对Buff缓冲区的数据进行 CRC 计算。每次计算前重置 CRC 数据寄存器,将计算结果与预期结果比较,若一致则输出 “Right”,不一致则输出 “Error” 并显示预期结果。

// CRC多模式测试函数
void CRC_DifferentModeTest(void)
{
    uint32_t crcresult = 0; // 存储实际计算结果
    uint8_t  i;

    // 遍历所有CRC测试用例
    for (i = 0; i < sizeof(CRCResult) / sizeof(CRC_ResultInfo); i++)
    {
        CRC_ResetDR(); // 重置CRC数据寄存器(清除之前的计算结果)

        // 计算CRC值(参数:CRC模式、数据缓冲区、数据长度(字计数))
        crcresult = CRC_CalcBlockCRC(CRC_16_IBM + i, Buff, sizeof(Buff) / 4);

        // 比较实际结果与预期结果
        if (CRCResult[i].CRCResultData == crcresult)
        {
            printf("%s Right.n", CRCResult[i].Str); // 输出测试通过信息
        }
        else
        {
            // 输出测试失败信息及预期结果
            printf("%s Error.n", CRCResult[i].Str);
            printf("%s Error Result is 0x%xn", CRCResult[i].Str, CRCResult[i].CRCResultData);
        }
    }
}

4.主函数模块:使能 CRC 时钟,初始化延时函数和 UART。

int main(void)
{
    RCC_ClocksTypeDef clocks; // 系统时钟结构体

    // 1. 使能CRC时钟(AHB总线)
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);

    // 2. 基础初始化:延时函数、串口
    delay_init();
    UART_Configuration(115200);

    // 3. 获取并打印系统时钟信息
    RCC_GetClocksFreq(&clocks);
    printf("nSYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhzn",
           (float)clocks.SYSCLK_Frequency / 1000000,
           (float)clocks.HCLK_Frequency / 1000000,
           (float)clocks.PCLK1_Frequency / 1000000,
           (float)clocks.PCLK2_Frequency / 1000000,
           (float)clocks.ADCCLK_Frequency / 1000000);

    // 4. 打印测试提示
    printf("CRC Different Mode Test.n");

    // 5. 执行CRC测试
    CRC_DifferentModeTest();

    // 6. 主循环(保持程序运行)
    while (1);
}

?获取并输出系统时钟频率信息。

?输出测试提示信息。

?调用CRC_DifferentModeTest函数进行 CRC 测试。

?进入无限循环,保持程序运行。

6 下载验证

6.1 CRC_DifferentCrcMode例程

程序启动阶段

?串口输出系统时钟信息:程序启动后,会通过串口输出系统时钟的相关频率信息,包括 SYSCLK、HCLK、PCLK1、PCLK2 和 ADCCLK 的频率,帮助确认系统时钟配置是否正确。

?显示测试提示信息:紧接着输出测试提示信息,表明开始进行不同模式的 CRC 测试。

CRC 测试阶段

?遍历不同 CRC 模式进行测试:程序会依次对多种 CRC 模式(如 CRC_16_IBM、CRC_16_MAXIM 等)进行测试。

?输出测试结果:对于每种 CRC 模式,会计算给定数据(Buff数组)的 CRC 值,并将其与预设的预期结果进行比较。

······计算结果正确:若计算得到的 CRC 值与预期结果一致,串口会输出相应模式的测试结果为 “Right”。

······计算结果错误:若计算得到的 CRC 值与预期结果不一致,串口会输出相应模式的测试结果为 “Error”,并显示该模式下的预期结果。

程序持续运行

进入无限循环:完成所有 CRC 模式的测试后,程序会进入无限循环,保持运行状态。

wKgZO2g3zIOALurWAALJo7Y_cW8469.png

WIZnet 是一家无晶圆厂半导体公司,成立于 1998 年。产品包括互联网处理器 iMCU?,它采用 TOE(TCP/IP 卸载引擎)技术,基于独特的专利全硬连线 TCP/IP。iMCU? 面向各种应用中的嵌入式互联网设备。

WIZnet 在全球拥有 70 多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。

香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • crc
    crc
    +关注

    关注

    0

    文章

    204

    浏览量

    30170
  • 循环冗余校验

    关注

    0

    文章

    8

    浏览量

    6683
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    labview DAQ----MODBUS CRC16循环冗余校验

    说明:CRC循环冗余错误校验计算方法 CRC—16(循环
    发表于 11-07 10:46

    PSoC 4 循环冗余校验 (CRC)

    循环冗余校验 (CRC) 组件的默认用途是根据任意长度的串行比特流计算 CRC。在数据时钟的上升
    发表于 07-04 11:30

    CRC循环冗余校验的算法

    想问下51单片机和所有嵌入式中一个很基本也很常见的问题,CRC循环冗余校验的算法中生成多项式为什么要那样取(有个生成多项式的表格),如果信息段中一位或多位传输错误,
    发表于 01-21 21:02

    循环冗余校验CRC)算法入门引导

    循环冗余校验CRC)算法入门引导
    发表于 08-17 12:40

    如何利用循环冗余校验CRC计算单元进行传输数据的校验

    循环冗余校验CRC计算单元是什么?如何利用循环
    发表于 12-15 06:04

    循环冗余校验码---CRC

    循环冗余校验码---CRC码   二进制信息位串沿一条信号线逐位在部件之间或计算机之间传送称为串行传送。
    发表于 10-13 16:52 ?7316次阅读
    <b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>码---<b class='flag-5'>CRC</b>码

    STM32L4循环冗余校验模块(CRC)介绍

    STM32L4循环冗余校验模块(CRC)介绍 有兴趣的可以参考下
    发表于 12-25 10:38 ?27次下载

    循环冗余校验奇偶校验累加和校验等知识分享

    CRC校验循环冗余校验)是数据通讯中最常采用的校验方式。在嵌入式软件开发中,经常要用到
    的头像 发表于 11-08 09:31 ?9105次阅读
    <b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>奇偶<b class='flag-5'>校验</b>累加和<b class='flag-5'>校验</b>等知识分享

    crc循环冗余校验码算法

     循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散
    发表于 12-04 10:11 ?2.4w次阅读
    <b class='flag-5'>crc</b><b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>码算法

    PIC24F系列参考手册之可编程循环冗余校验CRC

    本文主要介绍了PIC24F系列参考手册之可编程循环冗余校验CRC)。
    发表于 06-25 03:20 ?0次下载
    PIC24F系列参考手册之可编程<b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>(<b class='flag-5'>CRC</b>)

    CRC校验 、STM32中CRC计算单元CRC应用

    CRC校验、STM32中CRC计算单元CRC应用
    的头像 发表于 03-04 13:54 ?6826次阅读

    Verilog数字系统基础设计中的循环冗余校验

    CRC循环冗余校验CRC介绍 临时“插播”,后面有实例。 CRC(Cyclic Redun
    的头像 发表于 08-17 17:08 ?7141次阅读

    CRC循环冗余校验简介

    CRC 是Cyclic Redundancy Check的缩写,循环冗余校验,用于校验数据传输的完整性。一般情况下在数据发送前
    的头像 发表于 04-24 13:04 ?8494次阅读
    <b class='flag-5'>CRC</b><b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>简介

    32位可编程循环冗余校验(CRC)

    电子发烧友网站提供《32位可编程循环冗余校验(CRC).pdf》资料免费下载
    发表于 09-25 11:22 ?0次下载
    32位可编程<b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>(<b class='flag-5'>CRC</b>)

    CRC循环冗余校验)应用举例

    CRC循环冗余校验)应用举例
    的头像 发表于 05-16 16:12 ?1984次阅读