前言
这个博客的意义就是为了帮助新手快速创建一个基于STM32的工程模板,主要记录从零创建一个全新的STM32F103的项目过程,大部分是自己收集和整理,如有侵权请联系我删除。
本博客内容原创,创作不易,转载请注明
(1)建一个目录存放工程
在电脑上随意创建一个文件夹(比如STM32F103),不能带有中文的,这个文件夹的作用就是用来存放目标工程.。
然后在这个文件夹目录下创建五个子文件夹,这样取名只是为了方便识别。用来存储特定的类型的文件,能帮助我们快速找到对应的文件并应用。至于这些文件夹名字,实际上是可以任取的,
至于这些文件夹为什么要这样分类,下面创建工程的时候会一步一步讲到。
在STM32F103目录下创建五个子文件夹:CORE,FWLIB,STM32F10x_FWLib,SYSTEM,USER
,如下图:
2)打开keil软件--然后在文件的左上角找到
创建完文件夹之后,就要创建我们的Keil的工程了---打开Keil--Project
– New μVison Project
然后在弹出来的界面中,选择我们刚才创建的目录下的USER
目录下,也就是...\
STM32F103\USER
路径下,然后输入文件名,我这里和我自己的工程名称一致,是stm32f103
,然后点击保存。
工程保存之后,在软件界面就会弹出来一个芯片选择框让我们选择芯片,因为我们使用的是STM32F103ZETx,所以我们选择这个芯片,点击OK。
(在选择芯片之前,一定要确认自己已经安装了对应型号的PACK包,否则无法选择对应的芯片型号)
建立工程一定要看清楚自己的单片机芯片型号再进行选择,不然建立工程会报错。
然后接下来的Manager Run-Time Environment
界面直接点击Cancel就行了。
到此,我们的工程框架就创建好了,现在在工程里,只有一个Target1 下的 source Group 1
然后我们在系统中点开文件夹,发现在USER目录下多了几个文件:
MDK5.14生成的工程文件是以.uvprojx 为后缀。这个不能删除
Listings 和 Objects 文件夹是 MDK 自动生成的文件夹,用于存放编译过程产生的中间文件。这两个文件不用管它
(3)工程建立好之后,我们就要把库文件复制到我们的工程里才能使用。
1.官方的库文件一般在ST官网可以下载,标准库是st公司提供的。
(不过这些资料网上已经很多了,可以选择去正点或者野火的官网去搜索获取,或者在我评论区拿取)
打开官方固件库包,定位到我们之前准备好的固件库包的目录:
\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 下面,
将目录下面的 src,inc 文件夹 copy 到我们刚才建立的STM32F10x_FWLib 文件夹下面。
src 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件,还有一个html文件是一个说明文件
直接复制这两个文件放在这个目录下:
找到官方的启动文件,在\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport目录下,把这两个文件复制到CORE 文件夹下。
然后再找到芯片的容量大小的文件,通过\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm这个文件夹下选择自己芯片对应的容量大小文件。
那我们怎么才能知道自己芯片的容量大小是多少呢?
我们可以通过在ST官网的ST32选型手册去查看,也可以通过下图选择:
因为我们使用的是STM32F103ZET6,是512K的大容量产品,所以选择hd.s的文件。
把芯片需要的启动文件和芯片文件复制到CORE文件夹下面:
其实这个时候,我们建立工程已经完成大半了,不要灰心,接下来就很简单了。
(4)打开Keil,添加我们需要的库文件
下面我们还要将这些文件加入我们的工程中去。
这个时候,就要打开我们的Keil软件了,在软件的里,添加源文件对应的头文件,哪里有xxx.c文件,就添加这个文件所在的目录
在MDK5中,右键点击 Target1,选择 Manage Project Items,
然后在Project Targets一栏,我们双击Target将名字修改为 STM32F103,然后在 Groups 一栏删掉一个 Source Group 1,建立三个 Groups:USER,CORE,STM32F10x_FWLib。然后点击 OK,可以看到我们的 Target名字以及 Groups 情况如下图:
接下来我们就要在STM32F10x_FWLib这个文件夹下添加我们需要的库函数文件,找到我们刚才复制在这个文件夹上的两个文件,在src这个文件夹上存放的是我们需要的.C文件,一般来说你需要那个就添加那个,不过新手我还是建议全部添加,不多BB,上图:
这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。
例如我只用 GPIO,我可以只用添加 stm32f1xx_gpio.c而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,找的时候也比较麻烦,用户可以自行选择。
接下来要在 MDK 里面设置头文件存放路径。
也就是告诉 MDK 到那些目录下面去寻找包含了的头文件。
这一步骤非常重要。如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。
设置目录
先进入 PATH 配置界面,选择C/C++
标签,然后点击Include Paths
在弹出的界面中,点击New(Insert),然后添加点击添加路径
这里我们需要添加的头文件路径包括:\CORE, \USER\, \FWLIB\inc
这里大家务必要仔细,固件库存放的头文件子目录是\STM32F10x_FWLib\inc,不是src。
很多朋友都是这里弄错导致报很多奇怪的错误。添加完成之后如下图
添加标识符
接下来对于 STM32F40 系列的工程,还需要添加一个全局宏定义标识符。
添加方法是点击魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:
STM32F10X_HD,USE_STDPERIPH_DRIVER 用 , 隔开的。
那么这两个东西是有什么用呢,在文件哪里可以找到呢?
我怎么知道我这个芯片用那个?
USE_STDPERIPH_DRIVER:在C/C++预定义中加入“USE_STDPERIPH_DRIVER”就是允许“使用标准外设驱动”了。我们找到stm32f10x.h这个文件:
然后在这个文件里就能找到这个驱动的定义了
STM32F10X_HD :这个是根据自己芯片容量大小选择,一般来说如果需要移植的话,也是需要改动这个定义的。根据芯片大小确定
只有我们定义了STM32F10X_HD这个宏,才可以顺利编译,进而,根据定义的这个宏,定义将会用到的与外设有关的宏!!!
(5)创建一个main.c文件,编写一个函数确定工程是否创建成功
1.新建一个xxx.c(main.c)文件,包含函数int main()
这个文件是工程的主函数,一切代码都是从这个函数开始执行到结束,创建完成后把他放在我们的工程下。
编译
接下来我们要编译工程,在编译之前我们首先要选择编译中间文件编译后存放目录。
方法是点击魔术棒 ,然后选择Output
选项下面的 Select folder for objects…
然后选择目录为我们之前新建的 OBJ
目录。
同时将下方的三个选项框都勾上,如下图:
这里说明一下勾选的意义。Create HEX File
选项选上是要求编译之后生成 HEX 文件。Browse Information
选项选上是方便我们查看工程中的一些函数变量定义。
现在我们放上测试代码,执行一下看有没有错误吧:
这样的话,一个工程的建立就基本结束了,也可以正常使用了。
注意
我们在上面的时候,创建了五个子文件夹,很多人应该有疑问为什么SYSTEM没用到,其实这个文件夹主要是为了分辨,我把用到时钟的函数都放在这里了,比如延时,滴答定时器,RTC等等。存放的是每个实验都要使用到的共用代码。
所以我们不必纠结,而且在后面开发的时候,我们也可以再创建一个文件夹,用来存放应用实现的函数,这样我们调试的时候就很方便了。
STM32工程的创建太麻烦了,不过这是学习的必要一环,等之后的项目就是在此基础上的增加了