目录
#必备知识普及
前言:写这篇,是记录,同时也是为了让更多刚入门的,小伙伴,更好的读懂头文件,读懂.看懂STM_xxxx.h,驱动头文件时很重要的。
#C语言预处理指令
预处理指令,这些指令通常执行在程序编译之前,也就是说,程序在执行之前,是先执行预处理指令的,.h头文件里面会有各种预处理指令,宏定义,防止重复引用定义,
常见的预处理指令,以及作用
#define //定义:定义一个常量或者宏使用
//使用格式
#define u8 uint_8;//u8就代表着uint_8 这个类型
#define IS_TIM_OPM_MODE(MODE) (((MODE) == TIM_OPMode_Single) || \
((MODE) == TIM_OPMode_Repetitive))//这种代表了,等于后面两个函数的其中一种
#define TIM_OCMode_Timing ((uint16_t)0x0000)//同理代表后面这个寄存器地址
#ifndef xxxxx //如果没有定义xxx这个宏 就执行语句块1
//语句块1
#ifdef xxxxx //如果定义这个宏,则执行语句块1
//语句块1
#include "stm32f4xx.h"//引入一个头文件
#endif //预处理指令结束标识,这一句就代表结束预处理指令
使用,预处理指令防止重复引用 .h(头文件)定义
#ifndef __STM32F4xx_TIM_H //如果没有定义这个宏,执行语句块1
#define __STM32F4xx_TIM_H //语句块1定义这个宏
#enfif //预处理指令结束
防止重复引用的作用,主要是,在.h文件中,定义变量,在引入到多个其他文件中使用,是不会报变量重复定义这个错误的,如果在.c文件中定义 变量 在其他文件中引入.c 文件,会报重复定义变量的这个错误,报错如下,.h文件中有这个定义,所以就不会报错,这个定义还是比较重要的。
具体驱动文件实例如下,第一个#endif 是#ifdef _cplusplus,的结束标识,头文件的#endif结束在最后,截图没有截上,这里首先是,头文件防止重复引用的定义,如果没有定义 _cplusplus,这个宏,extern "C"
是 C++ 中的一种编译指令,它用于指定链接器在处理特定的函数或变量时,按照 C 风格(C linkage)进行链接和解析 #endif 结束这一段预处理指令 然后引入一个头文件。
extern "C" {
extern int myCFunction(int x, int y); // 显示声明为 C 风格
}
预处理指令,定义寄存器地址,这些地址,对应这寄存器,这些寄存器,有什么功能可以在官方数据手册里面去查询,中文数据手册连接放在末尾。
#C语言结构体定义
通常在写码的时候,会对各种,结构体进行,结构体变量赋值,这些结构体变量的定义就在.h头文件里面,具体见下图,可能有的小伙伴,对这种结构体定义方式比较陌生。
常见结构体定义类型,作用,效果
int main()
{
struct person//定义一个结构体
{
char name;
char age;
char addresss;
};
struct person s1;//声明一个结构体变量s1
return 0;
}
还有一种,在声明结构体的时候,顺带着,定义变量
int main()
{
struct person
{
char name;
char age;
char addresss;
}s1,s2,s3;
return 0;
}
这种struct定义的结构体,如果需要重新定义一个结构体变量,前面需要加上struct person进行声明,有没有能少敲几个字的有下面
是用关键字 typedef struct 定义结构体类型,效果,作用
int main()
{
typedef struct person
{
char name;
char age;
char addresss;
}s1;//这里s1 不是生命变量的意思
s1 s2;//这里可以直接使用 s1 去声明 s2是struct person类型的结构体变量
//这里s1 其实就相当于 struct person
return 0;
}
怎么去理解typedef 这个关键字,其实就相当于#define s1 struct person;这个语句,就是用s1去代替了 struct person 直接使用 s1 去声明结构体变量就可以。
到这里还有点不一样对不对,少了,结构体名称对不对,在驱动文件里面,这里使用了匿名结构,也就是不声明 结构体类型名称同时生命结构体变量
int main()
{
struct //这里没有结构体名称
{
char name;
char age;
char addresss;
}s1, s2, s3;//结构体变量
return 0;
}
然后,在搭配 关键字 typedef 进行使用
int main()
{
typedef struct //这里没有结构体名称
{
char name;
char age;
char addresss;
}s1;//这里 s1 代表着 struct
s1 s2;//s2 就是被声明出来的结构体变量
return 0;
}
#查找取值小技巧
当赋值一个陌生的结构体变量,不知道取什么值,或者该选择官方定义好的值的时候,可以使用 ctrl+f 快捷键,进行查找取值,具体演示如下。
这是一个查找取值的小技巧,挺使用的。
#讲解头文件内容部分
如果有了上面的基本知识,读 stm_xxxx.h驱动头文件应该没什么困难了,这里主要带着小伙伴们认识一下头文件里面的内容部分,本文教程用例,驱动头文件将上传,放在最后末尾
1头文件介绍部分
这一部分在开头,主要是,作者,开发时间,简介,证书什么的。
2防止重引用头文件定义,预处理指令部分
头文件定义(防止重引用),预处理指令部分,然后引入头文件都在这里。
3结构体定义部分
前两个部分之后,就是大量的结构体定义部分,平时查找的最多的也在这里
4#define定义宏,成员体变量取值部分
这里主要定义,各种宏定义,还有结构体成员取值类型,宏后面跟的那些是,寄存器地址,通过这些地址,对寄存器写或者读,实现某种效果,具体这个地址的寄存器有什么用,得找数据手册,链接最后。
5头文件生命函数部分
这个部分主要生命.c文件(源文件),中定义地函数。也是经常查重函数定义。
链接:https://pan.baidu.com/s/12SM_KSvwXXyTqAvosVA-gQ
提取码:zhiy
最后希望对你有所帮助!!!个人理解,如有失误,欢迎指出,核实立改。