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

1 问题描述

新建STM32的keil工程,在编译时出现警告“..\FWLIB\src\stm32f10x_rcc.c(273): warning: #223-D: function “assert_param” declared implicitly”,接下来一堆警告和错误。

这里写图片描述
出错的原因:函数“assert_param”未声明。assert_param

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”。

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”。
这里写图片描述

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

  • 46
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
引用\[1\]:.\Objects\test.axf: Error: L6218E: Undefined symbol __UNALIGNED_UINT32_WRITE (referred from stm32f1xx_ll_usb.o). .\Objects\test.axf: Error: L6218E: Undefined symbol __UNALIGNED_UINT32_READ (referred from stm32f1xx_ll_usb.o). void __UNALIGNED_UINT32_READ(){} void __UNALIGNED_UINT32_WRITE(){} 。 引用\[2\]:在上一篇中谈到使用stm32f107的HAL,实践中出现以下问题: .\Objects\test.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f107xc.o). .\Objects\test.axf: Error: L6218E: Undefined symbol __UNALIGNED_UINT32_WRITE (referred from stm32f1xx_ll_usb.o). .\Objects\test.axf: Error: L6218E: Undefined symbol __UNALIGNED_UINT32_READ (referred from stm32f1xx_ll_usb.o). .\Objects\test.axf: Error: L6218E: Undefined symbol SystemCoreClock (referred from stm32f1xx_hal.o). .\Objects\test.axf: Error: L6218E: Undefined symbol AHBPrescTable (referred from stm32f1xx_hal_rcc.o). .\Objects\test.axf: Error: L6218E: Undefined symbol APBPrescTable (referred from stm32f1xx_hal_rcc.o). .\Objects\test.axf: Error: L6218E: Undefined symbol __UNALIGNED_UINT32_READ (referred from stm32f1xx_ll_usb.o). 原因 。 引用\[3\]:在Keil中使用HAL时出现.\Objects\test.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f107xc.o).等问题。 。 问题:.\output\exe\Project.axf: Error: L6218E: Undefined symbol assert_failed (referred from cw32l031_rcc.o). 回答: 这个错误是由于在链接过程中,编译器无法找到所需的符号assert_failed,该符号被cw32l031_rcc.o文件引用。这个错误通常发生在缺少必要的文件或者链接器脚本配置不正确的情况下。要解决这个问题,你可以检查以下几个方面: 1. 确保你的项目中包含了所需的文件,特别是与assert_failed相关的文件。 2. 检查链接器脚本的配置,确保它正确地指定了文件的位置和链接顺序。 3. 确保你的代码中包含了正确的头文件和函数声明,以便编译器能够正确地解析符号引用。 如果以上步骤都没有解决问题,你可能需要进一步检查你的代码和项目配置,以确定是否存在其他问题。 #### 引用[.reference_title] - *1* *2* *3* [在Keil中使用HAL时出现.\Objects\test.axf: Error: L6218E: Undefined symbol SystemInit (referred from...](https://blog.csdn.net/sf9090/article/details/103318890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值