OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4452|回复: 11

寄存器版本或库函数版本编程时,库文件头.h的包含关系

[复制链接]

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-24 21:07:38 | 显示全部楼层 |阅读模式
本帖最后由 warship 于 2018-7-24 21:44 编辑

我们知道,直接操作寄存器进行编程时,
是不依赖STM32的库函数的,
但对于最基本的头文件,
即使是直接操作寄存器也是必须包含的,
其中最最重要的一个头文件就是stm32f10x.h
这个头文件定义了所有外设基地址,
所有外设中寄存器的名称、偏移量、长度、寄存器的位定义等等,
是我们直接操作寄存器进行编程的基础。

我们一般在我们自己的基础代码sys.c的sys.h中包含这个stm32f10x.h
然后,在我们所有其它模块中只须通过#include sys.h也就相当于包含了stm32f10x.h
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
 楼主| 发表于 2018-7-24 22:58:09 | 显示全部楼层
本帖最后由 warship 于 2018-7-25 18:08 编辑

使用寄存器编程,工程文件可以很简洁,编译速度也很快。基本可以做到只包含stm32f10x.h这一个头文件就可以了(它内置包含了系统内核core_cm3.h, 这个后面会讲到)。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
 楼主| 发表于 2018-7-24 21:11:15 | 显示全部楼层
本帖最后由 warship 于 2018-7-24 21:48 编辑

那么,使用库函数呢?
我们看stm32f10x.h的第99行:
#if !defined  USE_STDPERIPH_DRIVER
/**
* @brief Comment the line below if you will not use the peripherals drivers.
   In this case, these drivers will not be included and the application code will
   be based on direct access to peripherals registers
   */
  /*#define USE_STDPERIPH_DRIVER*/
#endif
这一段的作用是:如果还没有定义USE_STDPERIPH_DRIVER这个宏,就定义一下。
其中的英文注释里说:如果你不使用库函数的外设驱动代码,而是通过直接访问外设寄存器进行编程,
就可注释掉下面定义宏USE_STDPERIPH_DRIVER的这一句(#define USE_STDPERIPH_DRIVER),
所以在我们使用的寄存器版本中,这一句通常是被注释掉的。

假如我们要使用库函数,则需要这一句#define USE_STDPERIPH_DRIVER
然而事实上,看一看我们使用库函数的版本,这一句实际上也是被注释了的。
这是为了兼容寄存器版本和库函数版本,
在这种情况下,使用库函数编程时,在不改动stm32f10x.h文件的情况下,
我们就需要在工程配置“魔术棒”的C/C++选项卡中,手工添加定义:USE_STDPERIPH_DRIVER
这样,在使用库函数编程时,即使stm32f10x.h中的那一句宏定义被注释掉,我们仍然完成了USE_STDPERIPH_DRIVER的宏定义

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
 楼主| 发表于 2018-7-24 21:43:27 | 显示全部楼层
本帖最后由 warship 于 2018-7-24 21:50 编辑

如果直接操作寄存器进行编程,也就到此为止了,无须定义USE_STDPERIPH_DRIVER这个宏。

接下来,说使用库函数的情况,因为有了USE_STDPERIPH_DRIVER这个宏定义,
看stm32f10x.h的第8296行:
#ifdef USE_STDPERIPH_DRIVER
  #include "stm32f10x_conf.h"
#endif
这一段的作用是:如果定义了宏USE_STDPERIPH_DRIVER
就把头文件stm32f10x_conf.h包含进来。

stm32f10x_conf.h这个头文件非常关键,它是所有外设头文件的总闸门,为什么呢?
打开stm32f10x_conf.h这个头文件,可以看到类似的段落(从第28行开始):
"stm32f10x_conf.h" 第28行开始
//#include "stm32f10x_adc.h"
//#include "stm32f10x_bkp.h"
//#include "stm32f10x_can.h"
//#include "stm32f10x_cec.h"
//#include "stm32f10x_crc.h"
//#include "stm32f10x_dac.h"
//#include "stm32f10x_dbgmcu.h"
//#include "stm32f10x_dma.h"
//#include "stm32f10x_exti.h"
//#include "stm32f10x_flash.h"
#include "stm32f10x_fsmc.h"
//#include "stm32f10x_gpio.h"
//#include "stm32f10x_i2c.h"
//#include "stm32f10x_iwdg.h"
//#include "stm32f10x_pwr.h"
//#include "stm32f10x_rcc.h"
//#include "stm32f10x_rtc.h"
//#include "stm32f10x_sdio.h"
//#include "stm32f10x_spi.h"
//#include "stm32f10x_tim.h"
//#include "stm32f10x_usart.h"
//#include "stm32f10x_wwdg.h"
//#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
看到没有? 所有外设的配电闸刀都在这里,
需要用到哪个外设,就把这个外设相对应的那一行的注释去掉,也就包含了该外设的头文件。
不过,还要注意的是,要真正能够使用相应外设的驱动代码,
除了上面说的包含该外设的头文件外,
还得在工程中将库函数中的相应外设驱动的.c文件添加进来

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
 楼主| 发表于 2018-7-24 22:21:48 | 显示全部楼层
另外,要提一下的是,
在stm32f10x.h的第478行,有:
#include "core_cm3.h"
#include "system_stm32f10x.h"
也就是说,包含了stm32f10x.h,实质上也附带包含了以下这两个头文件:
core_cm3.h:定义CM3内核的私有寄存器,如NVIC等。
system_stm32f10x.h:定义了系统时钟相关的宏定义及时钟初始化函数(注意,这个并不是必须的,完全可以自编程序替代这部分)
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
 楼主| 发表于 2018-7-24 22:30:57 | 显示全部楼层
有些工程,可能还包含stm32f10x_it.h
虽然这个文件由STM写好了框架,但可以算是用户文件,
用于集中定义各种中断服务函数。
为增强模块化,一般把中断服务函数写在各自对应的硬件外设代码中,以便移植。
这样,stm32f10x_it.h及其stm32f10x_it.c就被抽空了,
以至于完全可以不需要这两个文件。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
 楼主| 发表于 2018-7-25 18:03:53 | 显示全部楼层
顺带来点题外话,
在我们说的最最重要的stm32f10x.h的开头部分,从第65行开始,有如下:
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
  /* #define STM32F10X_LD */     /*!< STM32F10X_LD: STM32 Low density devices */
  /* #define STM32F10X_LD_VL */  /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
  /* #define STM32F10X_MD */     /*!< STM32F10X_MD: STM32 Medium density devices */
  /* #define STM32F10X_MD_VL */  /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
  /* #define STM32F10X_HD */     /*!< STM32F10X_HD: STM32 High density devices */
  /* #define STM32F10X_HD_VL */  /*!< STM32F10X_HD_VL: STM32 High density value line devices */  
  /* #define STM32F10X_XL */     /*!< STM32F10X_XL: STM32 XL-density devices */
  /* #define STM32F10X_CL */     /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif
在这里必须根据工程所用的芯片,选择一种宏定义,将其中的注释去掉,否则就会提示错误:
"Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
这是因为不同的芯片,有一些细小差异,包括寄存器的数量、定义等,需要根据不同的宏定义加以选择取舍。
这一段的下面,还附有详细的选择参考,什么型号的MCU选择什么样的宏定义参数。

但是,我们大家从来就没有修改过这里,但是系统为什么也没有提示错误呢?
这是因为:我们在工程配置“魔术棒”的C/C++选项卡中,手工添加了定义:STM32F10X_HD
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
 楼主| 发表于 2018-7-25 18:24:05 | 显示全部楼层
借用一张图,以加深一下理解。
lib.png
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
 楼主| 发表于 2018-7-30 22:30:43 | 显示全部楼层
突然发现,我关心的东东都不是大家关心的东东,
或者,老司机对此都烂熟于心?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-10-1
在线时间
24 小时
发表于 2018-8-3 14:23:04 | 显示全部楼层
前天刚刚了解了一下,比我看到的东西多,学习寄存器的写法 会了解到这些
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-8-7
在线时间
3 小时
发表于 2018-8-8 12:21:11 | 显示全部楼层
大神写的很好,解决了我的疑惑。以后知道究竟该加那些头文件了。
回复 支持 反对

使用道具 举报

0

主题

295

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2019-3-26
在线时间
9 小时
发表于 2019-4-1 11:18:36 | 显示全部楼层
谢谢大家分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 13:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表