打印
[开发工具]

Keil编译警告:function "assert_param" declared implicitly的解决方法

[复制链接]
1366|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1 问题描述
新建STM32的keil工程,在编译时出现警告“..\FWLIB\src\stm32f10x_rcc.c(273): warning: #223-D: function “assert_param” declared implicitly”,接下来一堆警告和错误。


出错的原因:函数“assert_param”未声明。assert_param


沙发
xuanhuanzi|  楼主 | 2018-10-14 18:01 | 只看该作者
2 问题分析
函数assert_param是STM32官方库文件中用到的。

对于我采用的《STM32F10x_StdPeriph_Lib_V3.5.0》库文件来说,assert_param函数在文件“stm32f10x_conf.h”的第59-73行。



查看函数说明可知,assert_param是一个条件表达式宏定义,主要作用是对函数的输入参数进行检查。仔细查看程序段,不管是否定义USE_FULL_ASSERT,函数assert_param均有定义,编译时不应该出现上述警告。

还有一种可能,那就是虽然定义了函数assert_param,但是包含定义的文件“stm32f10x_conf.h”没有被编译。

在工程文件中搜索字符“stm32f10x_conf.h”,在文件“stm32f10x.h”的第8301-8303行找到程序段。



这段代码的意思:如果定义USE_STDPERIPH_DRIVER,则包含文件“stm32f10x_conf.h”。同样的,如果没定义则不包含。

在工程中搜索文本USE_STDPERIPH_DRIVER,没有找到有关 USE_STDPERIPH_DRIVER的宏定义,因此也就没有包含stm32f10x_conf.h文件,工程中也就没有assert_param的声明。

文本“USE_STDPERIPH_DRIVER”的字面意思:使用标准外设驱动。也就是说如果需要使用ST官方提供的外设驱动库则需要定义“USE_STDPERIPH_DRIVER”。

很明显问题出在使用了官方的标准外设库又没有定义“USE_STDPERIPH_DRIVER”。


使用特权

评论回复
板凳
xuanhuanzi|  楼主 | 2018-10-14 18:02 | 只看该作者
3 问题解决
解决问题的办法就是在工程中定义“USE_STDPERIPH_DRIVER”。这有两种方法。

方法一:标准宏定义

在工程中定义USE_STDPERIPH_DRIVER。通过上面的分析,在“stm32f10x.h”文件的起始位置定义USE_STDPERIPH_DRIVER即可。

先修改“stm32f10x.h”的只读属性。在工程文件中找到文件后,把文件属性修改为可读写的。

然后在Keil打开“stm32f10x.h”文件,在文件头添加代码“#define USE_STDPERIPH_DRIVER”。



重新编译工程,问题解决。

方法二:工程参数设置

在Keil工程中,点击“options for Target…”,在弹出窗口中点击“C/C++”,在“Preprocessor Symbols”的“Define”栏输入“USE_STDPERIPH_DRIVER”。

Preprocessor Symbols 就是预处理符号,输入“USE_STDPERIPH_DRIVER”就是向工程中添加预处理标号“USE_STDPERIPH_DRIVER”,等同于在代码中添加宏定义“#define USE_STDPERIPH_DRIVER”。


设置完后,编译工程,问题解决。


使用特权

评论回复
地板
小明的同学| | 2018-10-14 18:19 | 只看该作者
还真遇到过这个问题呢。

使用特权

评论回复
5
幸福小强| | 2018-10-14 19:45 | 只看该作者
头文件缺失?

使用特权

评论回复
6
捉虫天师| | 2018-10-14 22:08 | 只看该作者
这种就是缺一个,其实一堆关联的都报错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

155

主题

2084

帖子

2

粉丝