在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。
所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。
这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。
它确实在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。
当你的项目开发成功,使用release模式编译之后,或在stm32f10x_conf.h文件中注释掉对USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。
在执行assert_param()的检验时,如果发现参数出错,它会调用函数assert_failed()向程序员报告错误,在任何一个例程中的main.c中都有这个函数的模板,如下:
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf('Wrong parameters value: file %s on line %drn', file, line) */
while (1)
{}
}
你可以按照自己使用的环境需求,添加适当的语句输出错误的信息提示,或修改这个函数做出适当的错误处理。
关键字:STM32 assert_param
引用地址:
STM32 assert_param
推荐阅读最新更新时间:2026-03-25 10:21
Stm32调试之assert_param() 断言机制
void TIM_DeInit(TIM_TypeDef* TIMx) { /* Check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); if (TIMx == TIM1) { RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE); } } 这段代码是Stm32固件库中的,IS_TIM_ALL_PERIPH(TIMx)这个函数的原形是判断TIMx是否等于TIM1-TI
[单片机]
详解stm32中的assert_param()函数
大家在用stm32库函数的时候几乎都会发现assert_param()这个函数,这个函数是判断参数有没有错误,具体是什么错误呢,我会在后面贴图的。 assert_param()这个函数在stm32f10x_conf.h中定义: #ifdef USE_FULL_ASSERT #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) void assert_failed(uint8_t* file, uint32_t line); #else #define assert_param(expr) ((
[单片机]
STM32 中的 assert_param 函数
我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用。下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以然。 4 断言机制函数assert_param 我们在分析库函数的时候,几乎每一个函数的原型有这个函数assert_param();下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));为例说一下我的理解,函数的参数IS_GPIO_ALL_PERIPH(GPIOx),我们可以寻找到原型 #define IS_GPIO_ALL_PERIPH(PERIPH) (((*(uint32_t*)&(PERIPH))
[单片机]
如何使用STM32中的assert_param
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义; 在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。 所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3, 则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。 这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。 它确实在程序的运行上牺牲了效率(但只是在调
[单片机]
STM32中assert_param的使用
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义; 在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。 这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。它确实
[单片机]
Keil编译警告:function "assert_param" declared implicitly的解决方法
1 问题描述 新建STM32的keil工程,在编译时出现警告“..FWLIBsrcstm32f10x_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" declared implicitly的解决方法" />
STM32学了两年半,却还是不会做项目
可能你已经学习了很久,但是当Leader抛给你一个STM32项目,你是不是依然手足无措? 有一朋友刚开始学习的51单片机,后来转STM32了。 主要是跟着网上的在线课程学习,自己下边跟着敲代码。 过程中学过各种培训机构出的视频课程,接触过操作系统,开发板上的例程都可以做出来。 后来他又学习了PCB绘制,由于在学校的时候没学到多少东西,而且不是电子类专业,陷入了迷茫,不知道该怎么学了。 记得在上大学的时候,专业课老师曾反复叮嘱我们“ 老师领进门,修行看个人 ”。 这话之后还没完,经常告诫我们要深入学习51单片机。 当时没有完全理解他的意思,直到工作若干年之后才知道。 在嵌入式领域,技术上有所精进,底层的东西
[嵌入式]