#带你读懂嵌入式应用开发 stm_xxxx.h驱动头文件(官方提供)

目录

#必备知识普及

#C语言预处理指令 

#C语言结构体定义

#查找取值小技巧

#讲解头文件内容部分

        


#必备知识普及

        前言:写这篇,是记录,同时也是为了让更多刚入门的,小伙伴,更好的读懂头文件,读懂.看懂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

 最后希望对你有所帮助!!!个人理解,如有失误,欢迎指出,核实立改。

  • 32
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值