NOTE数据校验

  1. 奇偶校验码

  2. 海明校验码

  3. 循环冗余校验码

奇偶校验码

奇偶校验码是奇校验码和偶校验码的统称,是一种 「检错码」,用于检查二进制数据的 「位错」

奇偶校验码分为奇校验码偶校验码两种方法。

奇校验:1的个数为奇数

偶校验:1的个数为偶数

一、奇校验码

奇校验码在数据发送前,「检查」1的个数,「奇数」个1就在头部填充0,「偶数」个1就在头部填充1,使数据整体保持奇数个1;

接收数据时,重新检查1的个数:

    ​ 「奇数」个则判定数据正常,去掉头部的填充符;
    ​ 「偶数」个则判定数据出错,重新发送数据帧。

二、偶校验码

偶校验码在数据发送前,也会「检查」1的个数,「偶数」个1就在头部填充0,「奇数」个1就在头部填充1,使数据整体保持偶数个1;

接收数据时,重新检查1的个数:

    ​「偶数」个1则判定数据正常,去掉头部的填充符; ​
    「奇数」个1则判定数据异常,重新发送数据帧。

三、执行流程

例:求7位信息码1100111的奇校验码和偶校验码(设校验位在最低位)。
• (1) 1100111的奇校验码
• 因为1100111中“1”的个数为奇,所以奇校验位P=0,
• 1100111的奇校验码为11001110。
• (2) 1100111的偶校验码
• 因为1100111中“1”的个数为奇,所以偶校验位P=1,
• 1100111的偶校验码为11001111。

四、缺点

以奇校验码为例

发送前的数据是: 1110
只有1个位发生错误,比如第一位的1变成了0:0110 ,这时候1的个数是偶数,可以检查出错误。
但是,当两个位同时发生错误时,比如第一位、第二位的1都变成了0:0010 ,这时候1的个数仍然是奇数,奇校验码默认数据正常,从而导致检错失败。

所以奇偶校验码只能发现奇数位个错误,而无法发现偶数位个错误,而且即使
发现奇数位个错误也无法确定出错的位置,因而无法自动纠正错误。

由于现代计算机可靠性比较高,出错概率很低,而出错中只有一位出错的
概率最高,因此用奇偶校验检测一位出错,能够满足一般可靠性要求。在
CPU与主存的信息传送过程中,奇偶校验被广泛应用。

海明校验码

实质:在奇偶校验的基础上,增加校验位的位数,构成多组奇偶校验,以便
发现错误并自动纠正错误。

原则:

  1. 海明码只能检测出2位错,纠1位错。
  2. 海明码默认进行偶校验(除非特殊说明使用奇校验)。
  3. 海明码是一串由0和1组成的序列(除01外没有其他的值)

构成:

例如如下序列:
1100
我们想要让其变成海明码只需如下操作

1.算出校验位数k

正常情况下我们需要如下此操作:

2^k >= k + 数据位数 + 1

这里等于3

2.确定校验位在海明码中的位置

这里按2^k次幂留出来,就像1,2,4,8,16,32。

 

3.分组

我们需要确认H1,H2,H4这三个校验位都来校验哪些位置。
我们按这个规则进行分配。

将1,2,4(海明码下标为1,2,4)

的二进制码写出来,并且最高位补到3位(前面算的K数)
如下所示:

将1到7的二进制序列,列出来如下表 

将7->1依次与上面的通配表进行匹配 

 因此可以确定
H1 负责 1 3 5 7 位数的校验
H2 负责 2 3 6 7 位数的校验
H4 负责 4 5 6 7 位数的校验

4.求出校验位是0还是1

因为上面我们得出以下结论:

H1 负责 1 3 5 7 位数的校验
H2 负责 2 3 6 7 位数的校验
H4 负责 4 5 6 7 位数的校验

 CRC校验码

释义:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性

原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。

模2运算
循环冗余校验码是一种基于模2运算建立编码规律的校验码
(1) 模2加减:即按位加,用异或规则实现。

即:0±0=0     0±1=1±0=1     1±1=0


(2) 模2乘:按模2加求部分积之和,不进位。


(3) 模2除:按模2减求部分余数,不借位。若部分余数(首次为被除数)最高位
为1,则上商为1;若部分余数最高位为0,则上商为0。每求一位商应使部分余
数减少一位,即去掉部分余数的最高位,再继续求下一位商。当部分余数的位
数小于除数位数时,该余数就是最后的余数。

 

 CRC校验步骤:
 CRC校验中有两个关键点:

①预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,但是最高位和最低位必须为1

②把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码

具体步骤:

  1. 选择合适的除数(最高位和最低位必须为1
  2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上(这个位数-1)位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略
  3. 将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错

<think>好的,用户问的是关于Keil CRC校验的介绍。首先,我需要明确用户的具体需。Keil是嵌入式开发中常用的IDE,主要用于ARM处理器的开发。CRC校验数据校验的一种常见方法,用于检测数据传输或存储中的错误。用户可能是在开发过程中遇到了需要配置或使用CRC校验的情况,或者想了解如何在Keil环境中实现它。 首先,我应该回顾一下Keil工具链中的CRC支持。Keil MDK-ARM提供了标准库函数,可能包括CRC计算的API。同时,不同的ARM Cortex-M处理器可能有硬件CRC模块,比如STM32系列。需要区分软件实现和硬件加速的实现方式。 接下来,用户可能需要知道如何在Keil中配置和使用CRC。这包括库函数的调用、硬件CRC的初始化步骤,以及生成CRC校验码的具体代示例。此外,应用场景如固件校验、通信数据校验等也是用户关心的部分。 另外,要注意不同芯片的CRC模块可能存在差异,比如多项式、初始值等参数置。需要提醒用户查阅具体芯片的数据手册,确保配置正确。同时,如果用户的问题涉及更复杂的应用,比如自定义多项式,可能需要指导他们如何调整代或使用第三方库。 可能还需要提到Keil的调试工具,如通过调试模式查看CRC计算结果是否正确,或者如何集成CRC校验到项目构建过程中,例如在链接阶段自动计算固件的CRC并附加到二进制文件中。 最后,确保回答结构清晰,分点说明,让用户能够逐步理解并应用CRC校验到他们的项目中。需要验证提供的代示例是否正确,并符合Keil的环境置,避免语法错误或库版本不兼容的问题。</think>### Keil CRC校验详解 #### 1. **CRC校验基础** - **作用**:CRC(循环冗余校验)用于检测数据传输或存储中的错误,通过生成固定长度的校验码验证数据完整性。 - **核心参数**:多项式(Polynomial)、初始值(Initial Value)、输入反转(Input Reverse)、输出反转(Output Reverse)。 #### 2. **Keil中的CRC实现方式** - **软件库计算**: 使用Keil标准库(如STM32 HAL库)中的CRC函数,适合无硬件CRC模块的芯片。 示例代: ```c #include "stm32f1xx_hal.h" uint32_t Calculate_CRC(uint32_t *data, uint32_t len) { uint32_t crc = 0xFFFFFFFF; // 初始值 for (uint32_t i = 0; i < len; i++) { crc ^= data[i]; for (int j = 0; j < 32; j++) { if (crc & 0x80000000) crc = (crc << 1) ^ 0x04C11DB7; // 多项式:CRC-32 else crc <<= 1; } } return crc; } ``` - **硬件加速**(如STM32F4系列): 启用硬件CRC模块,提升计算效率。 配置步骤: 1. 使能CRC时钟:`__HAL_RCC_CRC_CLK_ENABLE()` 2. 计算CRC: ```c uint32_t Calculate_CRC_Hardware(uint32_t *data, uint32_t len) { CRC_HandleTypeDef hcrc; hcrc.Instance = CRC; HAL_CRC_Init(&hcrc); return HAL_CRC_Calculate(&hcrc, data, len); } ``` #### 3. **关键配置参数** - **多项式匹配**:需与接收方一致(如`0x04C11DB7`对应CRC32)。 - **数据格式**: - 字节顺序(Little/Big Endian) - 是否按字节/半字/字操作 #### 4. **调试与验证** - **调试技巧**: - 使用Keil调试模式查看CRC寄存器值。 - 对比在线CRC计算工具(如[Online CRC Calculator](https://crccalc.com/))验证结果。 - **常见错误**: - **多项式错误**:导致校验码不匹配。 - **未复CRC寄存器**:连续计算时需调用`HAL_CRC_DeInit()`重置。 #### 5. **实战应用场景** - **固件完整性校验**: 在程序启动时校验Flash内容: ```c if (Calculate_CRC(firmware_start, firmware_size) != stored_crc) { // 触发错误处理 } ``` - **通信数据校验**(如UART): 发送端附加CRC,接收端重新计算并比对。 #### 6. **高级扩展** - **自定义多项式**: 修改CRC初始化结构体中的生成多项式: ```c hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE; hcrc.Init.GeneratingPolynomial = 0x1021; // 自定义多项式 ``` - **DMA加速**: 对于大数据块,使用DMA传输数据到CRC模块: ```c HAL_CRC_Accumulate_DMA(&hcrc, data, len); ``` #### 7. **参考资源** - **官方文档**: - [Keil MDK-ARM手册](https://www.keil.com/support/man/docs/armcc) - [STM32 CRC应用笔记(AN4187)](https://www.st.com/resource/en/application_note/dm00041872.pdf) 通过上述步骤,可在Keil环境中高效实现CRC校验,保障嵌入式系统的数据可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值