您的位置 首页 IC

STM32库函数之断语

我们在学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)) == GPIOA_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOB_BASE) || //都是或的联系
((*(uint32_t*)&(PERIPH)) == GPIOC_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOD_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOE_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOF_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOG_BASE)
)
这个宏界说的效果便是查看参数PERIPH(外围),判别参数PERIPH是否为GPIOX(A…G)基址中的一个,只需有一个为真则其值为真,否则为假,不用多说,这是C言语中根本的逻辑运算。当然这个库函数也用的很有意思,看:首要对PERIPH进行取址,也便是求地址,&PERIPH,然后对这个地址强制转化为32位的指针,即前面加(uint32_t *),然后经过*进行拜访这个地址(指针)中的内容。不多说了,看几遍就能了解。
下面咱们再回到assert_param这个函数,这个函数是哪里的呢?在stm32f10x_conf.h寻找到原型如下:
#ifdefUSE_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) ((void)0)
#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中能够找到。如下:
void assert_failed(u8* file, u32 line)
{ 自己能够写个串口打印信息什么的,一起会将过错的行回来的

while (1) { }
} 英文注释也阐明晰怎样运用,经过输入参数来确认方位,最简略的办法便是串口打印了,这个函数的首要思维是在输入参数有问题的时分,但是有编译不出来,它能够帮你查看参数的有效性,优点不用多言,自己领会就行。
持续阐明: assert_param是怎样包括进去的呢?咱们在stm32f10x_conf.h这个头文件中界说的函数声明仍是宏界说,怎样在其它文件中都能运用呢?也许多网上朋友在刚开始学习的时分都遇到编译不过去的问题呈现,最终经过在文件中增加USE_STDPERIPH_DRIVER来处理的:

咱们能够在整个工程中进行查找USE_STDPERIPH_DRIVER,经过头文件能够看出,是运用规范外设文件。在stm32f10x.h文件中咱们能够查找到如下状况:
#if !definedUSE_STDPERIPH_DRIVER

#define USE_STDPERIPH_DRIVER
#endif

#ifdef USE_STDPERIPH_DRIVER
#include “stm32f10x_conf.h”
#endif
能够很简单看出来,咱们不在那里增加,这个头文件中也给咱们设置了开关,只需把第一个的注释去掉,就不用在装备中增加USE_STDPERIPH_DRIVER了,在第二个文件中咱们能够知道怎样包括这个操控开关文件了,呵呵。咱们也了解为什么咱们在写程序的时分只需包括stm32f10x.h就能很简单的包括一切的文件文件了吧,咱们只需在stm32f10x_conf.h装备一下就能包括所需求的库文件了。
经过以上能够看出,经过头文件的彼此包括,来操控外设以及调试文件的调用,这样咱们理清思路,了解起来就好多了。当然在学习中或许有些C言语问题还没有了解透彻,多上网搜一下,或许多看书,很快就搞了解的。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/258388.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部