三、使用Keil5新建STM32工程
目录
1. STM32开发方式
2. STM32库函数文件目录
3. 新建基于寄存器开发的STM32工程
(1)建立存放工程的文件夹
(2)打开Keil5软件新建并保存工程
(3)选择器件型号
(4)从固件库中选取必要的工程文件添加到项目文件夹下
① 必要文件1:启动文件
② 必要文件2:外设寄存器描述及时钟配置文件
③ 必要文件3:内核寄存器描述文件
(5)将第4步的必要文件添加到工程中
(6)在工程选项中添加第4步新建文件夹的头文件路径
(7)新建main函数,验证工程是否可以正常运行
① 新建“User”文件夹
② 工程项目中添加New group并命名为“User”
③ User文件夹中添加新的C文件,命名为“main.c”
④ 在新建的“main.c”文件中输入代码并编译
4. 新建基于标准库开发的STM32工程
(1)在工程文件夹中新建文件夹并命名为“Library”
(2)在“Library”文件夹中添加库函数的源文件
(3)在“Library”文件夹中添加库函数的头文件
(4)Keil工程中新建“Library”组并添加库函数相关文件
(5)添加库函数必要的配置文件
(6)添加宏定义
5. 基于寄存器开发和标准库开发的区别
(1)基于寄存器开发
(2)基于库函数开发
6. Keil5 IDE的使用小技巧
(1)修改字体属性
(2)中文乱码问题解决办法
(3)设置Tab键大小
1. STM32开发方式
目前STM32的开发方式主要有以下几种:
2. STM32库函数文件目录
STM32的工程结构较为复杂,需要用到很多文件。之后开发用到的代码也都是需要建立在工程结构上的,所以在开始学习后续内容之前需要学习如何新建STM32的工程。
使用库函数的方式进行开发,需要准备STM32库函数的压缩包。文件夹目录如下:
3. 新建基于寄存器开发的STM32工程
(1)建立存放工程的文件夹
新建文件夹,文件名为“STM32Project”,以后的工程都存放在该文件夹下,这样方便工程管理。STM32工程可参照以下目录创建:
一级目录 | 二级目录 | 三级目录 |
STM32Project | ||
工程名称(根据具体作用命名) | ||
Project(通用项目名称) |
(2)打开Keil5软件新建并保存工程
点击Project—New uVision Project—工程存放路径存放至刚新建的文件夹下。在此路径需要再新建一个文件夹用于存放本次工程。—工程文件名推荐使用通用名称:“Project”。工程具体的作用可以在文件夹名称中进行说明,比如“2-1 STM32工程模板”。文件夹的名称是很方便改的,但项目名称不容易更改。
Project-New uVision Project
新建文件夹-修改文件夹名称为具体工程名
项目名统一命名为“Project”
(3)选择器件型号
Software Packs—STMicroelectronics—STM32F1 Series—STM32F103C8。
Software Packs-STMicroelectronics-STM32F1 Series-STM32F103C8
点击OK后会弹出一个Manage Run-Time Environment的窗口,这是Keil软件的一个新建工程小助手,可以帮助快速新建工程,暂时不需要该助手,关闭即可。
新建工程助手-Manage Run-Time Environment窗口
(4)从固件库中选取必要的工程文件添加到项目文件夹下
相关资料下载链接:资料下载
选择“STM32入门教程资料”资料进行下载,该文件中有下述步骤用到的固件库。
① 必要文件1:启动文件
路径:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
STM32启动文件
STM32的程序从启动文件开始执行的,将以上文件全部复制粘贴到工程项目文件夹中。在该文件夹中新建一个文件夹,名为“Start”,并把文件粘贴进去。
② 必要文件2:外设寄存器描述及时钟配置文件
路径 :
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
STM32的外设寄存器描述文件,它的作用和51单片机的头文件REGX52.H相同,用来描述STM32有哪些寄存器和它对应的地址。
system_stm32f10x.c和system_stm32f10x.h两个system文件是用来配置时钟的,STM32主频72MHz,就是system文件里的函数配置的。
同样也需要将这三个文件复制下来,也粘贴到Start文件夹下。
STM32外设寄存器描述及时钟配置文件
③ 必要文件3:内核寄存器描述文件
STM32是由内核和内核外围的设备组成的,而且内核的寄存器描述和外围设备的描述文件不是在一起的,所以还需要添加一个内核寄存器的描述文件。
路径:
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
内核寄存器描述和配置函数文件
core_cm3.c和core_cm3.h这两个cm3(Cortex-M3)文件就内核的寄存器描述,它同样带了一些内核的配置函数,因此多了个.c文件。将这两个文件复制下来,也粘贴到Start文件夹下。
到此为止,工程的必要文件就复制完成了。
(5)将第4步的必要文件添加到工程中
管理工程项目图标
修改Groups名称—Add Files…添加文件
添加文件时注意勾选“All files(*.*)”
启动文件需要选择:“startup_stm32f10x_md.s”文件。
工程中Start文件夹内容参考如下图,具体有:①启动文件;②内核寄存器描述文件;③外设寄存器描述及时钟配置文件。
工程中Start文件夹内容参考
文件图标上的小钥匙图标,表示该文件是只读文件,内部的信息是不允许修改的。
(6)在工程选项中添加第4步新建文件夹的头文件路径
需要在工程选项中添加新建文件夹的头文件路径,否则软件无法找到.h文件的。
Options for Target-C/C++选项卡-include Paths-…
New(Insert)-选择新建的文件夹
(7)新建main函数,验证工程是否可以正常运行
① 新建“User”文件夹
打开工程文件夹,新建文件夹并命名为“User”,main函数放到该文件夹中。
工程文件夹下新建“User”文件夹
② 工程项目中添加New group并命名为“User”
新建User文件夹
③ User文件夹中添加新的C文件,命名为“main.c”
注意添加头文件路径。
User右键-Add New Item to Group'User'…
选择C File(.c)-Name:main,注意修改文件路径
文件路径更正到User文件夹下
④ 在新建的“main.c”文件中输入代码并编译
注意文件内部代码的最后一行必须是空行,否则编译器会报出警报。
测试代码
代码编辑完成后,点击左上角的"Build",进行编译并建立工程。
若下面Build Output窗口给出的提示信息是:"0 Error(s), 0 Warning(s)"就证明我们新建的工程没问题,可以正常运行。
该工程还没有添加STM32的库函数,所以它还只是一个基于寄存器开发的工程,如果想用寄存器开发STM32,那么工程建到这里就可以了。
4. 新建基于标准库开发的STM32工程
(1)在工程文件夹中新建文件夹并命名为“Library”
注意添加头文件路径。
在“3. 新建基于寄存器开发的STM32工程”的基础上,继续在工程文件夹下添加新文件夹并命名为“Library”,用于存放库函数。
(2)在“Library”文件夹中添加库函数的源文件
路径:STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src
Ctrl+A全选复制并粘贴到工程文件夹的“Library”文件夹下。
库函数的源文件列表
其中,“misc.c”是内核的库函数,其他的就是内核外的外设库函数了。mics是混杂的意思,ST公司将内核的库函数放置到杂项中。
(3)在“Library”文件夹中添加库函数的头文件
路径:
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc
Ctrl+A全选复制并粘贴到工程文件夹的“Library”文件夹下。
库函数的头文件列表
(4)Keil工程中新建“Library”组并添加库函数相关文件
右键“Library”组-Add Existing Files to Group 'Library'…
打开Library-Ctrl+A全选-Add添加到Library组
到此,所有库函数相关的文件都已添加到工程项目当中。
工程项目中“Library”组参考文件目录
(5)添加库函数必要的配置文件
对于这个库函数来说,目前还无法使用,我们需要再添加必要的配置文件。
路径:
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template
conf(configuration)文件用来配置库函数头文件的包含关系的,其中还有用于参数检查的函数定义,这是所有库函数所必须的。两个it(interrupt)文件用于存放中断函数的。
将这三个文件复制并粘贴到项目文件夹的“User”文件夹下,并在Keil5软件中将文件添加到“User”组中。
(6)添加宏定义
右键stm32f10x.h-Open document"stm32f10x.h"
打开文件后下拉到8296行,这里有一个条件编译,意思是如果你定义了USER_STDPERIPH_DRIVER这个字符串,下面的“#include”语句才有效。
#include "stm32f10x_conf.h"条件编译
复制该字符串, 打开工程选项进行设置。包含标准外设库,也就是库函数。
工程选项Options for Target…
C/C++-Prerocessor Symbols-Define-添加“USER_STDPERIPH_DRIVER”字符串
可以看到库函数文件基本都是仅可读,不可更改的文件。在开发过程中我们唯一需要更改的就只有“User”组中的文件。
5. 基于寄存器开发和标准库开发的区别
这里的代码案例仅进行基于寄存器开发和基于标准库开发的对比,具体代码详解请参考后续的项目讲解文章。
(1)基于寄存器开发
以最简单的点亮一颗LED小灯项目为例,基于寄存器开发的方式需要不断地查手册来了解每个寄存器的每一位是什么作用。基于寄存器开发方式虽然代码简洁,但不大方便。
基于寄存器开发方式的点亮LED灯案例代码
(2)基于库函数开发
库函数其实也是间接地配置寄存器,所以步骤是相同的。
基于库函数开发方式的点亮LED灯案例代码
首先使能时钟,库函数中有使能时钟的RCC_APB2PeriphClockCmd函数来开启时钟。可右键跳跃到该函数的宏定义。其中有函数的简洁和参数说明。
经过函数的包装,我们不需要去查询手册看寄存器设置。基于库函数开发的代码虽然比较长,但语义更加明确,也不需要查表计算寄存器的值。我们只需要调用库函数,按照它的提示,把参数填好即可。所以说从这点对比来看,库函数比寄存器开发是有很大优势的。
6. Keil5 IDE的使用小技巧
(1)修改字体属性
Keil5默认的字体视觉效果不佳,可能也会遇到中文编码错误显示"????"的问题。可以在"Configuration"中进行字体及编码设置。
工具栏-Configuration…
Colors & Fonts-C/C++ Editor files-Text-Courier New…
根据个人需要,修改字体属性
(2)中文乱码问题解决办法
遇到中文乱码问题时:
Editor-Encode in UTF-8 without signature
(3)设置Tab键大小
Editor-C/C++ files-Tab size: 4
作者:Sunder*