STM32CubeMX更新很频繁,不确定从哪一个版本起,它生成的IAR7.x的代码直接编译会出现错误,大致有几种。

一、如果MCU配置的是STM32F3XX,那么需要在IAR工程的Option中确认一下是否有正确的配置了MCU的型号,反正我用的5.X版本的CubeMX生成的工程打开后Device都是None,就没有对过

怎么设置CubeMx生成文件的编码格式 cubemx生成工程编译出错_库文件

这种情况下编译必然是错误,一堆乱七八糟的错误。需要手动的把这一项设置为对应的MCU后才有可能编译通过。

二、几乎也是必出的错误,上一步设置了正确的型号后,再编译还是会有一堆错误,大约如下图所示

怎么设置CubeMx生成文件的编码格式 cubemx生成工程编译出错_库文件_02

定位一下出错的地方,会找到一个库文件

怎么设置CubeMx生成文件的编码格式 cubemx生成工程编译出错_下划线_03

如果不是对IAR的自定义的数据类型很熟悉,看起来是一头雾水的,而且这还是一个库文件。我第一次遇到这个问题的时候找了很久,终于查到问题出在 __RESTRICT这个宏定义上。在这个宏上点右键查看定义的地方,会定位到另一个库文件cmsis_iccarm.h中。如果右键不跳转那就直接去打开这个文件,里面有__RESTRICT的定义

怎么设置CubeMx生成文件的编码格式 cubemx生成工程编译出错_右键_04

这里需要将__restrict前的两个下划线删除掉,就可以编译通过了。度娘给出的解释是__restrict是linux下的写法,对于windows的写法是restrict,所以需要修改才能编译过去。这种错误也挺无语的。这个代码是CubeMX自动生成的,所以如果Cubemx中芯片的硬件外设有改动重新生成IAR工程时,这里也需要再手动改一次。

三、如果用CubeMX生成带FreeRTOS的工程,除了上面两个,还会出现一个编译错误。

Fatal Error[Pe035]: #error directive: intrinsics.h is already included previously!

如下所示:

怎么设置CubeMx生成文件的编码格式 cubemx生成工程编译出错_右键_05

它同样指向库文件cmsis_iccarm.h

怎么设置CubeMx生成文件的编码格式 cubemx生成工程编译出错_下划线_06

从语法上看,是因为有定义过__INTRINSTICS_INCLUDED才会出这个错误,我搜编了工程,也没有找到在哪里有这个宏的定义。我也在网上搜过,有人遇到过这个问题,但是没有给出具体的解决方案,只是说换高版本的IAR可以解决这个问题。我也想换版本的IAR啊,我用的7.4是已经是六七年前的古董的,可是公司没钱给你换啊啊啊啊。

没办法,死马当活马医,我试着把#error那句话注释掉,结果编译居然就OK了

怎么设置CubeMx生成文件的编码格式 cubemx生成工程编译出错_怎么设置CubeMx生成文件的编码格式_07

不过因为这个修改的是库文件,我并不清楚会不会有别的影响,我也是刚刚开始学FreeRTOS,目前还没有遇到别的问题。这个和第二个问题一样,每生成一次IAR的工程就需要改一次。

上面这几个问题应该都是CubeMX与IAR7.X的兼容性问题,按理这么明显的必发BUG不应该出现的,可是ST一直都没有修正,可能ST觉得IAR7.X太古老吧。不过像我一样只能用IAR7.X的同学可以参考一下。