stm32的断言机制(assert)的理解

     在做stm32的库程序移植时出现错误“#error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)"”,未选择STM32F4xx 设备导致多.h文件未被载入,发现是STM32F429_439xx的宏定义未定义,解决方法是在工具魔法棒 中的C/C++页的#define栏中添加相应的宏定义。

   出现错误“.\Objects\STM32F429IGT6_Demo.axf: Error: L6218E: Undefined symbol assert_param (referred from misc.o).”和警告“..\Libraries\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_wwdg.c(211): warning:  #223-D: function "assert_param" declared implicitly”,断言assert未被定义,发现是USE_STDPERIPH_DRIVER的宏定义未定义,解决方法是在工具魔法棒 中的C/C++页的#define栏中添加相应的宏定义。

      在文件stm32f4xx.h中,如果定义了USE_STDPERIPH_DRIVER,则#include “stm32f4xx_conf.h”文件,如下图

      文件stm32f4xx_conf.h包含了stm32的所有库文件和断言的定义,所以只要包含stm32f10x.h文件就能很容易的包含所有的文件文件了,需要使用assert函数时只需要定义USE_FULL_ASSERT即可。

stm32的断言机制(assert)的理解_第1张图片

     

        assert(表达式);如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。

      如上图所示,如果USE_FULL_ASSERT未定义,则断言是assert_param(expr) ((void)0)函数, ((void)0)表示空语句的表达式,即无断言机制,对程序不产生影响,如果定义了USE_FULL_ASSERT,则assert_param(expr)函数定义为: ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)),如果表达式正确则((void)0),如果错误,则运行函数assert_failed();其中__FILE__,__LINE__是标准库函数中的宏定义,用来指示出错的行数和文件函数assert_failed()可以自己在main.c中定义,如下:

void assert_failed(uint8_t* file, uint32_t line)
{
while(1);
}

以上,作为自己的学习记录。

你可能感兴趣的:(自学STM32)