运用STM32库函数的时分,你会发现带参数的库函数前面都有assert_param句子。
例如咱们随意看一个库函数,如下所示:
这个函数是3.5版别库函数stm32f10x_TIm.c中的定时器复位函数。
assert_param句子的效果?
assert_param句子是用于程序开发的时分,调试用的检测句子。默许是不敞开的,你能够无视它的存在。可是,当你在调试程序的时分,能够翻开这个检测机制,调试完了再封闭。
怎样使assert_param起效果?
检查assert_param的界说,坐落stm32f10x_conf.h文件,你会发现它实际上是个宏,看它的条件编译句子,你会发现,把USE_FULL_ASSERT界说后,即可翻开assert_param这个参数检测机制。USE_FULL_ASSERT这个宏界说已经在文件中隐掉,咱们把它的注释符号去掉即可。
看上图中第59行代码,是个条件编译句子,意思是:假如界说了USE_FULL_ASSERT,就把assert_param界说为一个三目运算的结构(第68行),不然(第71行),就把assert_param界说成((void)0)(第72行)。也便是说,你只要界说了USE_FULL_ASSERT,assert_param才会起效果,这个效果便是经过一个三目运算结构(如下)来判别的。关于三目运算的基础知识,请看http://www.raTIonmcu.com/clang/382.html
#defineassert_param(expr)((expr)?(void)0:assert_failed((uint8_t*)__FILE__,__LINE__))
assert_param句子的效果是检测函数的参数是否契合该函数的要求,例如上面的函数中的参数便是TIMx,咱们找到IS_TIM_ALL_PERIPH这个界说,能够看到TIMx中的x的规模是1~17,也便是说,你要是把函数写成TIM_DeInit(TIM1);assert_param的成果便是(void)0,假如你把函数写成TIM_DeInit(TIM18);就会调用assert_failed函数。
#defineIS_TIM_ALL_PERIPH(PERIPH)(((PERIPH)==TIM1)||\((PERIPH)==TIM2)||\((PERIPH)==TIM3)||\((PERIPH)==TIM4)||\((PERIPH)==TIM5)||\((PERIPH)==TIM6)||\((PERIPH)==TIM7)||\((PERIPH)==TIM8)||\((PERIPH)==TIM9)||\((PERIPH)==TIM10)||\((PERIPH)==TIM11)||\((PERIPH)==TIM12)||\((PERIPH)==TIM13)||\((PERIPH)==TIM14)||\((PERIPH)==TIM15)||\((PERIPH)==TIM16)||\((PERIPH)==TIM17))
assert_failed函数怎样写?
如上,当你界说了USE_FULL_ASSET之后,你当即编译,编译器会报错,提示assert_failed函数没有界说。咱们把assert_failed这个函数放到mian.c文件中,如下界说:
voidassert_failed(uint8_t*file,uint32_tline){printf(“Wrongparametersvalue:file%sonline%d\r\n”,file,line);while(1);}
上面函数的意思便是,假如参数犯错,输出犯错的文件名称和行号。成果是输出到串口,用串口调试帮手能够看到输出成果。留意,编译器Build Output栏是不会报错的。
下面给出一个例程,成心写错参数,经过STM32串口1把过错参数的文件名称和行数发到串口,你翻开串口调试帮手即可看到成果。