STM32F1固件库文件讲解与基于固件库新建MDK工程模板
操作系统:win10
1.文件目录

(在cmd下用"cd 文件夹" 进入到要显示的文件夹,如cd d:\en.stsw-stm32054,然后输入tree 回车就会出现上图的目录结构)
Libraries 文件夹下面有CMSIS和STM32F10x_StdPeriph_Driver两个目录, 其 中CMSIS目录下面是启动文件,STM32F10x_StdPeriph_Driver放的是STM32固件库源码文件。源文件目录下面的inc目录存放的是stm32f10x_xxx.h头文件,无需改动。src目录下面放的是stm32f10x_xxx.c格式的固件库源 码文件。每一个.c 文件和一个相应的.h 文件对应。这里的文件也是固件库的核心文件,每个外设对应一组文件。
Project 文件夹下面有两个文件夹。顾名思义, STM32F10x_StdPeriph_Examples 文件夹下面存放的 ST 官方提供的固件实例源码,在以后的开发过程中,可以参考修改这个官方提供的实例来快速驱动自己的外设,很多开发板的实例都参考了官方提供的例程源码,这些源码对以后的学习非常重要。 STM32F10x_StdPeriph_Template 文件夹下面存放的是工程模板。
Utilities 文件下就是官方评估板的一些对应源码,这个可以忽略不看。根目录中还有一个 stm32f10x_stdperiph_lib_um.chm 文件,直接打开可以知道,这是一个固件库的帮助文档,这个文档非常有用,只可惜是英文的,在开发过程中,这个文档会经常被使用到。
2.文件介绍
先看下图这个文件夹下的文件

有两个文件

这两个文件是是 CMSIS 核心文件,由ARM公司提供。对于使用STM32做开发的人来说永远不需要用这个文件。
再看下图这个文件夹

有一个文件夹(startup)一个html文件以及三个文件

其中system_stm32f10x.c 和对应的头文件 system_stm32f10x.h 文件的功能是设置系统以及总线时钟,这个里面有一个非常重要的 SystemInit()函数,这个函数在我们系统启动的时候都会调用,用来设置系统的整个时钟系统。
stm32f10x.h 这个文件就相当重要了,只要你做 STM32 开发,你几乎时刻都要查看这个文件相关的定义。这个文件打开可以看到,里面非常多的结构体以及宏定义。 这个文件里面主要是系统寄存器定义申明以及包装内存操作。
接下来再看startup文件夹,这个文件夹里面放的文件顾名思义是启动文件 ,里面有四个文件夹:


arm文件下的文件

这里之所以有 8 个启动文件,是因为对于不同容量的芯片启动文件不一样。对于 103 系列,主要是用其中 3 个启动文件:

3.新建基于固件库的 MDK5 工程模板
1) 建立一个装所有工程的文件夹。在建立工程之前,建议用户在电脑的某个目录下面建立一个文件夹,后面所建立的工程都可以放在这个文件夹下面,这里我建立一个文件夹为STM32Project。

说明:工作中用到的所有项目的工程我都放在Project文件夹里,比如上图中的JavaProject是做java项目的,AltiumDesignerProject是画PCB板的,同样,STM32Project文件夹是专门用来存放与STM32开发的工程文件夹,所有的STM32工程都放在这个文件夹下(包括接下来要建的Template工程,Template工程是一个工程模板,以后建新工程可以直接在此基础上做而不用从头开始)
2)正式开始建立工程模板,在刚刚新建的STM32Project文件夹下新建一个文件夹名为Template,该文件夹用于存放工程模板,Template文件夹下新建USER文件夹。

点击 MDK 的菜单: Project –>New Uvision Project ,然后将目录定位到刚才建立的Template之下的USER文件夹,工程命名为Template,点击保存。

选择芯片型号

我用的是STM32F103ZET6所以选择如下:

点击OK后会显示如下对话框(Manage Run-Time Environment):

在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境, 由于我暂时不需要,所以直接点击Cancel。
然后就出现如下界面:

对应的USER文件下的文件如下:

Listings 和 Objects文件夹是 MDK 自动生成的文件夹,用于存放编译过程产生的中间文件。这里,我们把两个文件夹删除,我们会在下一步骤中新建一个 OBJ 文件夹,用来存放编译中间文件。
3)构建文件目录
在Template文件夹下新建3个文件夹CORE,OBJ以及STM32F10x_FWLib如下:

CORE 用来存放核心文件和启动文件
OBJ 是用来存放编译过程文件以及 hex 文件
STM32F10x_FWLib 文件夹顾名思义用来存放 ST 官方提供的库函数源码文件。
USER 目录下除了用来放工程文件外,还用来存放主函数文件main.c以及其他文件包括 system_stm32f10x.c
4)添加固件库文件,执行如下复制操作

src 存放的是固件库的.c 文件, inc 存放的是对应的.h 文件
5)添加启动文件
执行如下复制操作

然后再执行如下操作,复制startup_stm32f10x_hd.s到CORE文件夹下:

STM32F103ZET6 是大容量芯片,所以选择startup_stm32f10x_hd.s。
现在CORE文件下下共有三个文件:

6)执行如下复制操作

7)执行如下复制操作

8)经过前面的这些步骤就把需要用到的固件库文件复制到工程目录下了
接下来把这些文件添加到工程中:
右击Target1选择Mange Project Items

9)在弹出的对话框中执行如下操作:

现在工程变成这样了:

10)下面开始添加文件到工程中
右键Temlate选择Mange Project Items

执行如下操作

定位到我们刚才建立的目录STM32F10x_FWLib/src下面,把所有文件添加进去

添加之后如下:

这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f10x_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。
用同样的方法,选择CORE添加如下文件:

用同样的方法,选择USER添加如下文件

点击OK回到主界面

11)接下来编译工程
选择魔术棒工具设置编译中间文件目录位OBJ



现在编译还不行会出错,如下:

大多是提示找不到.h文件
下面我们要告诉 MDK,在哪些路径之下搜索需要的头文件,也就是头文件目录。
点击魔术棒工具执行如下操作

然后执行下面的操作添加目录:

需要添加的有三个目录,添加之后的样子:

OK之后,在Define里添加:STM32F10X_HD,USE_STDPERIPH_DRIVER

如果你用的是中容量那么 STM32F10X_HD 修改为 STM32F10X_MD,小容量修改为 STM32F10X_LD然后点击 OK。
然后双击打开main.c文件,删掉自带代码添加如下:
#include "stm32f10x.h"
void Delay(u32 count)
{
u32 i=;
for(;i<count;i++);
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOE, ENABLE); //使能 PB,PE 端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度为 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化 GPIO
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高
while()
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
Delay();
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
Delay();
}
}
编译:

先点第一个再点第二个


4.说明
以上内容绝大多数来自正点原子开发板的配套教程,写在这并不是想借别人的东西唬人,而是为了自己一步一步走一遍更熟悉这个过程。同时由于原版教程是xp下而我用的是win10怕有不兼容的地方故记录下。原文可去正点原子论坛下载,他们开源。
正点原子论坛:http://www.openedv.com/
STM32F1固件库文件讲解与基于固件库新建MDK工程模板的更多相关文章
- STM32基于固件库新建MDK工程模板(精简版)
上个博文理论讲解的东西太多,太复杂,这里把所有步骤全部贴出 1.新建一个工程文件夹LED 2.LED文件夹下建立如下文件夹 3.Project –>New Uvision Project 到US ...
- OpenCV 例子代码的讲解、简介及库的安装 .
转载请标明是引用于 http://blog.csdn.net/chenyujing1234 欢迎大家提出意见,一起讨论! 一.OpenCV介绍: OpenCV是由Intel性能基元(IPP)团队主持, ...
- 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序
很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...
- [转] Makefile 基础 (9) —— Makefile 使用make更新函数库文件
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...
- linux 头文件和库文件的设置
GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径.自己指定的路径就不说了,这里说明一下系统自动搜索的路径. [1]include头文件路径 除了默认的/us ...
- Linux库文件路径的添加
库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用 ...
- linux下C/C++编译时系统搜索 include 和 链接库 文件路径的指定
C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径.自己指定的路径就不说了,这里说明一下系统自动搜索的路径. ...
- LabWindows/CVI入门之第四章:库文件(转)
按语: 在参考CVI参考书使用CVI生成动态库后,在另一工程中调用DLL ,编译通不过,后参考此文,豁然开朗. http://blog.sina.com.cn/s/blog_6373e9e60101b ...
- TCL:使用、添加库文件
>直接引用工具自带的库文件 通过指令: .1查看能直接调用的库文件路径 #可以查到工具默认库文件路径,一般包括回显中的路径以及回显中路径的父路径. info library #D:/Script ...
随机推荐
- Bash的一些零星笔记
1.变量带入操作符 在脚本中,使用变量前做检查是很重要的.通过代入操作符,可以实现这方面的功能.比如当变量未赋值时为变量赋默认值,以及更多内容: ${parameter:-默认为空}:当paramet ...
- Java内部抽象类的匿名类初始化
说在前面的话,以前写过一次这个变态代码,后来重构,把那个new的语法简化了,最近又要整,差点都想不起来了,留个文档把 1.下面这个案例更变态,抽象类还有一个个泛型类:首先内部抽象类的定义: /* * ...
- Android 加载GIF图最佳实践
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/75578109 本文出自[赵彦军的博客] 起因 最近在项目中遇到需要在界面上显示一个 ...
- Java的精确整数计算-Bigdecimal学习总结和工具类
随笔:随着最近工作需要,回首需要涉及到一些精确的数据计算,就需要用到Bigdecimal,索性就趁着闲暇之余整理收集一下关于Bigdecimal的使用方法,由于时间的原因,整理的并不是特别详细,但相信 ...
- 使用nginx缓存服务器上的静态文件
一.nginx缓存的优点 如图所示,nginx缓存,可以在一定程度上,减少源服务器的处理请求压力. 因为静态文件(比如css,js, 图片)中,很多都是不经常更新的.nginx使用proxy_cach ...
- [ASP.NET MVC] Controlle中的Aciton方法数据接收方式
POST数据接收方式包括: 1.request.Form:(逐个获取表单提交的数据); FormCollection: [HttpPost]public async Task<string> ...
- 二叉树,AVL树和红黑树
为了接下来能更好的学习TreeMap和TreeSet,讲解一下二叉树,AVL树和红黑树. 1. 二叉查找树 2. AVL树 2.1. 树旋转 2.1.1. 左旋和右旋 2.1.2. 左左,右右,左右, ...
- 洛谷 P1613 解题报告
P1613 跑路 题目描述 小\(A\)的工作不仅繁琐,更有苛刻的规定,要求小\(A\)每天早上在\(6:00\)之前到达公司,否则这个月工资清零.可是小\(A\)偏偏又有赖床的坏毛病.于是为了保住自 ...
- 【问题】sql数据库报无效的数据证书,需重新安装
事情的经过: 今天打开sql2014数据库,没有成功运行,但是给我弹出一个"无效的数据证书,需要重新安装!"提示.什么情况.为什么,应该是前一天弄vs导致的.因为升级了vs2017 ...
- Nordic nRF51/nRF52开发环境搭建
本文将详述Nordic nRF51系列(包括nRF51822/nRF51802/nRF51422等)和nRF52系列(包括nRF52832/nRF52810/nRF52840)开发环境搭建. 1. 强 ...