目录
0x01、库文件分析
1、解压下载的库文件,文件夹内容如下图所示
Libraries:驱动库的源代码及启动文件,这个非常重要,我们要使用的固件库就在这个文件夹里
面。
Project :用驱动库写的例子和工程模板,其中那些为每个外设写好的例程对我们非常有用,我们
在学习的时候就可以参考这里面的例程,非常全面,穷尽了外设的所有功能。
Utilities:基于ST官方实验板的例程
2、打开Libraries文件夹,文件夹下有CMSIS、STM32F10x_StdPeriph_Driver两个文件夹,展开
CMSIS文件夹,展开CM3文件夹,内容如下图所示
内核相关文件:
core_cm3.c :实现了一些操作内核外设寄存器的函数
Core_cm3.h :头文件里面实现了内核的寄存器映射,对应外设头文件stm32f10x.h,区别就是一
个针对内核的外设,一个针对片上(内核之外)的外设。
该头文件中包含了“stdint.h”这个头文件,这是一个ANSI C 文件,是独立于处理器之外的,就像我
们熟知的C 语言头文件“stdio.h”文件一样。位于RVMDK 这个软件的安装目录下,主要作用是提供
一些类型定义。这些新类型定义屏蔽了在不同芯片平台时,出现的诸如int 的大小是16 位,还是32
位的差异。所以在我们以后的程序中,都将使用新类型如uint8_t 、uint16_t 等。
/* exact-width signed integer types */
typedef signed char int8_t;
typedef signed short int int16_t;
typedef signed int int32_t;
typedef signed __INT64 int64_t;
/* exact-width unsigned integer types */
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned __INT64 uint64_t;
/* 7.18.1.2 */
/* smallest type of at least n bits */
/* minimum-width signed integer types */
typedef signed char int_least8_t;
typedef signed short int int_least16_t;
typedef signed int int_least32_t;
typedef signed __INT64 int_least64_t;
/* minimum-width unsigned integer types */
typedef unsigned char uint_least8_t;
typedef unsigned short int uint_least16_t;
typedef unsigned int uint_least32_t;
typedef unsigned __INT64 uint_least64_t;
启动文件:
启动文件放在startup/arm 这个文件夹下面,这里面启动文件有很多个,不同型号的单片机用的启
动文件不一样,有关每个启动文件的详细说明见表
Stm32f10x.h:这个头文件实现了片上外设的所以寄存器的映射,是一个非常重要的头文件,在内
核中与之想对应的头文件是core_cm3.h。
system_stm32f10x.c:实现了STM32 的时钟配置,操作的是片上的RCC 这个外设。系统在上
电之后,首选会执行由汇编编写的启动文件,启动文件中的复位函数中调用的SystemInit 函数就
在这个文件里面定义。调用完之后,系统的时钟就被初始化成72M。如果后面我们需要重新配置
系统时钟,我们就可以参考这个函数重写。为了维持库的完整性,我们不会直接在这个文件里面
修改时钟配置函数。
3、STM32F10x_StdPeriph_Driver 文件夹中
inc文件夹是库函数的头文件
src文件夹是库函数的C文件
4、展开根目录下的Project文件夹,打开里面的STM32F10x_StdPeriph_Template文件夹。
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 这个头文件即可,非常方
便。
0x02、创建工程模板
1、首先我们建立一个模板文件夹DEMO,在此文件夹中新建6个文件夹,分别为Doc、Output、
Project、User、Libraries、Listing。
名称 | 作用 |
Doc | 用来存放程序说明文件,由程序编写者添加 |
Libraries | 存放库文件 |
Listing | 存放编译器编译时产生的C/汇编/链接的列表清单 |
Output | 存放编译产生的调试信息、HEX文件、预览信息、封装库等 |
Project | 用来存放工程文件 |
User | 用户编写的驱动文件 |
2、在Libraries文件夹中新建CMSIS、FWLIB两个文件夹
3、 将库文件中的下列文件复制到CMSIS文件夹中
STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\CoreSupport中
core_cm3.c、core_cm3.h
STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x中
stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h
STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startu
p\arm中 startup_stm32f10x_hd.s
4、 将库文件中的下列文件夹复制到文件夹中FWLIB文件夹中
STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\STM32F10x_StdPeriph_Driver文件夹中的
inc和src文件夹
5、在DEMO文件夹中新建一个文本文档,在文档中输入如下内容,并更改文件名称为“keilkill.bat”
(一定要将扩展名更改为.bat,此部分代码是从它处摘录过来的,非原创)
del *.bak /s
del *.ddk /s
del *.edk /s
del *.lst /s
del *.lnp /s
del *.mpf /s
del *.mpj /s
del *.obj /s
del *.omf /s
::del *.opt /s ::不允许删除JLINK的设置
del *.plg /s
del *.rpt /s
del *.tmp /s
del *.__i /s
del *.crf /s
del *.o /s
del *.d /s
del *.axf /s
del *.tra /s
del *.dep /s
del JLinkLog.txt /s
del *.iex /s
del *.htm /s
del *.sct /s
del *.map /s
exit
6、将库函数STM32F10x_StdPeriph_Lib_V3.6.0\Project\STM32F10x_StdPeriph_Template目录下
的main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h这4个文件复制到模板
“DEMO\User”文件夹中。
7、在DOC文件夹中创建readme.txt文件
8、打开Keil uVision5,在“DEMO\Project”文件夹下新建一个工程,取名叫Demo。(如果是第一次
使用的话会打开一个自带的工程文件,我们可以通过工具栏Project->Close Project 选项把它关
掉)
这里我们以STM32F103RC为例
9、接下来我们为工程添加必要的文件,在Keil uVision5的项目管理器中,右键单击Target 1,选择
“Manage Project Items”
10、在线添加库文件,等下我们手动本地添加库文件,这里我们点击关掉在线添加,因为keil 的服
务器在国外,在线添加会非常慢。
11、接下来我们为工程添加必要的文件,在Keil uVision5的项目管理器中,右键单击Target 1,选
择“Manage Project Items”
12、组件窗口中,双击最左侧Target 1,更改名称为DEMO,在Groups中删除原有组,新建
CMSIS、FWLB、USER、DOC这几个组。
13、下面我们向组中添加文件,点击选中User,在最后面一栏Files栏下方点击添加文件,添加文
件路径如下
DEMO\User文件夹下的:main.c、stm32f10x_it.c
main.c:用户主函数
stm32f10x_it.c:中断服务函数
14、点击选中FWLB,点击添加文件,添加文件路径如下
DEMO\Libraries\FWLIB\src中的所有文件
这些文件是ST标准外设驱动函数.
15、点击选中CMSIS,点击添加文件,添加文件路径如下
DEMO\Libraries\CMSIS文件夹中的core_cm3.c
DEMO\Libraries\CMSIS文件夹中的system_stm32f10x.c
DEMO\Libraries\CMSIS文件夹中startup_stm32f10x_hd.s
16、点击选中DOC,点击添加文件,添加文件路径如下
DEMO\Doc文件夹中的readme.txt
0x03、Keil设置
1、点击keil环境中的目标选项按钮
2、修改Target选项卡中的晶振参数为8MHz,并勾选Use MicroLIB
选中微库“Use MicroLib”,为的是在日后编写串口驱动的时候可以使用printf 函数。
3、选择输出文件的文件夹,我们选择Output文件夹,再填写你要输出的文件命名,最后勾选产生
hex文件
4、在Listing选项卡中将其输出文件夹改为Listing文件夹
5、点击C/C++选项卡,在Define 里面输入添加STM32F10X_HD,USE_STDPERIPH_DRIVER 。
添加USE_STDPERIPH_DRIVER 是为了屏蔽编译器的默认搜索路径,转而使用我们添加到工
程中的ST的库,添加STM32F10X_HD 是因为我们用的芯片是大容量的,添加了
STM32F10X_HD 这个宏之后,库文件里面为大容量定义的寄存器我们就可以用了。芯片是小
或中容量的时候宏要换成STM32F10X_LD或者STM32F10X_MD。其实不管是什么容量的,我
们只要添加STM32F10X_HD 这个宏即可,当你用小或者中容量的芯片时,那些为大容量定义
的寄存器我不去访问就是了,反正也访问不了。
6、在“包含文件路径”栏点击,在这里添加库文件的搜索路径,这样就可以屏蔽掉默认的搜索路
径。
添加路径为:
DEMO\Libraries\CMSIS
DEMO\Libraries\FWLIB\inc
DEMO\User
7、我们使用SWD下载调试的时候还需要对下列设置进行修改,首先找到Options中的debug选项
卡,点击Settings
选择SW后,右面的对话框会出现如图所示选项,点击确定
再点开Utilities选项卡,点击下图中的Settings选项
按照下图进行设置
配置完成,现在我们就可以用SWD模式进行下载程序和在线调试了!