闲来无事,试着自己新建了一下IAR for STM32工程,期间出现一些警告,感觉还挺常见,网上搜索答案各不相同,在这里记录一下自己的解决方法,作为备忘。
1、Warning[Pe223]: function “assert_param” declared implicitly
这个问题原因是由一个宏开关没有打开!这个宏USE_STDPERIPH_DRIVER开关需要打开,就不会有这个告警、错误了。解决方法如下:
- Options -> C/C++ Compiler的Preprocessor页的Defined symbols中加上USE_STDPERIPH_DRIVER
先执行这一步,倘若配置正确仍然有报错,则按照以下两种方法(选择其一即可):
- 1)在头文件中添加 #include “stm32f10x_conf.h”
追踪到stm32f10x_conf.h头文件中,可以发现该文件中有定义assert_param。 - 2)还有另一种方法就是将stm32f10x.h中的宏开关打开:
#if !defined (STM32F10X_LD) && !defined (STM32F10X_MD) && !defined (STM32F10X_HD)
/* #define STM32F10X_LD */ /*!< STM32 Low density devices */
/* #define STM32F10X_MD */ /*!< STM32 Medium density devices */
#define STM32F10X_HD /*!< STM32 High density devices */
#endif
2、Warning[25]: Label ‘Reset_Handler’ is defined pubweak in a section implicitl
出现该错误的原因是因为IAR新版本跟旧版本不兼容导致的,可以在startup_stm32f10x_md.s或startup_stm32f10x_md.s或startup_stm32f10x_md.s这三个启动文件中修改(修改内容请继续往下看),具体哪个文件根据自己芯片对应的flash大小而定。
例如我用的是STM32F103C8T6,flash大小为64K,所以对应在startup_stm32f10x_md.s中修改
修改方法如下:
- 将startup_stm32f10x_md.s文件中的文本:SECTION .text:CODE:REORDER(1)
全部替换为 - SECTION .text:CODE:REORDER:NOROOT(1)
或 - SECTION .text:CODE:REORDER:ROOT(1)
注意 NOROOT和 ROOT 的区别,如果NOROOT表示如果符号没有被关联的时候是被优化掉的,
如果想不被优化则使用ROOT.
另外:按照上述修改后有可能会出现下述提示警告:Warning[22]: Set section alignment the same (2) or larger
出现该警告具体原因我暂时不清楚,只知道将上述括号中的1改成2即可。即
3、Warning[22]: Set section alignment the same (2) or larger
解决方法见问题2。
4、Warning[Pe223]: function “xxxx” declared implicitly
出现该错误,是因为自己定义的函数没有声明造成的,一般查看两个地方:
- 1、检查该函数所在C文件对应的 .h 文件中有没有添加 extern 声明该函数的语句。
- 2、检查在所有头文件引用的地方有没有添加该函数所在C文件对应的头文件。
例如:我在exti.c文件中自定义了一个函数void EXTI_Config(void);则我需要干2件事:
(1)在exti.h文件中添加该函数声明:extern void EXTI_Config(void);
(2)并在head.h文件或者main.c文件中添加一个头文件:#include “exti.h”。