keil 5 STM32工程介绍
目录
一、工程文件介绍
1.自动生成的文件
2.自建文件
(1)USER 文件夹
(2)FWLIB 文件夹
(3)CMSIS 文件夹
二、工程创建教程
1.下载固件库
2.创建工程
(1)创建不完善的工程
(2)移植文件
(3)配置工程
一、工程文件介绍
如下图所示是一个 STM32 的 keil 5 工程文件,其中包含了其他 keil 5 工程文件基本都包含的文件,其他工程可能还有其他文件,但并非基本文件。部分文件夹是用户自定义的,名称可能不完全一致,但内容文件应当是类似的。接下来将一一介绍其中的文件。
1.自动生成的文件
如上图所示,除了文件夹 CMSIS、FWLIB、USER 外,其他文件均为创建工程和编译后产生的。
- 最下面绿色标的 .uvprojx 文件是工程的本体,双击该文件即可打开 keil 5 并进入工程。
- 倒数第二个.uvoptx文件是工程的选项配置文件,它存储了针对该工程的所有软件配置,包括编译器的优化等级和警告级别、汇编器和链接器的设置、头文件包含路径、预处理宏定义、Flash 下载算法的选择等,即Options for Target设置页面中的内容。若删除此文件,再次打开工程时,Keil 会重新生成一个使用所有默认设置的新的.uvoptx文件。
- 顺数第二个 DebugConfig 文件夹中有一个 DBGCONF 文件,它保存的是Options for Target设置页面的Debug调试设置,在较新版本的 Keil MDK 中会自动生成这个文件,其将调试相关的设置从传统的上面讲的 .uvoptx 文件中分离出来独立管理。若删除此文件,再次打开工程时,Keil会重新生成一个使用默认 Debug 设置的 DebugConfig 文件夹和DBGCONF 文件。
- 倒数第三个 .uvguix 文件是工程的用户界面配置文件,保存了用户的个性化 IDE 设置,如窗口的布局和位置、工具栏的显示和隐藏、代码编辑器的字体和颜色主题、项目浏览器等视图的状态以及其他所有个性化设置。若删除此文件,再次打开工程时,Keil 会重新生成一个使用默认界面配置的新文件,工程代码和编译设置完全不受影响,只是个人界面布局需要重新设置。
- 工程中自动生成的 Listings 文件夹和 Objects 文件夹分别和 Options for Target 设置页面中的 Output 和 Listing 设置有关,可以安全删除,暂不做详细介绍。
2.自建文件
这里要介绍的是USER、FWLIB、CMSIS三个文件夹。
(1)USER 文件夹
USER 文件夹是自己创建的文件,可以用来存放用户代码,例如 main.c,以及其他自建源文件、头文件,像如果要设计一个电机控制模块 motor_control.c/.h,可以存放在这里。当然了,这取决于个人习惯,可以根据习惯创建其他文件夹用于存放编写完成的应用程序。
(2)FWLIB 文件夹
FWLIB 文件夹是自己创建的文件,表示Firmware Library(固件库),可以用来存放外设标准库,并使用 inc 子文件夹和 src 子文件夹将头文件和源文件分开,文件夹内容如下图所示:
上述文件中的 stm32f10x_ppp.c/.h 是对应外设的库文件,有了这些库文件就可以使用对应外设的标准库函数了。其中另有 misc.c/.h 文件,这里面定义了NVIC的相关配置函数(如 NVIC_Init() 等)以及一个配置 SysTick 的时钟源的函数。若要使用标准库开发STM32,这些文件是必不可少的,若使用直接操作寄存器的方式开发STM32,这些文件是不需要的。
(3)CMSIS 文件夹
接下来介绍自建的 CMSIS 文件夹中的内容。文件夹内容如图所示:
首先是 core_cm3.c/.h 文件,它们是ARM公司提供的 CMSIS 核心文件,它们为所有基于Cortex-M3内核的芯片提供了一套统一的、标准化的软件接口,用于访问和控制内核本身的核心功能,如中断控制器(NVIC)、系统定时器(SysTick)、特殊指令以及CPU寄存器,从而实现了对处理器底层硬件的抽象,为不同厂商的芯片库和应用程序(如RTOS)提供了可移植的基础。
然后是 startup_stm32f10x_hd.s 文件,这是一个使用汇编语言编写的启动文件,STM32 上电或者复位后首先执行这个文件,负责进行最底层的硬件初始化,包括初始化堆栈指针、初始化中断向量表、执行复位处理程序(Reset_Handler())和跳转到 main 函数。
接着是 stm32f10x.h 文件,其在标准外设库开发中扮演着基石和总枢纽的角色,其作用主要有芯片型号选择与配置、定义外设寄存器结构体和内存映射、定义外设寄存器位定义等等。
下面是 stm32f10x_conf.h 文件,这个文件中,前半部分是标准外设库头文件的包含,后半部分是断言相关的宏定义。如果不适用标准外设库开发,这个文件是不需要的。
再后面到 stm32f10x_it.c/.h 文件,这个文件中包含了一些异常的中断处理函数模板,但都是空函数,实际上我们可以在其他地方定义中断服务函数,所以这个文件不是必要的。但可以保留,以集中管理中断服务程序,取决于个人。
最后是 system_stm32f10x.c/.h 文件,这个文件中有大量的和时钟配置有关的函数定义,是非常重要的一个文件,即使是使用直接操作寄存器的方式开发STM32也建议保留,当然也可以自己自定义初始化时钟代码。
二、工程创建教程
1.下载固件库
首先,搜索“ST官网”,进入中国大陆地区官网:
进入官网后,依次选择“工具与软件”、“嵌入式软件”、“STM32嵌入式软件”。如下图所示:
接着,在网页左侧选择“STM32标准外设软件库”,并选择需要的芯片系列,我将以STM32F103RCT6为例,选择“F1”。如下图所示:
至此,就可以选择版本下载固件库了。下载需要登陆,没有注册过的可以注册一个,不难。下载界面如下图:
得到的文件包打开后如下图所示,其中主要需要第二个 Libraries 文件夹中的文件。第一个_htmresc文件夹是一些官方图标,不重要。第三个 Project 文件夹包含各个外设的使用示例和空的工程模板,有耐心的话可以做参考用。第四个Utilities文件夹是ST评估板的相关示例和驱动,如果有用ST官方指定的开发板的话可以使用。最下面的stm32f10x_stdperiph_lib_um文件是一个已编译的HTML帮助文件,是标准外设库的官方离线文档,用于查询所有库函数的详细用法、参数和示例代码,可以做学习使用。
2.创建工程
记住如下步骤,即可自己手动创建基于标准库开发的STM32 keil工程,而不用再跟着教学视频做。现在以STM32F103RCT6为例创建工程。
首先,记住下面这些文件,这些是建议工程要包含的文件:
- ① stm32f10x.h
- ② stm32f10x_conf.h
- ③ system_stm32f10x.c/.h
- ④ stm32f10x_it.c/.h
- ⑤ core_cm3.c/.h
- ⑥ startup_stm32f10x_hd.s
- ⑦ 外设标准库文件
现在,创建工程分成三大步,一是使用 keil 5 生成一个不完善的工程,二是添加上述文件,三是做简要配置。
(1)创建不完善的工程
第一小步,创建一个工程文件夹,可以在桌面等处创建,如下图所示:
第二小步,在这个文件夹中创建三个文件夹(CMSIS、FWLIB、USER),认为麻烦也可以只创建两个文件夹(FWLIB、USER),然后把上述①~⑦的文件全塞 FWLIB 里。怎么做完全取决于个人。如下图所示:
第三小步,打开keil 5 MDK,选择 “Project”、“New μVision Project”。然后选择进入刚刚创建的工程文件夹内。
第四小步,在弹出的芯片选择界面选择对应的芯片系列,我这里选择“STM32F103RC”。如果没有下载芯片支持包的可以点这里的 “Pack Installer” 进行下载。选择完芯片直接关掉弹出来的“Manage Run-Time Environment” 界面,这个界面若感兴趣的可以自己去了解下。
(2)移植文件
打开从ST官网下载的外设固件库,打开Libraries文件夹。得到如图所示页面:
第二个文件夹 STM32F10x_StdPeriph_Driver 里面的就是上面标的第七点“外设标准库文件”了。打开,将里面的inc文件夹(装着外设标准库头文件)和src文件夹(装着外设标准库源文件)直接复制粘贴到我们创建的FWLIB文件夹中。如果认为有哪些外设根本不用的话,也可以将其源文件和头文件从中剔除。
然后打开固件包的CMSIS文件夹,可以在其中找到这几个需要的文件:①、③、⑤、⑥,都比较好找,自己找一下也好更多的了解一下这个固件包的文件结构。要注意的是,其中⑥ startup_stm32f10x_hd.s 文件从STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup来到如下这个页面:
这里分为不同编译器需要使用的启动文件,第一个是keil中的ARMCC/ARMClang编译器,我们创建的是keil工程,需要选择这里面的启动文件。下面分别是GCC编译器、IAR的ICCARM编译器和某个编译器对应所需的启动文件。至于里面的启动文件选择什么,这个取决于芯片的FLASH容量,使用一款芯片时应当对自己这款芯片的FLASH容量大小有所了解,随便一搜即有结果,这里先不多介绍。
剩余② stm32f10x_conf.h、④ stm32f10x_it.c/.h 在这个文件夹里是没有的,如果开发不是那么深的话,④是没必要的其实,中断处理程序放在哪里都行,这个文件主要是给了一些中断处理程序模板。但我们还是都加入进去吧。
②和④可以在固件包中的工程模板中找到。如下图所示:
将①②③④⑤⑥这些文件都放入我们创建的CMSIS文件夹中后,现在工程已经完整了,接下来只需要简单配置一下工程即可。
(3)配置工程
点击“Manage Project Items”图标,如下图所示:
在弹出的页面中将自动生成的 Source Group 1 组双击改名为 CMSIS,并增加两组 FWLIB 和 USER,对应我们自己创建的三个文件夹。然后选中某一组,在右侧点击 “Add Files”,将对应文件夹中的所有文件加入到组中。注意文件夹不能被加入,然后要将所有源文件、头文件和启动文件加入到组中。需要选择文件类型,否则有的文件不显示,如下图所示:
然后点击 “Options for Target”,选择 “C/C++”页面,加入头文件包含路径(点击右侧的三个点)。如下图所示:
有头文件的文件夹路径都要包含,包括USER、CMSIS、FWLIB的inc文件夹这三个地方。如下图所示:
然后,还是同样的 “C/C++” 页面,在上方的 “Define” 框中写入 USE_STDPERIPH_DRIVER 和 STM32F10X_HD,使用英文逗号隔开,如下图所示:
前者 USE_STDPERIPH_DRIVER 宏是使用标准外设库必须要定义的,这在 stm32f10x.h 文件中有说明,如下图所示:
当然了,也可以不在上面的预处理器定义框中去定义,可以在文件中定义,只是建议还是在预处理器中定义的好。
至于第二个宏 STM32F10X_HD,显然这和芯片类型有关(HD和前面的FLASH容量大小有关,同样在stm32f10x.h文件中显示需要定义这个宏,如下图所示,不定义这个宏编译时将会报错。不过,不在上面说的预处理器中预定义也不会报错,这可能是在选择了芯片之后在哪里会自动定义这个宏。所以不定义这个宏也没问题。
至此,我们已经完成了工程的创建,可以自己编写 main 文件和其他源文件、头文件并放入 USER 组中来开发 STM32 了。
最后,建议有时间还是自己去钻研一下上面谈到的文件①~⑦,文件并不算太难看懂,看完会对 STM32 有更深的理解,这其实也是学习 STM32 的一个必要的过程。