查看: 722|回复: 1
打印 上一主题 下一主题

STM32F1库文件学习笔记

[复制链接] qrcode

34

主题

37

帖子

111

积分

注册会员

Rank: 2

积分
111
楼主
跳转到指定楼层
发表于 2016-3-7 10:21 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一直说自己在学STM32,可自己并不是真的会,也不懂库具体的实现,现在拿出时间研究一下库函数
1、先看gpio.h文件吧
#ifndef __STM32F10x_GPIO_H
#define __STM32F10x_GPIO_H
#ifdef __cplusplus
extern "C" {
#endif
..................
#ifdef __cplusplus
}
#endif
头一句就是这个,这个有什么用呢?
在工程中发现每个头文件都有这个,到底什么作用呢?
#ifdef __cplusplus //c++编译环境中才会定义__cplusplus (plus就是"+"的意思)
extern "C" { //告诉编译器下面的函数是c语言函数(因为c++和c语言对函数的编译转换不一样,主要是c++中存在重载)
#endif
意思是如果是c++的编译器来编译这个程序的话,让它像c程序一样链接。
extern "C"表示编译生成的内部符号名使用C约定。
C++支持函数重载,而C不支持,两者的编译规则也不一样。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原 型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像 _foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。 _foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。
http://bbs.21ic.com/icview-749116-1-1.html
这个地址讲的stm32f10x.h很详细,值得一看
2、#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) ||
((PERIPH) == GPIOB) ||
((PERIPH) == GPIOC) ||
((PERIPH) == GPIOD) ||
((PERIPH) == GPIOE) ||
((PERIPH) == GPIOF) ||
((PERIPH) == GPIOG))
等效于:
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || ((PERIPH) == GPIOB) ...)
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));这句主要是判断传进函数中的参数GPIOx是否有效,因为GPIOx必须是GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG这几个当中的其中一个,否则会被认为是无效的参数。
assert_param(xxxxxxxx)就是判断参数是否有效
回复

使用道具 举报

0

主题

77

帖子

4

积分

新手上路

Rank: 1

积分
4
沙发
发表于 2016-3-14 08:23 PM | 只看该作者
ST公司工程师已经考虑兼容C++了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表