YTM32的循环冗余校验CRC外设模块详解

本文详细介绍了YTM32微控制器中的CRC外设模块,包括CRC算法原理、硬件实现、软件应用示例,以及如何配置以支持CRC16和CRC32等不同算式。

YTM32的循环冗余校验CRC外设模块详解

引言

在串行通信帧中,为了保证数据在传输过程中的完整性,通常采用一种指定的算法对原始数据进行计算,得出的一个校验值。接收方接收到数据时,采用同样的校验算法对原始数据进行计算,若计算结果和接收到的校验值一致,说明数据校验正确,该帧数据可用,若不一致,说明传输过程中出现了差错,丢弃该帧数据,请求重发。常用的校验算法有奇偶校验、校验和、CRC,还有LRC、BCC等不常用的校验算法。

在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验,其特点是:检错能力强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。

YTM32B1ME微控制器中提供了硬件的CRC计算引擎,用以加速和简化用户程序中的CRC运算。值得注意的是,YTM32B1ME微控制器中还集成了SENT通信外设,SENT通信协议中也用到了CRC校验。可以想见,在具体应用中,CRC外设可以配合SENT外设,或者其他在协议中使用CRC校验算法的通信过程提供硬件计算引擎的支持。

YTM32的硬件CRC外设模块,用户通过AHB总线向CRC外设送数参与计算,然后通过AHB总线送出实时的计算结果。CRC外设内部实现了CRC4(CRC-ITU)、CRC16(CRC-CCITT)、CRC32(CRC-ethernet)等多项算式的计算引擎,并可配置输出和输出数据的位交换,通过8b、16b、32b等带宽方式,向CRC计算引擎送数。如图x所示。

在这里插入图片描述

图x CRC外设系统框图

原理与机制

CRC算法简介

CRC的全称是循环冗余校验(Cyclic Redundancy Check),其目的是保证数据的完整性,具体应用方法,是在发送数据的后面再补充若干位的数据,使得接收方使用同样的CRC计算方法,检查接收到的数据的CRC计算结果是否为0,从而判定接收数据的完整性。

CRC的核心算法,就是通过一串“发送数据”,来计算“需要补充的若干数据”。CRC的计算过程是用除法求余数。不同于十进制的除法运算,CRC用的是2进制的除法运算,2进制的除法运算,属于模2运算,模2运算的特点是:没有进位

  • 模2加法:0+0=0,0+1=1,1+0=1,1+1=0。
  • 模2减法:0-0=0,0-1=1,1-0=1,1-1=0。模2加减法实际上就是异或操作,这也是CRC很容易在实际中应用的数学基础。
  • 模2乘法:0x0=0,0x1=0,1x0=0,1x1=1。
  • 模2除法:是模2乘法的逆运算,参见下图示例。

在这里插入图片描述

图x 模2除法

通过除法算式可以形象地想见,当将一串输入数据,再在右侧补入N个空位,作为被除数,除以CRC多项式所表示的N位除数时,若不能除尽,则在除法竖式的最后一个环节,在最右边产生一个同补入空位同位宽的余数,那这个余数就是CRC的计算结果。此处用一个例子说明CRC的计算过程。如图x所示。
在这里插入图片描述

图x CRC8计算用例

在这个算例中:

  • CRC8的多项式是x8+x2+x+1,对应的除数就是二进制数100000111
  • 被除数是0x1C,转化成二进制就是00011100
  • CRC8为8位,被除数后面补8个0,也同时对应CRC计算的结果也是8位
  • 最后的计算结果是0x54

在CRC解算时,若将CRC计算的结果换入补充的空位,在进行CRC计算,相当于是将之前CRC计算的余数同自己相加,根据CRC计算的加法中0+0=11+1=0的规则,刚好可以得到0的计算结果,从而验证数据在传输过程的完整性。

使用在线的计算器(http://www.ip33.com/crc.html),也能算得同样的结果。如图x所示。

在这里插入图片描述

图x 使用在线CRC计算器

细心的读者可能看到了,这里面还有初始值结果异或值输入数据反转输出数据反转,这些名词都是指什么呢?

  • 初始值,是给CRC计算前提供一个初始值(Offset,预计算值),大部分情况下设定为0,也可以根据选定的特定算法指定其他值,有时也被称为CRC计算的种子(Seed)。结果异或值,是把计算结果再异或某一个值。使用初始值和结果异或值,的目的是防止在某个计算环节中,算得全0的中间结果,导致后续的CRC余数一直为0。
  • 输入数据反转,是指输入数据以字节为单位按位逆序处理;输出数据反转,是指CRC计算结果整体按位逆序处理;这么做的目的(一个合理的解释)是右移比左移更容易计算,效率高,它跟大小端无关。

特别注意,最基本的计算过程大多不需要额外设定这些参数(配置成false或者0即可),但有些面向典型应用的场景,会对应一些特别配置组合(典型配置),产生了不同的算法。如图x所示。

在这里插入图片描述

图x 多种不同的CRC计算配置

从CRC算法到C

<think>好的,我需要帮助用户了解如何在YTM32B1MD1单片机中通过寄存器配置外设时钟。首先,我应该查阅YTM32B1MD1的数据手册或参考手册,找到关于时钟系统的部分。通常,时钟配置涉及系统时钟源选择、分频器设置以及外设时钟使能这几个主要步骤。 用户可能对寄存器配置不太熟悉,所以需要分步骤讲解。首先,确定时钟源,比如内部RC振荡器或外部晶振。然后配置分频器,确定外设时钟频率。接下来,找到对应外设的时钟使能寄存器,开启特定外设的时钟。 需要注意的是,直接操作寄存器时,必须确保地址正确,并且按位操作来设置或清除相应的位,避免影响其他配置。可能还需要考虑时钟门控和低功耗模式的相关设置。此外,不同外设可能有不同的时钟要求,例如USART需要精确的波特率时钟,而定时器可能需要更高的频率。 用户可能遇到的问题包括寄存器地址错误、未正确使能时钟导致外设无法工作,或者时钟频率配置不当导致外设功能异常。因此,在教程中应强调仔细检查寄存器地址,使用位掩码操作,并通过调试工具验证时钟配置是否生效。 最后,生成相关问题时,要考虑用户可能进一步想知道如何验证时钟配置、不同外设的具体配置方法,以及常见错误排查步骤。这有助于用户全面理解和应用所学内容。</think>### YTM32B1MD1单片机外设时钟配置教程 在YTM32B1MD1单片机中,外设时钟的配置主要通过对时钟控制寄存器(如`RCU_APB1EN`、`RCU_APB2EN`等)的操作实现。以下是具体步骤: #### 1. **查看时钟树结构** 首先需在数据手册中确认目标外设挂载的总线类型(APB1/APB2/AHB)。例如: - USART1属于APB2总线 - SPI1属于APB1总线[^1] #### 2. **使能外设时钟** 通过设置对应总线使能寄存器的位域,例如开启GPIOA时钟: ```c // APB2外设时钟使能寄存器地址:0x40021018 *(volatile uint32_t*)0x40021018 |= (1 << 2); // 开启GPIOA时钟 ``` #### 3. **配置时钟分频(可选)** 若需调整总线频率,需设置分频寄存器: ```c // APB1分频寄存器地址:0x4002101C *(volatile uint32_t*)0x4002101C &= ~(0x07 << 8); // 清除原有分频 *(volatile uint32_t*)0x4002101C |= (0x03 << 8); // 设置4分频 ``` #### 4. **验证配置** 可通过读取寄存器值或测量实际时钟信号验证配置是否生效。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值