新建STM32的keil工程,在编译时出现警告“..\FWLIB\src\stm32f10x_rcc.c(273): warning: #223-D: function “assert_param” declared implicitly”,接下来一堆警告和错误。
函数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”。
解决问题的办法就是在工程中定义“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”。
设置完后,编译工程,问题解决。
因篇幅问题不能全部显示,请点此查看更多更全内容