一直说自己在学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)就是判断参数是否有效 |