[APM32F4] 奇偶校验算法实现一则

[复制链接]
35|1
风暴之眸 发表于 2025-10-11 18:44 | 显示全部楼层 |阅读模式
, ui, T3, DA, AMP, or
奇偶校验算法(Parity Check Algorithm)是一种简单的错误检测方法,用于验证数据传输中是否发生了位错误。通过在数据中添加一个附加的奇偶位(即校验位),来实现错误的检测和纠正。

在奇偶校验算法中,假设每个字节由8个比特(位)组成。奇偶校验位的值取决于数据字节中的1的个数。如果数据字节中1的个数是偶数个,奇偶校验位被设置为0;如果1的个数是奇数个,奇偶校验位被设置为1。这样,在接收端,通过统计接收到的数据字节中1的个数,就可以检测出位错误。

奇偶校验01.png
原理比较简单,我们再来看看在MCU中如何实现?
我们设计以下应用场景,使用偶校验来验证保存在内存中一个word长度的数值,其最高为偶校验位,剩余31bit为有效位为例。C代码如下:

  1. /**
  2. * @brief:  even check for uint32_t
  3. *
  4. * @param:
  5. * @return: 0= pass; 1= failed;
  6. * @note:
  7. */
  8. int even_check(uint32_t dat)
  9. {
  10.     uint8_t i;
  11.     uint8_t cnt = 0;
  12.     for (i = 0; i < 32; i++)
  13.     {
  14.         if ((dat & 0x01) == 0x01)
  15.         {
  16.             cnt++;
  17.         }
  18.         dat = dat >> 1;
  19.     }
  20.     return (cnt & 0x01);
  21. }

  22. void even_ck_gen(uint32_t *buf)
  23. {
  24.     uint8_t i;
  25.     uint8_t cnt = 0;
  26.     uint32_t dat;
  27.     *buf &= ~(0x80000000);
  28.     dat = *buf;
  29.     printf("dat = 0x%08X\r\n", dat);
  30.     for (i = 0; i < 31; i++)
  31.     {
  32.         if ((dat & 0x01) == 0x01)
  33.         {
  34.             cnt++;
  35.             printf("cnt = %d, dat= %08X\r\n", cnt, dat);
  36.         }
  37.         dat = dat >> 1;
  38.     }
  39.     if ((cnt & 0x01) == 0x01)
  40.     {
  41.         *buf |= 0x80000000;
  42.     }
  43. }
在没有ECC这样外置校验位的情况下,通过bit32来代表奇偶校验位,虽然舍弃了一位,但可以实现数据的自校验,带来一定的可靠性。在数据量不需要32bit长度时,可以采用此方法。



阳光爆裂 发表于 2025-10-12 09:28 | 显示全部楼层
楼主 这是自己做了一个ECC校验位吗?!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

42

帖子

0

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