- stm32f10x.h文件:描述stm32有哪些寄存器(外围)和它对应的地址。
- stm32由内核和内核外围的设备组成的,内核寄存器描述和外围寄存器描述文件存储位置不在一起
- core_cm3.h core_cm3.c内核寄存器描述文件。
- mic.c内核库函数 stm32f10x_conf.h用来配置头文件的包含关系和参数检查的函数定义,stm32f10x_it.c存放中断函数。
- 启动函数的选择(选择后缀)
- 新建工程步骤
疑问:头文件中这种结构有什么用?
#ifndef __PWM_H
#define __PWM_H
void PWM_Init(void);
void PWM_SetCompare3(uint16_t Compare);
#endif
通过一些简单的例子来说明“包含”(Include)和“重复包含”(Repeated Inclusion)的概念。
包含(Include)
包含是指在一个源文件中通过预处理指令#include
来插入另一个文件(通常是头文件)的内容。这样做的主要目的是为了代码的重用和模块化。
例子:
假设你有一个头文件math_functions.h
,里面定义了一些数学函数的声明:
// math_functions.h
#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_H
// 函数声明
int add(int a, int b);
int subtract(int a, int b);
#endif // MATH_FUNCTIONS_H
然后,在你的源文件main.c
中,你想要使用这些数学函数,于是你包含了math_functions.h
头文件:
// main.c
#include <stdio.h>
#include "math_functions.h" // 包含math_functions.h头文件
int main() {
int result = add(5, 3);
printf("5 + 3 = %d\n", result);
return 0;
}
在这个例子中,#include "math_functions.h"
指令告诉预处理器将math_functions.h
文件的内容插入到main.c
中#include
指令的位置。这样,main.c
就可以知道add
函数的声明,从而能够调用它。
重复包含(Repeated Inclusion)
重复包含是指同一个头文件在同一个编译单元(比如一个源文件)中被包含多次。这通常会导致编译错误或未定义行为,因为头文件中的某些内容(如全局变量定义、函数体定义、重复的宏定义等)不应该被多次包含。
例子(未使用包含保护的情况):
假设math_functions.h
没有使用包含保护(即没有#ifndef
、#define
、#endif
):
// math_functions.h(无包含保护)
int add(int a, int b);
int subtract(int a, int b);
// 假设这里还有一个全局变量定义(实际上在头文件中定义全局变量是不好的做法)
int global_var = 0; // 警告:这会导致问题!
然后,在main.c
中,由于某种原因(可能是间接包含),math_functions.h
被包含了两次:
// main.c(假设math_functions.h被包含了两次)
#include "math_functions.h"
// ... 可能还有其他代码,包括另一个也包含了math_functions.h的头文件
#include "math_functions.h" // 重复包含
int main() {
// ...
}
在这个例子中,由于math_functions.h
没有包含保护,global_var
会被定义两次,这会导致编译错误(通常是“重复定义”的错误)。
使用包含保护解决重复包含:
通过添加包含保护到math_functions.h
,我们可以防止这种情况:
// math_functions.h(使用包含保护)
#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_H
int add(int a, int b);
int subtract(int a, int b);
// 假设全局变量已经被移除或改为其他形式(如extern声明)
#endif // MATH_FUNCTIONS_H
现在,即使math_functions.h
被包含多次,它的内容也只会在第一次包含时被插入,后续的包含会被预处理器的#ifndef
检查所阻止。