如何为STM32编程节省代码空间?在IAR中配置CRC参数有窍门

发布时间:2023-08-02  

前言

STM32全系列产品都具有CRC外设,对CRC的计算提供硬件支持,为应用程序节省了代码空间。CRC校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时的完整性检查。在IEC60335中,也接受通过CRC校验对FLASH的完整性进行检查。在对FLASH完整性检查的应用中,需要事先计算出整个FLASH的CRC校验值(不包括最后保存CRC值的字节),放在FLASH的末尾。在程序启动或者运行的过程中重新用同样的方法计算整个FLASH的CRC校验值,然后与保存在FLASH末尾的CRC值进行比较。


EWARM从v5.5版本之后开始支持STM32芯片的CRC计算。前面所说的计算整个FLASH的CRC校验值并保存在FLASH末尾的过程,可以在IAR中完成。通过配置EWARM的CRC计算参数,自动对整个FLASH空间进行CRC计算,并将计算结果放到FLASH的末尾。本文中将介绍的就是如何配置IAR的CRC参数,使之与STM32的CRC硬件模块保持一致。本文中的例子都基于STM32F072进行。


STM32的CRC外设CRC校验值的计算采用多项式除法,可以通过除数和被除数进行异或运算实现。这种方法非常适合通过硬件电路来实现。使用STM32CRC外设时,你要考虑的内容包括:采用哪个CRC生成多项式,输入数据(要进行校验的数据)和初始值。


1.生成多项式默认使用CRC32多项式:0x4C11DB7

部分芯片支持可编程的多项式,比如STM32F3,STM32F0,STM32L0

2.初始值STM32的CRC初始值默认为0xFFFFFFFF,STM32F3,STM32F0,STM32L0系列可以修改初始值

3.输入/输出数据的反转STM32F3,STM32F0,STM32L0系列还提供了对输入/输出数据进行反转的功能。默认不对输入数据和输出数据进行位反转

· 对输入数据的位反转操作可以设置为按字节/半字 /字为单元进行操作。例如输入数据为0x1A2B3C4D, o 每个字节内逐位反转,结果是0x58D43CB2 o 每半字内逐位反转,结果是0xD458B23C o 每个字长内逐位反转,结果是0xB23CD458· 对输出数据的位反转。 o 例如输出数据为0x11223344,反转后为0x22CC4488

IAR的CRC配置

1.修改Link文件指定checksum在FLASH中的存储位置,在Link文件中增加下面语句。

该语句指定将CRC的值放在FLASH的末尾位置。是整个FLASH空间的末尾,不是应用程序的代码末尾。这样,CRC值的位置就是固定的。不会随代码大小而变化。

2.配置Checksum页面的参数

IAR Checksum页说明(v6.4及以上)

IAR的checksum页面分为两个部分。第一部分,也就是红线圈出的部分。定义了FLASH中需要计算CRC的范围和空闲字节填充值。剩下的部分,就是对checksum计算参数的设定部分。 Checksum size :选择checksum的大小(字节数) Alignment:指定checksum的对齐方式。不填的话默认2字节对齐。

Algorithm:选择checksum的算法 Complement:是否需要进行补码计算。选择“Asis”就是不进行补码计算。 Bit order:位输出的顺序。MSB first,每个字节的高位在前。LSB first,每个字节的低位在前。 Reverse byte order within word: 对于输入数据,在一个字内反转各个字节的顺序。 Initial value: checksum计算的初始化值 Checksum unit size :选择进行迭代的单元大小,按8-bit,16-bit还是32-bit进行迭代。

3.STM32 CRC外设使用默认配置时IAR的配置STM32CRC外设的配置:

POLY= 0x4C11DB7(CRC32) Initial_Crc = 0Xffffffff 输入/输出数据不反转 输入数据:0x08000000~0x0801FFFB。(最后4个字节用来放计算出的CRC值)

具体使用中我们可以根据实际应用需求参照上面介绍做相应配置即可。

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    明去学习单片机开发性价比是最高的。 如果你只在开发板玩,这只能让你学会单片机,你会发现,在开发板上玩的很溜,一让你做个小发明就一脸懵逼。 因为单片机只是一个工具而已,真正核心的是你的编程思维和水平。 这个......
    明去学习单片机开发性价比是最高的。 如果你只在开发板玩,这只能让你学会单片机,你会发现,在开发板上玩的很溜,一让你做个小发明就一脸懵逼。 因为单片机只是一个工具而已,真正核心的是你的编程思维和水平。 这个......
    单片机重要的多! 2. 基础电路 单片机是针对硬件电路的编程,我们写程序最终就是控制单片机的外设,然后外设控制外围电路实现产品功能。 所以对于软件开发来说,不要求你电路基础有多么扎实,也不用你会设计,这些......
    单片机编程好学吗?单片机初学者怎样看懂代码?;单片机在很多人看来好像门槛很高,在某些人看来很简单。 所以,单片机编程好不好学,这取决于谁去学,有没有基础,有没有兴趣。 我自己是通过自学学会的,我个......
    发现单片机是多么迷人的东西啊,太好玩了,这不是在学习知识,而是在玩,比起跑跑卡丁车,比起魔兽世界,要好玩的多的多。当你编写的程序按你的意愿实现时,你比做任何事都开心,你会上瘾的,真的,做电子设计的人真的会上瘾。然后......
    等其实用得很多。 STM32主要是给专业开发人员做产品用的,需要一定的专业知识,但同时编写代码实现功能也相对复杂。比如串口输出一个简单的字符串,对于Arduino可能......
    王者之道。   GPIO本身的编程实际上很简单:   1、设置GPIO口的引脚为输入或者输出模式。我们在进行点灯代码的时候,一般设置为推挽输出模式。   2、操作寄存器,往寄存器里置1或者清零操作——这个......
    王者之道。   GPIO本身的编程实际上很简单:   1、设置GPIO口的引脚为输入或者输出模式。我们在进行点灯代码的时候,一般设置为推挽输出模式。   2、操作寄存器,往寄存器里置1或者清零操作——这个步骤,固件......
    王者之道。   GPIO本身的编程实际上很简单:   1、设置GPIO口的引脚为输入或者输出模式。我们在进行点灯代码的时候,一般设置为推挽输出模式。   2、操作寄存器,往寄存器里置1或者清零操作——这个步骤,固件......
    现实很难达到托尼斯塔克的水平,不过能通过自己写代码去做出自己想要的东西,已经很有成就感了。 10年前,我也是一样,从点亮第一个LED开始就迷上了单片机开发,原来写程序控制硬件是这样玩的。 为此,我那段时间把游戏都戒了,我的......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>