闲来无事,试着自己新建了一下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”。