咱们在学STM32的时分函数assert_param呈现的几率非常大,上网查找一下,网上一般解说断语机制,做为程序开发调试阶段时运用。下面我就谈一下我对这些运用的观点,学习东西抱着知其然也要知其所以然。
这个宏界说的效果便是查看参数PERIPH(外围),判别参数PERIPH是否为GPIOX(A…G)基址中的一个,只需有一个为真则其值为真,否则为假,不用多说,这是C言语中根本的逻辑运算。当然这个库函数也用的很有意思,看:首要对PERIPH进行取址,也便是求地址,&PERIPH,然后对这个地址强制转化为32位的指针,即前面加(uint32_t *),然后经过*进行拜访这个地址(指针)中的内容。不多说了,看几遍就能了解。
#ifdef
#else
#endif
这是一个预编译文件,若是界说了USE_FULL_ASSERT这个文件,则履行后边的文件,咱们在程序中一般都没什么界说,即履行后边这个句子((void)0),这个句子不用多想,没有界说USE_FULL_ASSERT便是什么也不履行。说的了解点,对上面的那个句子IS_GPIO_ALL_PERIPH(GPIOx)不履行任何操作。若是界说了USE_FULL_ASSERT它,咱们调用这个函数assert_param时,及对参数IS_GPIO_ALL_PERIPH(GPIOx)的正确性进行查看,经过一个C言语中的双目运算符来判别,若是回来1,履行句子(void)0,跟上面相同,若是回来0,则履行后边的函数assert_failed((uint8_t *)__FILE__, __LINE__),函数的效果在库函数中有解说,用来指示犯错的行数和文件。留意:__FILE__, __LINE__是规范库函数中的宏界说!牢记
void assert_failed(uint8_t* file, uint32_t line);刚开始没看了解为什么加在这儿,细心一想是在头文件的函数声明。至于函数实体呢?咱们从官方文件的模板中main.c中能够找到。如下:
{
while (1) { }
} 英文注释也阐明晰怎样运用,经过输入参数来确认方位,最简略的办法便是串口打印了,这个函数的首要思维是在输入参数有问题的时分,但是有编译不出来,它能够帮你查看参数的有效性,优点不用多言,自己领会就行。
咱们能够在整个工程中进行查找USE_STDPERIPH_DRIVER,经过头文件能够看出,是运用规范外设文件。在stm32f10x.h文件中咱们能够查找到如下状况:
#endif
#ifdef USE_STDPERIPH_DRIVER
#endif
能够很简单看出来,咱们不在那里增加,这个头文件中也给咱们设置了开关,只需把第一个的注释去掉,就不用在装备中增加USE_STDPERIPH_DRIVER了,在第二个文件中咱们能够知道怎样包括这个操控开关文件了,呵呵。咱们也了解为什么咱们在写程序的时分只需包括stm32f10x.h就能很简单的包括一切的文件文件了吧,咱们只需在stm32f10x_conf.h装备一下就能包括所需求的库文件了。