使用keil建立标准STM32工程模版(图文详细版!)

1.   模板工程的创建(超级详细版,使用的是keil 4.5版本)

1.1创建工程目录

良好的工程结构能让文件的管理更科学,让开发更容易更方便,希望大家养成良好的习惯,使用具有合理结构的工程目录,当你着手于较大的软件项目时,类别分明,层次合理的工程目录结构会让你的开发管理化繁为简。

(1)首先在一个目录下创建主文件夹,名字按需求取,这里取名为:(0)工程模板

(2)在该文件夹里分别建立名字为ProjectSource的文件夹。其中Project文件夹用来放置工程文件,而Source用来放置程序代码文件。


(3)Project文件夹里建立名字为ObjList的文件夹,这是用来存放工程编译文件的。


         (4)然后在Source文件夹中建立3个名字分别为ApplicationDriversSTM32_FWLib的文件夹。Application是用来放置应用程序文件的,例如main.c,和一些应用配置文件,如stm32f10x_it.c,stm32f10x_conf.hDrivers是用来放置驱动程序文件的,STM32_FWLib是用来放置ST固件库文件的。

 


         (5)Application中添加一个名为main的文件夹。如果有其他应用程序,比如一些纯软件算法之类的代码文件可以放置在一个新文件夹中然后放在Application文件夹中,例如有一个Bmp图像解码的程序模块bmp.cbmp.h,那么我们在Application中新建一个文件夹叫BMPDecoder,然后把bmp.cbmp.h放在BMPDecoder文件夹中,以此类推。


         (6)main文件夹中添加以下文件,


         (7)回到Source文件夹中,在Drivers文件夹下创建驱动文件目录,根据工程需要添加驱动目录,也可以预先添加驱动文件夹,留作以后用。


(8)Led_Drvier中添加Led的驱动文件,如果要使用到串口驱动和按键驱动,按照上述说明在对应的文件夹中添加对应的驱动文件。


         (9)回到Source文件夹下,在STM32_FWLib文件夹下添加ST固件库,库文件直接从官方固件库下拷贝过来,在光盘资料中的

\软件资料\STM32固件库(3.0.0)\stm32f10x_stdperiph_lib_v3.0.0\Libraries\路径下存放有



(10)直接在STM32固件库(3.0.0中的CMSIS拷贝到STM32_FWLib下,这些库文件是和CotexM3内核相关的固件,其中Starup下放置着STM32的启动代码。



(11)然后从固件库的STM32F10x_StdPeriph_Driver中的两个文件夹incsrc到拷贝到

FWLib文件夹中。inc中是固件库的头文件,src是固件库的c代码文件



完成上述步骤后,工程目录就创建好了,下一步就是建立STM32的工程的方法。

 

1.2建立MDK平台下的STM32工程

(1)双击进入keil4

 

(2) 关闭当前打开的工程,方法是:点击Project->CloseProject

 

(3)新建一个工程,点击Project->NewuVision Project


(4)选择工程保存的路径

 

 

 

(5)填写工程名字,最好填写英文名字,不要含有中文,命名为Red Leaves STM32Demo

 

(6)选择MCU类型,我们的开发板是STM32F103ZET6,那么我们选择的类型则为STM32F103ZE

 

 

(7)我们选择不从keil的安装目录下复制启动代码文件到工程中,过后我们自己手动添加,我们使用来自工程目录的固件中的启动代码,文件在下面的路径中

(0)工程模板\Source\STM32_FWLib\CMSIS\startup\startup_stm32f10x_hd.s

 

(8)点击Manage Components在工程中创建文件目录,选择否!

 

 

(9)修改Project Target的名字为Red Leaves(名字是可以根据自己需要命名的),新建4个分组,分别命名为Starup,Application,Drviers,FWLib。注意一点,这里新建4个组后,根据代码文件功能的不同而添加在对应的组下,但这些组仅仅起到一个分类作用而已,就是让人看得觉得一目了然,并没有起到路径的作用。如果你喜欢,你也可以不建立分组,把所有文件都丢在一起,一堆一堆的,但是这样相信大家自己看得都烦,尤其是工程比较大,上百个,甚至上千个文件的时候,不分类放,你想要编辑的文件自己都找不到,更别说别人了。分类放置是一种必须养成的良好习惯,分组如何分呢,最好和我们之前创建的代码工程目录一致,也可以根据需要稍作调整。



 

(10)在Starup里添加starup_stm32f10x_hd.s,该启动代码文件在路径

0)工程模板\Source\STM32_FWLib\CMSIS\startup\starup_stm32f10x_hd.s

 

(11)在Applicaiton里添加文件,这里要提一点,keil只需要编译c文件,只需要添加c文件进来即可,而添加h进来对keil来说是没有必要的,其他的编译器也是如此。但是笔者比较喜欢把h文件也添加进来,这样方便查找和编辑,处于这个目的,就把h文件也添加进来了。

步骤和(10)一样,文件相信大家都知道,在0)工程模板\Source\Application\main中。


 

(12)给Drivers这一组添加文件,把工程用到的驱动都添加进来

 

 

(13)给FWLib添加文件,添加的是ST固件文件,你的程序里用到STM32的什么资源就添加什么固件驱动文件进去,但是不管你使用了什么资源,core_cm3.c,system_stm32f10x.c,misc.c,stm32f10x_rcc.c这几个文件是必须要有的,算是STM32正常运行的基本固件。添加完毕后点击OK退出。

 

(14)我们在使用一些文件模块的时候,往往需要在程序文件顶部先include进来

比如#include "stm32f10x.h",#include "Led_Driver.h",才能使用程序模块的功能函数,但是编译器怎么知道这些头文件在哪里呢,要知道,这些头文件是放在不同目录下的,这就要求我们设置一些路径变量了,让编译器在这些路径下查找h文件,程序才能顺利编译。

点击,在C/C++里的Include Paths中把路径给填写上,也就是把你的程序工程中有h文件的目录路径名填写在其中,所有路径都以所在的路径为参考路径。比如说main.h,它在\Source\Application\main这一路径下,而Project文件夹和Source文件夹处于同级目录,Red Leaves STM32 Demo.uvproj这个文件在Project文件夹中,那么以Red Leaves STM32 Demo.uvproj为参照点,main.h填写在Include Paths中的路径名就是 .. \Source\Application\main,其中“..”代表上级目录。所以main.h处在Red Leaves STM32 Demo.uvproj的上级目录Source下的Application目录下的main目录中,有点拗口吧。

 

 


(15)我们在写程序的过程中有时候会用到标准库中的库函数,比如我们常用的printf()就是在stdio库中的,我们要向在程序中正常使用库,那么就必须把使用库这一选项勾选上。

 


          补充3点,使用3.5版本的STM32固件库还需要把固件库的宏添加到工程选项中



    选择Obj和List文件存放的路径,定位到第(3)步中的obj和list文件夹

 


(16)说了这么多,我们现在可以来编译一下新建好的模板程序了,点击编译,完全ok。最后笔者再啰嗦一回,如果你添加了新的程序模块或者固件库,那么必须记住3点,一是在工程中添加c文件。第二点,在Target Options中填写Include Paths。第三点,在使用程序模块的地方上记得#include“xxx.h”。下面以ST固件添加做图例。

 




2.    模板工程的使用

我们做这样一个模板的目的就是可以更方便大家的开发,按照一定的步骤,我们就可以迅速的建立自己的工程并如搭积木似的扩展功能,这样可以省时省力。下面我们以添加串口功能为例说明如何在模板的基础上做功能的扩展。

(1)Source\Drviers目录下新增加Usart_Drvier文件夹(如果有就不用新建啦),并把Usart_Drvier.cUsart_Drvier.h放在Usart_Drvier文件夹中。


(2)Usart_Drvier.c添加到工程中的Drivers组下,然后把stm32f10x_usart.c添加到FWLib组下


(3)在TargetOptions的C/C++的Include Paths下把Usart_Driver.h的路径填写上。

 

(4)由于串口使用到了固件库中的stm32f10x_usart.c的资源,所以要在stm32f10x_conf.h

中把stm32f10x_usart.h包含进来。


(5)由于Usart_Drvier.c要使用到库中的函数printf()等等,所以要勾选上Use MicroLib的选项。

 

(6)然后在main.h中添加#include“Usart_Driver.h”。这样在main.c中就能使用Usart_Driver.c的功能函数了。

 

总结

    对于初学者来说,刚开始建立有一定结构的工程目录觉得会有些繁琐,但是一但熟悉后,养成习惯后就不会觉得有什么了,万事开头难嘛。

本文模版工程到http://download.csdn.net/detail/zsy2020314/5744187免费下载

 

转载于:https://www.cnblogs.com/java20130723/p/3211363.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android竖直和横向,如何在android中为纵向和横向模式定义不同的控件

定义,在这两种资源的文件出现在你的代码 并在onCreate()在所有视图中Activity可以检查方向绑定的意见,你的类的对象。示例。在这里我们有包含在这两个文件的ImageView的,并在画像文件有一个TextView和景观它包含Button代替TextViewmy_layout.…

正则表达式匹配多个字符串中的一个

正则表达式匹配多个字符串中的一个 当我们采集数据时&#xff0c;会用到正则匹配功能 (前缀)(?<content>[\s\S]*?)(后缀) 例如采集产品多图时&#xff0c;前缀与后缀部分一般情况下是不相同的&#xff0c;这就需要用到正则的“|” (href"|src")(?<conten…

与驱动有关的面试问题

以下内容源于网络资料的整理学习。 参考博客 嵌入式驱动那年的笔试面试-有干货_BeyondTheBoundary的博客-CSDN博客_芯动科技嵌入式笔试 嵌入式驱动工程师面试题集锦_shx516857593的博客-CSDN博客 嵌入式面试中可能问到的题目和答案整理&#xff08;内核驱动篇&#xff09;_…

爬虫那些事儿-- 简介

从事爬虫相关的工作已经两年多了。简要做下总结。 爬虫(Crawler)&#xff0c;有些也叫蜘蛛&#xff08;Spider&#xff09;&#xff0c;用来从互联网下载网页。是搜索引擎的重要组成。爬虫是搜索引擎的数据来源&#xff0c;是数据的入口。爬虫的基本思想是认为整个互联网类似于…

android模拟机新闻APP,DavidTGNewsProject

DavidTGNewsProject##【Android】最新主流新闻app功能实现。仿网易,搜狐等新闻客户端(原创作品&#xff0c;转载请说明出处)先给大家看一下效果图&#xff1a;这个项目总体来说虽然不是特别难&#xff0c;但是确实非常常用的功能。是业余时间自己写的一个小项目。以前我们写的时…

轻操作动作休闲单机游戏《狂斩三国2》评测

游戏类别&#xff1a;动作休闲单机游戏时隔一年&#xff0c;曾在国内和台湾手游市 场获得top1佳绩的《狂斩三国》再度归来&#xff01;其策略加动作的独特玩法在当时颠覆了玩家们对三国游戏的阵营认知。比传统策略更简单明快&#xff0c;比传统动作无脑砍更 具思考乐趣&#xf…

物联网简介

以下内容源于朱有鹏老师课程的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 本文档提供下载&#xff1a;提取码1111——物联网简介 1、什么是物联网 1.1.物联网的概念和发展历程 1.1.1、认识物联网 &#xff08;1&#xff09;百度百科中物联网定义 &#xff08;…

php计算代码运行时间与内存使用的一段代码

计算运行时间及内存使用&#xff0c;代码如下&#xff1a; <?php //开始计时 $HeaderTime microtime(true);//参数true表示返回浮点数值//代码//...printf(" total run: %.2f s<br>". "memory usage: %.2f M<br> ", microtime(true)-$Hea…

Mysql语句与应用

2019独角兽企业重金招聘Python工程师标准>>> 1。正则表达式 搜索多个关键词&#xff0c;“或”, 等同 %上海% | %内蒙古% SELECT * FROM analysis_result WHERE result REGEXP 上海|内蒙古 LIMIT 1; "且" SELECT * FROM analysis_result WHERE id 1 AND …

android gb2312 utf-8,不同编码页面之间用form传值出现乱码问题解决方案 utf-8 到 gb2312...

相信有人也曾遇到过这种问题&#xff0c;今天将这个问题稍作整理发布出来。由于编码的问题传值出现乱码&#xff0c;一看到这样的情况&#xff0c;我们首先想到的是线面的两种解决办法&#xff1a;方案一&#xff1a;在接收参数页面进行转码 (这是较为理想的解决办法)方案二&a…

颜色的数字化描述(RGB与YUV的简介)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考内容 &#xff08;1&#xff09;YUV和RGB的相互转换实验_Geek.Fan的博客-CSDN博客 &#xff08;2&#xff09; 工作中用到的一些基础知识 &#xff08;3&#xff09;YUV422 YUV420 Planar \ Se…

android界面的滑动切换功能

左右滑动切换是几乎所有应用中都会用到的功能。在这里将相关资源进行总结 &#xff08;1&#xff09;viewflipper结合手势检测进行左右滑动。 http://www.cnblogs.com/hanyonglu/archive/2012/02/13/2349827.html 这种方法很简单&#xff0c;但是大概效果不是很理想&#xff08…

softlayer virtual machine vhd磁盘镜像导入shell脚本

softlayer virtual machine vhd磁盘镜像导入shell脚本 脚本 测试上传; 20480 records in20480 records out2147483648 bytes (2.1 GB) copied, 44.2262 s, 48.6 MB/scurl: option --data-binary: out of memorycurl: try curl --help or curl --manual for more information 28…

android listview中item倒计时,GitHub - TangAnna/ListViewTimer: 列表中每一个item都有计时器 (可实现倒计时或者计时器的功能)...

ListViewTimer列表中每一个item都有计时器 (可实现倒计时或者计时器的功能)项目中有时会遇到列表中含有倒计时或者是计时器的需求&#xff0c;实现的方式有很多种&#xff0c;此Demo中是使用Thread Handler实时的对item的局部进行刷新达到计时或倒计时的功能本项目中实现的是计…

Linux 查看当前日期和时间

一、查看和修改Linux的时区 1. 查看当前时区 命令 &#xff1a; "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 &#xff1a; "tzselect" 方法 B 仅限于RedHat Linux 和 CentOS 命令 &#xff1a; "timeconfig" 方法 C 适用于Debian 命令 &…

第二季1:MPP模块概述

以下内容源于海思官方文档内容&#xff0c;如有侵权请告知删除。 一、MPP模块概述 海思的媒体处理软件平台&#xff08;MPP&#xff0c;Media Process Platform&#xff09;有利于应用软件的快速开发。因为该平台屏蔽了一些与芯片相关的复杂的底层处理&#xff0c;给应用软件提…

codeblocks

用来写c的 http://www.codeblocks.org/downloads/26#windows 选择codeblocks-13.12mingw-setup.exe自带gnu gcc compiler 安装后设置gcc compiler settings -> compiler -> 在顶上的selected compiler中选择gnu gcc compiler -> 选择下面一行的toolchain executables中…

小米平板安装鸿蒙系统,【新机】安卓最强平板?MatePad Pro2曝光:预装鸿蒙OS | 小米平板5到底啥时候发布?...

目前安卓阵营还在好好做平板的可能也就是三星和华为了&#xff0c;至少整体的配置规格都还不错。根据爆料&#xff0c;华为将会在近期推出MatePad Pro 2代产品&#xff0c;预计6月份正式和大家见面。MatePadPro2将会搭载麒麟9000处理器&#xff0c;算是目前安卓平板里性能最强的…

第二季3:sample_venc.c的整体分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、sample文件夹的介绍 将mpp/sample文件夹以及mpp/include文件夹导入SI后&#xff0c;搜索main时可以发现很多main函数。这说明sample文件夹下有很多例程&#xff0c;每个例程面向一个典型应用。…

〖Linux〗穿越城墙之后,直接连接国内网站的路由配置

因为有需要做Android相关的开发工作&#xff0c;很多时候要穿越之后才能做事情&#xff1b; 如Android文件加密预研、Android NDK/SDK的下载&#xff0c;都需要使用得到Google&#xff1b; 但是穿越之后&#xff0c;访问国内网站就不是那么方便了&#xff0c;所以&#xff0c;写…