温馨提示:图片中包含的相关目录在页面放大的情况下观看更清晰
看懂此教程后,包你对STM32的开发中减少绝大部分疑惑!
2、STM32F1xx Cortex-M3 Keil uVision 环境搭建及建立工程
①内容及目的:以安装MDK5为例搭建STM32开发环境
②准备工作:MDK5安装包(破解版,商业行为请购买正版!)
安装过程:略(鉴于大家多数都是玩过单片机的,对于MDK不再陌生,安装过程很简单,并且网上的安装及破解教程很多)
③什么是STM32的库?
STM32库是由ST公司针对STM32提供的函数接口,即API(Application Program Interface),使用STM32的开发者可以调用这些函数接口来配置STM32的寄存器,使开发人员得以脱离最底层的寄存器操作(当然你很乐意玩抽象的寄存器的话,也可以试试寄存器版的STM32开发!只能说,然并卵!ST的工程师已经帮你做了这部分开发工作,那么较真干嘛
),有开发快速、易于阅读、维护成本低的优点。
当我们调用库里的API时可以不用挖空心思去了解库底层的寄存器操作,就像我们最初学习C语言时使用printf()函数一样,不用去研究它的代码如何实现,只需要学会它的使用格式即可!
有过编码经验的开发人员都知道库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。
④STM32结构及库层次关系
必须了解什么是“CMSIS标准”!
CMSIS是ARM公司与多家不同的芯片和软件供应商一起紧密合作定义的,提供了内核与外设、实时操作系统和中间设备之间的通用接口。同样,我们使用STM32,ST公司使用ARM公司的Cortex-M3芯片技术的授权,提供了在内核之外的部件,被我们称之为片上外设。如STM32芯片内部的模数转换器ADC、串口UART、定时器TIM等。
CMSIS标准中最主要的是CMSIS核心层,它包括:
※内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要有ARM公司定义
※设备外设访问层:提供了片上外设的地址和中断定义,主要由像ST这样的芯片生产厂商提供
可见CMSIS层位于硬件层与操作系统或用户层之间,提供了与芯片厂商无关的硬件抽象层,可以为借口外设、实时操作系统提供简单的处理器软件接口,屏蔽了各个芯片厂商的硬件差异,对软件的移植具有很大的好处。STM32固件库就是按照CMSIS标准建立的。也就是说如果今后我们学习其他芯片厂商如NXP、TI、Freescale、ADI等生产的Cortex-M3时同样可以灵活使用,达到举一反三。
那么在此我就提供一个STM32开发人员经常使用的STM32固件库,其实在网络中很容易下载得到,这里我借花献佛提供给伸手党
STM32F10x_StdPeriph_Lib_V3.5.0.rar
以及固件库开发相关的文档
STM32固件库使用手册的中文翻译版.pdf
Stm32寄存器与库函数概览(摘自固件库使用手册).doc
更多资料后续陆续上传......
⑤库目录、文件简介
有了固件库文件,那么它的目录下面的目录和文件是做什么用的呢?
以上提供的3.5的固件库解压后内容如下:

1)_htmresc : ST 的logo 完全无用,不用理会
2)Libraries: 比较重要的文件包含STM32的系统文件和大量头文件,也就是库文件了
3)Project: 包含大量外设的例程,和各个软件版本的评估版工程模板。KEIL 对应的就是MDK-ARM 文件下的工程模板。你也可以利用这个工程模板来修
改,得到你自己的工程模块(不推荐)
4)Utilities: 就是评估版的相关文件:暂时不会用到,无视
5)Release_Notes.html:库版本更新说明
6)最后一个带问号的是库使用帮助文档
还有以上这些目录下的文件,如
core_cm3.c/.h :CMSIS标准的核内设备函数层的CM3核通用的源文件和头文件

system_stm32f10x.c:此文件的功能是设置STM32复杂的系统时钟和总线时钟

stm32f10x.h:包含STM32中寄存器地址和结构体类型定义,使用到STM32固件库的地方都要包含此头文件
启动文件:不同的文件对应不同的芯片型号,使用时需要注意
※cl:互联型产品,stm32f105/107系列
※vl:超值型产品,stm32f100系列
※xl:超高密度(容量)产品,stm32f102/103系列
※ld:低密度产品,flash小于64KB
※md:中等密度产品,flash等于64KB或128KB
※hd:高密度产品,flash大于128KB
提示:本次活动采用的是STM32F103C8T6,flash为64KB,故在下面将要建立的MDK工程中选择英文缩写为md的文件!

STM32F10x_StdPeriph_Driver文件夹:包含inc(include)和src(source)两个文件夹,属于CMSIS设备外设函数。src里面的每个设备外设驱动程序.具体到每个.c文件的用途,有点单片机知识的都会知道是干什么用的,以后在使用中用到再提一下。

stm32f10x_it.c和stm32f10x_conf.h:下图的文件夹下存放了官方的库工程模板,我们在用库建立一个完整的工程时,需要添加stm32f10x_it.c、stm32f10x_it.h和stm32f10x_conf.h这三个文件。stm32f10x_it.c专门用来编写中断服务函数,其中包含了相当多的中断函数接口,实现函数都是空的,需要开发人员自己编写实现中断处理函数,并且这些中断处理函数的名称是不可以随便修改的。stm32f10x_conf.h文件被包含在了stm32f10x.h文件中,用来配置工程当中使用了什么外设的头文件。
其它:略

一、建立工程模板
1)启动Keil uVision5,通过工具栏Project->New uVision Project新建工程,并保存在事先计划好的目录下

2)接下来选择目标器件,此次活动选用的是STM32F103C8T6
由于MDK5的特性和之前版本有些许差别,这里会弹出我已经安装过的器件系列,之前玩过BLE,所以会出现这个,选择默认的第一个选项跳转到器件选择

选择相应器件


这里会弹出我之前下载安装过的一些东西,先无视,直接 ok


新建立的工程下目录是空的,为了便于工程的结构清晰,我们首先需要在工程目录下建立这样几个新文件夹
USER(用于存放工程文件和用户层代码,包裹主函数main.c)
FWlib(用于存放STM32库里的inc和src这两个文件夹,这两个文件夹包含了芯片上的所有驱动,这两个文件夹下的文件是不需要我们修改的)
CMSIS(用于存放库为我们自带的文件和一些位于CMSIS层的文件)
Output(用于保存软件编译厚输出的文件,如最终的烧写到STM32的flash里的.HEX文件)
Listing(由于MDK编译生成的大量链接文件,便于归类,建立此文件夹加以保存)
...
这些文件夹不是必须的,只是为了做一个习惯良好的“处女座”(PS:其实楼主是巨蟹!)
楼主事先建好的文件夹,已经添加好相应的文件

步骤:
1)将下图的inc和src文件夹放在自己建立的工程目录下的目录FWlib(楼主的.../Demo/FWlib)

放置后的结果

2)将下图的工程模板放到USER目录下(楼主的.../Demo/USER)

放置后的结果

3)将下图的几个文件和文件夹放在CMSIS文件夹下(楼主的.../Demo/CMSIS)


放置后的结果

好了,接下来回到Keil工程
右键Target1图标->Manage Project Iterms...
弹出的对话框添加以上几个文件夹,相应的,你可以在该工程文件夹下手动先建立这几个文件夹STARTCODE、USER、FWlib、CMSIS


向这几个工程文件夹下添加相应的文件或/和文件夹
STARTCODE工程文件夹下为启动文件(此次活动主器件STM32F103C8T6对应startup_stm32f10x_md.s)

USER工程文件夹下添加main.c和stm32f10x_it.c

FWlib工程文件夹下添加src文件夹下的所有.c文件(当然遇到具体的需求按照需求添加,有些文件可能不需要,全选会避免漏掉某个文件,但是会大大延长Keil编译工程的时间)

CMSIS工程文件夹下添加core_cm3.c、system_stm32f10x.c文件
至此,MDK工程已经基本能建好

接下来配置MDK的某些选项卡
点击Options for Target...选项

1)Output选项指向我们建立的Output文件夹,选中Create HEX File选项

2)ListingOutput选项指向我们建立的Listing文件夹

3)在C/C++选项的下图两个地方添加内容
其中Define:栏添加两个宏定义:USE_STDPERIPH_DRIVER,STM32F10X_MD
添加USE_STDPERIPH_DRIVER时因为我们使用ST的官方库,添加STM32F10X_MD是因为我们使用的芯片是中等容量的。
在Include Path:栏添加头文件目录

添加完成后的结果

4)由于本次活动提供了串口和SWD两种程序下载接口,在Keil工程中以STLink为下载器设置相关选项

下图选择SW模式

Flash Download选项添加芯片下载算法

若下载完复位并且启动,勾选此项
Utilities选项勾选去除图中选项
选择STLink
至此,所有设置完毕!