赞
踩
目录
前言:写这篇,是记录,同时也是为了让更多刚入门的,小伙伴,更好的读懂头文件,读懂.看懂STM_xxxx.h,驱动头文件时很重要的。
预处理指令,这些指令通常执行在程序编译之前,也就是说,程序在执行之前,是先执行预处理指令的,.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 风格
- }
预处理指令,定义寄存器地址,这些地址,对应这寄存器,这些寄存器,有什么功能可以在官方数据手册里面去查询,中文数据手册连接放在末尾。
通常在写码的时候,会对各种,结构体进行,结构体变量赋值,这些结构体变量的定义就在.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
最后希望对你有所帮助!!!个人理解,如有失误,欢迎指出,核实立改。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。