范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

GD32开发实战指南第18章CRC

  开发环境:
  MDK:Keil 5.30
  开发板:GD32F207I-EVAL
  MCU:GD32F207IK18.1 CRC的校验原理
  循环冗余校验(CRC)计算单元是根据固定的生成多项式得到任一32位全字的CRC计算结果。在其他的应用中, CRC技术主要应用于核实数据传输或者数据存储的正确性和完整性。标准EN/IEC 60335-1即提供了一种核实闪存存储器完整性的方法。 CRC计算单元可以在程序运行时计算出软件的标识,之后与在连接时生成的参考标识比较,然后存放在指定的存储器空间。那么首先来看看CRC校验原理。18.1.1基本原理
  CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验。几个基本概念
  1、帧检验序列FCS(Frame Check Sequence):为了进行差错检验而添加的冗余码。
  2、多项式模2运行:实际上是按位异或(Exclusive OR)运算,即相同为0,相异为1,也就是不考虑进位、借位的二进制加减运算。如:10011011 + 11001010 = 01010001。
  3、生成多项式(generator polynomial):当进行CRC检验时,发送方与接收方需要事先约定一个除数,即生成多项式,一般记作G(x)。生成多项式的最高位与最低位必须是1。常用的CRC码的生成多项式有:
  每一个生成多项式都可以与一个代码相对应,如CRC8对应代码:100110001。18.1.2 CRC检验码的计算
  设信息字段为K位,校验字段为R位,则码字长度为N(N=K+R)。设双方事先约定了一个R次多项式g(x),则CRC码:
  V(x)=A(x)g(x)=xRm(x)+r(x)
  其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式。
  这里r(x)对应的代码即为冗余码,加在原信息字段后即形成CRC码。
  r(x)的计算方法为:在K位信息字段的后面添加R个0,再除以g(x)对应的代码序列,得到的余数即为r(x)对应的代码(应为R-1位;若不足,而在高位补0)。
  计算示例:
  设需要发送的信息为M = 1010001101,产生多项式对应的代码为P = 110101,R=5。在M后加5个0,然后对P做模2除法运算,得余数r(x)对应的代码:01110。故实际需要发送的数据是101000110101110。
  18.1.3错误检测
  当接收方收到数据后,用收到的数据对P(事先约定的)进行模2除法,若余数为0,则认为数据传输无差错;若余数不为0,则认为数据传输出现了错误,由于不知道错误发生在什么地方,因而不能进行自动纠正,一般的做法是丢弃接收的数据。
  【注】几点说明:
  1、CRC是一种常用的检错码,并不能用于自动纠错。
  2、只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小很小。
  3、仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受(只是非常近似的认为是无差错的),并不能保证可靠传输。18.2 GD32中的CRC
  所有的GD32芯片都内置了一个硬件的CRC计算模块,可以很方便地应用到需要进行通信的程序中,这个CRC计算模块使用常见的、在以太网中使用的计算多项式:
  写成16进制就是:0x04C11DB7
  使用这个内置CRC模块的方法非常简单,既首先复位CRC模块(设置CRC_CR=0x01),这个操作把CRC计算的余数初始化为0xFFFFFFFF;然后把要计算的数据按每32位分割为一组数据字,并逐个地把这组数据字写入CRC_DR寄存器(既下图中的绿色框),写完所有的数据字后,就可以从CRC_DR寄存器(既下图中的兰色框)读出计算的结果。
  下面是用C语言描述的这个计算模块的算法,大家可以把它放在通信的另一端,对通信的正确性进行验证:DWORD dwPolynomial = 0x04c11db7; DWORD cal_crc(DWORD *ptr, int len) {     DWORD    xbit;     DWORD    data;     DWORD    CRC = 0xFFFFFFFF;    // init     while (len--) {         xbit = 1 << 31;          data = *ptr++;         for (int bits = 0; bits < 32; bits++) {             if (CRC & 0x80000000) {                 CRC <<= 1;                 CRC ^= dwPolynomial;             }             else                 CRC <<= 1;             if (data & xbit)                 CRC ^= dwPolynomial;              xbit >>= 1;         }     }     return CRC; }
  有几点需要说明:
  1)上述算法中变量CRC,在每次循环结束包含了计算的余数,它始终是向左移位(既从最低位向最高位移动),溢出的数据位被丢弃。
  2)输入的数据始终是以32位为单位,如果原始数据少于32位,需要在低位补0,当然也可以高位补0。
  3)假定输入的DWORD数组中每个分量是按小端存储。
  4)输入数据是按照最高位最先计算,最低位最后计算的顺序进行。
  例如:
  如果输入0x44434241,内存中按字节存放的顺序是:0x41, 0x42, 0x43, 0x44。计算的结果是:0xCF534AE1
  如果输入0x41424344,内存中按字节存放的顺序是:0x44, 0x43, 0x42, 0x41。计算的结果是:0xABCF9A6318.3 CRC寄存器描述数据寄存器(CRC_DRTA)
  CRC_DATA用于接收待计算的新数据,直接将其写入即可。刚写入的数据不能被读出来,因为读取该寄存器得到的是上次CRC计算的结果。独立数据寄存器(CRC_FDATA)
  注:此寄存器不参与CRC计算,可以存放任何数据。控制寄存器(CRC_CTL)
  CRC_CTL用来复位CRC_DATA寄存器,设置其值为0xFFFFFFFF,然后该位被硬件自动清零。该位对CRC_FDATA寄存器没有影响。18.4 CRC具体代码实现
  代码很简单。/*     brief      main function     param[in]  none     param[out] none     retval     none */ int main(void) {     //systick init     sysTick_init();      //usart init 115200 8-N-1     com_init(COM1, 115200, 0, 1);      printf("CRC Test  ");      /* Enable CRC clock */     rcu_periph_clock_enable(RCU_CRC);      /* Compute the CRC of "DataBuffer" */     CRCValue = crc_block_data_calculate((uint32_t *)DataBuffer, BUFFER_SIZE);      printf("r 32-bit CRC check code : 0x%X ", CRCValue);      while(1)     {         delay_ms(1000);     } }
  就使用了crc_block_data_calculate()函数,传入一个要计算的数据和大小,就得到了计算的CRC值。18.5实验现象
  将编译好的程序下载到板子中,通过串口助手可以看到如下现象。
  然后使用CRC计算工具来计算。
  可以看到和软件计算的一致。
  值得注意的是,STM32的硬件CRC的结果异或值是0x00000000。
  【注】关于CRC的更多内容可以自行查阅相关资料,笔者这里推荐一篇文章`A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS`,感兴趣的朋友自己去看看吧。

案件故事20只金戒露马脚引子1998年11月5日凌晨,上海虹口公安分局刑侦支队办公室灯火通明。地上摆的是灿灿夺目的五百多只成串金戒指晶莹剔透的数十串高档珠宝,还有十几部尚未拆盒的新型手机百余块电池板20只彩虹夫妇火的背后,是一场完美的爱情邂逅一场直播卖货过亿,带领亲戚发家致富实现年薪百万,不到两年全款买下600万的大房和4000万的别墅,彩虹夫妇最近上了热搜,火的一塌糊涂。可是更多的人看见的是他们赚得盆满钵满,却很少有渤海铁流,精锐主力部队之一,28军为何长期部署在山西省?在之前的文章中,作者和大家聊了一系列关于解放军各个部队发展建设的故事,例如27军20军23军等等。今天,我们聊聊另一支部队28军。不得不说,在当年的第三野战军部队中,28军也属于主想都不要想,他一定是打着美丽的旗号来的拜登5月20日开始的亚洲行,看都不要看,听都不要听,想都不要想,他一定是奔着坑害我们的目的来的,并且他还会打着美丽的旗号用美丽的口号来掩盖其罪恶的行径,是他们一贯的做派。还记得吗?山西的大山中,生活着一群杨家将的后人杨家将的故事在民间流传已经有千百年,杨家人为国捐躯前赴后继的爱国主义精神感染了每一位中华儿女,也成为了中国人面对外敌入侵,保家卫国,追求美好和平的一种寄托。我们现在听到的杨家将的故2022年山西60岁农民,每月可以领取多少钱?答案来了60岁农民,如果参与了当地的城乡居民养老保险,是可以领取养老金的,如果是在当地居民养老保险推出以前就年满60岁的,即便没有缴纳居民养老保险,也是可以免费获取一份基础养老金待遇的。今27岁成为山西首富,李兆会至今已消失5年,大数据为何找不到他?说起李兆会,就不得不说起他年轻时那段传奇的经历,22岁那年,大学还没毕业的李兆会就因为父亲李海仓遭到枪杀而在仓促中接手了家里的海鑫钢铁集团,接手之后,他仅仅用四年的时间就将海鑫钢铁山西女孩救人牺牲,21年后,被救者不光彩离去,她的选择值得吗2002年的一天,一位母亲坐在电视机前,泪流满面。她喃喃自语女儿啊,为这样的人搭上自己的一生,值得吗?电视里,正在播放一个当地恶势力团伙被宣判的镜头。其中,有一个犯罪的男子,名叫余山西富豪李春元六个儿子都身价过亿,因选错接班人毁掉整个企业2016年,电视剧好先生风靡全国,斩获了无数奖项,在山西省一个偏远的县城,每到晚上,家家户户几乎都播放着这部剧,并非因为电视剧太好看,而是这里的老百姓,对于女主角车晓,实在是再熟悉妹子就算你腿长脚白也不能乱放吧,注意你的形象啊不愧是老司机,在翻车的边缘疯狂试探高估了自己,低估了对手,后果很严重设计师滚出来最佳损友,没有之一!转了3小时,终于转对了地方没发工资,今晚只能吃泡面了,唉。。穷啊是不是又想回到学马里亚纳X加持!OPPOReno8Pro跟iPhone13ProMax相比如何?随着大家的生活节奏越来越快,人们的时间也变得越来越碎片化。用更短的时间接收更多的信息越来越被人们所重视,而短视频完美地迎合了移动互联网时代的使用习惯,大家可以利用较少的时间,快速的
工信部我国工业互联网转向规模发展关键期当前,我国工业互联网发展正处于起步探索转向规模发展关键期。9月9日,在工业和信息化部举行的加快制造业数字化网络化智能化发展主题新闻发布会上,工业和信息化部信息通信管理局一级巡视员王小议火力发电企业的风险管理注以下是本人作为北大纵横管理咨询公司特聘合伙人在该公司发表的文章,现通过头条发布,欢迎朋友们交流指正!电作为一种特殊的产品,涉及的相关企业众多,从产业上下游的纵向角度看,我们一般主美国股市持续下滑道琼斯指数下挫1100点来源央视新闻客户端当地时间13日,美国股市持续下滑。尾盘阶段,道琼斯工业平均指数一度下跌超过1100点,跌幅达3。5,标准普尔500指数下跌3。8,纳斯达克综合指数下跌4。6。美国锂电池热销折射发展新动能数据里的中国活力前不久,工信部发布数据,今年上半年,我国锂离子电池产业主要指标实现高速增长,产量超过280吉瓦时,同比增长150,全行业收入突破4800亿元。立足产业,去年全国锂离子电池产量达到3新旧电脑运行更流畅Windows7x64x86旗舰版2022。0912Windows7x64x86旗舰版2022。0912又更新了,对于喜欢Windows7系统的朋友有福了!再次将Windows7的补丁更到2022年9月12日,充分保证了Window四款旧款旗舰大降价,迎来最佳捡漏时机,超低价格不容错过最近新机发布如火如荼,大家都在争相讨论是入手华为Mate50还是iPhone14系列,然而真正的聪明人,不止着眼于新机,他们都知道降价后的老旗舰更香!今天就来推荐四款,入手保证不后他是华南理工博士,却跑去创业,靠卖电池发家,现身家820亿他是武汉大学硕士华南理工大学博士,本可以当教授搞科研,却因导师一句话,立志创业。2001年,他许下宏愿要做出世界上最好的电池。2005年,他告诉年近80岁的导师,他已经把电池卖到了云顶隐秘S级神龙努努,有转职无脑开冲,三星吃鸡兄弟们好,我是摩昂解说!新赛季大家冲分如何,这两天在宗师局局强势崛起了一套阵容神龙努努。下面摩昂就吧这套阵容与大家分享。阵容分析神龙尊者羁绊从上赛季的369羁绊变为2468羁绊,相工信部发文支持中小企业集群发展十四五将认定200个特色产业集群21世纪经济报道记者缴翼飞北京报道9月13日,工信部印发促进中小企业特色产业集群发展暂行办法(以下简称办法)。其中提出,十四五期间,在全国范围内认定200个左右集群,引导和支持地方欧盟27国上半年GDP为8。336万亿美元,不足美国七成了,那我国呢?采用未经季节调整的统计标准,欧盟27个成员国在今年第二季度完成的名义GDP上涨至39004。919亿欧元,与去年同期相比,剔除商品和服务价格的变动因素,实现了4。1的实质性上涨。若简直是电影截图,唐山藏在婚纱照里的浪漫分享一下怎样拍出好看的婚纱照复古婚纱照因为优雅和大方受到新人们的喜爱但是拍出好看的街拍也是需要硬件条件和拍摄技巧的既具有时尚INS风又有怀旧的味道对于不太熟悉街景的新人更有一种新鲜