一.固件库文件分析
1-汇编编写的启动文件
startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始化中断向量表、配置系统时钟、对用C库函数_main最终去到C的世界
2-时钟配置文件
system_stm32f10x.c:把外部晶振时钟HSE=8M,经过PLL倍频为72M。
3-外设相关的
stm32f10x.h:实现了内核之外的外设的寄存器映射
xxx:GPIO、USRAT、I2C、SPI、FSMC
stm32f10x_xxx.c:外设的驱动函数库文件
stm32f10x_xxx.h:存放外设的初始化结构体,外设初始化结构体成员的参数列表,外设固件库函数的声明
4-内核相关的
CMSIS - Cortex 微控制器软件接口标准
core_cm3.h:实现了内核里面外设的寄存器映射
core_cm3.c:内核外设的驱动固件库
如NVIC(嵌套向量中断控制器)、SysTick(系统滴答定时器)
misc.h
misc.c
5-头文件的配置文件
stm32f10x_conf.h:头文件的头文件,包含所有外设头文件:不用一个一个包含了。
其实这个头文件被stm32f10x.h包含了,因此只需要包含stm32f10x.h即可包含所有头文件
//stm32f10x_usart.h
//stm32f10x_i2c.h
//stm32f10x_spi.h
//stm32f10x_adc.h
//stm32f10x_fsmc.h
......
6-专门存放中断服务函数的C文件-----中断功能太多单独做成文件
stm32f10x_it.c
stm32f10x_it.h
中断服务函数你可以随意放在其他的地方,并不是一定要放在stm32f10x_it.c
#include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>
int main(void)
{
// 来到这里的时候,系统的时钟已经被配置成72M。
}
二.固件库组成结构
Libraries:文件夹下是驱动库的源代码及启动文件,这个非常重要,我们要使用的固
件库就在这个文件夹里面。
Project :文件夹下是用驱动库写的例子和工程模板,其中那些为每个外设写好的例程
对我们非常有用,我们在学习的时候就可以参考这里面的例程,非常全面,简直就是
穷尽了外设的所有功能。
Utilities
:包含了基于
ST
官方实验板的例程,不需要用到,略过即可。
stm32f10x_stdperiph_lib_um.chm
: 库帮助文档,这个很有用,不喜欢直接看源码的可
以在合理查询每个外设的函数说明,非常详细。这是一个已经编译好的
HTML
文件,
主要讲述如何使用驱动库来编写自己的应用程序。说得形象一点,这个
HTML
就是告
诉我们:
ST
公司已经为你写好了每个外设的驱动了,想知道如何运用这些例子就来向
我求救吧。不幸的是,这个帮助文档是英文的,这对很多英文不好的朋友来说是一个
很大的障碍。但这里要告诉大家,英文仅仅是一种工具,绝对不能让它成为我们学习
的障碍。其实这些英文还是很简单的,我们需要的是拿下它的勇气。
其中进入
Libraries
文件夹看到,关于内核与外设的库文件分别存放在
CMSIS
和
STM32F10x_StdPeriph_Driver
文件夹中。
1.CMSIS文件夹
在
CoreSupport
文件夹中有
core_cm3.c
和
core_cm3.h
两个文件。
Core_cm3.h
头文件里
面实现了内核的寄存器映射,对应外设头文件
stm32f10x.h
,区别就是一个针对内核的外设,
一个针对片上(内核之外)的外设。
core_cm3.c
文件实现了一下操作内核外设寄存器的函
数,用的比较少。
我们还需要了解的是
core_cm3.h
头文件中包含了“
stdint.h
”
这个头文件,这是一个
ANSI C
文件,是独立于处理器之外的,就像我们熟知的
C
语言头文件 “
stdio.h
” 文件一
样。位于
RVMDK 这个软件的安装目录下,主要作用是提供一些类型定义。如下
typedef
unsigned
char
uint8_t;
typedef
unsigned
short int
uint16_t;
typedef
unsigned
int
uint32_t;
typedef
unsigned
__int64
uint64_t;
这些新类型定义屏蔽了在不同芯片平台时,出现的诸如
int
的大小是
16
位,还是
32
位
的差异。所以在我们以后的程序中,都将使用新类型如
uint8_t
、
uint16_t
等。
在稍旧版的程序中还经常会出现如
u8
、
u16
、
u32
这样的类型,分别表示的无符号的
8
位、
16
位、
32
位整型。初学者碰到这样的旧类型感觉一头雾水,它们定义的位置在
STM32f10x.h
文件中。建议在以后的新程序中尽量使用
uint8_t
、
uint16_t
类型的定义。
2.STM32F10x_StdPeriph_Driver 文件夹
src
里面是每个设 备外设的驱动源程序,inc
则是相对应的外设头文件。
src
及
inc
文件夹是
ST
标准库的主要内容
。
3. stm32f10x_it.c
、
stm32f10x_conf.h
和
system_stm32f10x.c
文件
文件目录:
Project\STM32F10x_StdPeriph_Template
在这个文件目录下,存放了官方的一个库工程模板,我们在用库建立一个完整的工程
时 , 还 需 要 添 加 这 个 目 录 下 的
stm32f10x_it.c
、
stm32f10x_it.h
、
stm32f10x_conf.h
和
system_stm32f10x.c
这四个文件。
stm32f10x_it.c
:这个文件是专门用来编写中断服务函数的,在我们修改前,这个文件
已经定义了一些系统异常
(
特殊中断
)
的接口,其它普通中断服务函数由我们自己添加。但
是我们怎么知道这些中断服务函数的接口如何写?是不是可以自定义呢?答案当然不是,
这些都可以在汇编启动文件中找到,在学习中断和启动文件的时候详细介绍
system_stm32f10x.c
:这个文件包含了
STM32
芯片上电后初始化系统时钟、扩展外部
存储器用的函数,例如我们前两章提到供启动文件调用的“
SystemInit
”函数,用于上电后
初始化时钟,该函数的定义就存储在
system_stm32f10x.c
文件。
STM32F103
系列的芯片,
调用库的这个
SystemInit
函数后,系统时钟被初始化为
72MHz
,如有需要可以修改这个文
件的内容,设置成自己所需的时钟频率,但鉴于保持库的完整性,我们在做系统时钟配置
的时候会另外重写时钟配置函数。
stm32f10x_conf.h
:这个文件被包含进
stm32f10x.h
文件。当我们使用固件库编程的时
候,如果需要某个外设的驱动库,就需要包含该外设的头文件:
stm32f10x_ppp.h
,包含一
个还好,如果是用了多外设,就需要包含多个头文件,这不仅影响代码美观也不好管理,
现我们用一个头文件
stm32f10x_conf.h
把这些外设的头文件都包含在里面,让这个配置头
文件统一管理这些外设的头文件,我们在应用程序中只需要包含这个配置头文件即可,我
们又知道这个头文件在
stm32f10x.h
的最后被包含,所以最终我们只需要包含
stm32f10x.h
这个头文件即可,非常方便。
三.建立模板步骤
1.
新建本地工程文件夹
为了工程目录更加清晰,我们在本地电脑上新建一个“工程模板”文件夹,在它之下
再新建
6
个文件夹,具体如下:
在本地新建好文件夹后,把准备好的库文件复制到相应的文件夹下:
2.
新建工程,创建组文件夹到工程,添加文件到组文件下
3.小细节处理
在
C/C++
选项卡中添加处理宏及编译器编译的时候查找的头文件路径。如果头文件路
径添加有误,则编译的时候会报错找不到头文件。把有头文件的文件夹全部包含进去,软件只能识别头文件的上一级目录文件夹,Keil太蠢。
在这个选项中添加宏,就相当于我们在文件中使用“
#define
”语句定义宏一样。在编
译器中添加宏的好处就是,只要用了这个模版,就不用源文件中修改代码。
STM32F10X_HD
宏:为了告诉
STM32
标准库,我们使用的芯片类型是
STM32
型号是大容量的,使
STM32
标准库根据我们选定的芯片型号来配置。
USE_STDPERIPH_DRIVER
宏:为了让
stm32f10x.h
包含
stm32f10x_conf.h
这个头
文件。