MDK+VS+Eclipse的STM32库V3.5工程模板的建立(二)
_【@. 目录】
【@.2 MDK工程建立】
(*注:工程模板的目录结构大家完全可以按照自己的项目要求建立,不必要我这里的目录结构。)
一.建立目录:
@-> 在任意位置新建一个文件夹,取名为"STM32F10x_Temp_Lib3.5",目录下新建"Solution"(工程文件、目标文件),"Libraries"(STM32库),"User"(用户代码)三个文件夹。
@-> 在"Solution"下新建"LIST","OBJ","MDK","VS","ECL"五个文件夹。
@->在"User"下新建"inc","scr"两个文件夹。至此文件目录建立完成,如下图所示:↓
二.拷贝STM32库:
@->将下载后的库文件解压,观察目录结构。其中根目录下有一个chm的用户手册,那是个用Doxygen生成的文档。反正我看着挺纠结的,关于库文件的结构,园子里的这篇文章有比较详细的分析,这里就不重复了。
@->右击这个文件夹,将其属性中的"只读"去掉。STM32库下载下来默认是只读的,若不去掉将无法修改文件。去掉只读,点击应用,选中"将更改应用于该文件夹、子文件夹和文件"确定。↓
@->在固件库根目录"STM32F10x_StdPeriph_Lib_V3.5.0\Libraries"下全部文件拷贝到我们建立的工程目录"STM32F10x_Temp_Lib3.5\Libraries"中。
@->将"STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template"下的"stm32f10x_it.c"拷贝到我们的工程目录"STM32F10x_Temp_Lib3.5\User\scr"中。另外src文件夹中再新建一个"main.c"文件,以后可将用户代码添加到这里。
@->将"STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template"下的"stm32f10x_it.h"和"stm32f10x_conf.h"拷贝"STM32F10x_Temp_Lib3.5\User\inc"中。以后自定义的头文件也可以放在这个文件夹下。至此,所有工程文件拷贝完毕。
三.建立MDK模板:
@->打开Keil 4.60,点击Project->New uVision Project,保存工程路径为"STM32F10x_Temp_Lib3.5\Solution\MDK",取名为"STM32F10x_MDK",也可以另取名字。在CPU中选择STMicroelectronics->STM32F103RB。接下来出现的"Copy STM32 Startup Code to Project Folder and ADD File to Project ?"对话框汇中选择No,因为之后我们需要自己添加STM32库中的启动文件。
@->在左侧Project窗口中右击Target1,选择Manage Components:↓
将Project Targets中的Target 1改为一个有意义的名字,比如这里改成"STMF10x_Tar",在之后的Groups里面新建"USER","STM32_LIB","STM32_STARTUP","CMSIS" 四组。↓
@->选中USER,点击右侧Add Files,添加工程目录"User\scr"下的"main.c"和"stm32f10x_it.c"两个文件。↓
@->选中STM32_LIB,点击右侧Add Files,添加工程目录"\Libraries\STM32F10x_StdPeriph_Driver\src"下的"misc.c","stm32f10x_rcc.c","stm32f10x_gpio.c","stm32f10x_usart.c"四个文件。其中这里"misc.c"和"stm32f10x_rcc.c"根据我查阅的资料说一定得加(*有待验证),剩下的文件用到那个功能添加那个。↓
@->选中STM32_STARTUP,点击右侧Add Files,添加工程目录"Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm"下的"startup_stm32f10x_md.s"文件即为需要的启动代码。这里后缀的md表示中等容量大小,因为我们的芯片是STM32F103RB所以要选这个。↓
关于STM32的这个分类,可以在"stm32f10x.h"这个入口头文件(现在还没添加到包含路径中)中找到描述注释,当然也可以在网上搜索到具体怎么分类的,但我这里故意黏贴了这个函数里面的描述。要学会利用好手头的资源,很多头文件里的注释很清楚的只是我们不愿意读罢了。读一读就知道我们这个芯片为什么选择后缀为md的启动代码了。↓
/*!< STM32F10X_LD: STM32 Low density devices */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */ /*!< STM32F10X_MD: STM32 Medium density devices */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */ /*!< STM32F10X_HD: STM32 High density devices */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */ /*!< STM32F10X_XL: STM32 XL-density devices */ /*!< STM32F10X_CL: STM32 Connectivity line devices */ /* - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers where the Flash memory density ranges between 16 and 32 Kbytes. - Low-density value line devices are STM32F100xx microcontrollers where the Flash memory density ranges between 16 and 32 Kbytes. - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers where the Flash memory density ranges between 64 and 128 Kbytes. - Medium-density value line devices are STM32F100xx microcontrollers where the Flash memory density ranges between 64 and 128 Kbytes. - High-density devices are STM32F101xx and STM32F103xx microcontrollers where the Flash memory density ranges between 256 and 512 Kbytes. - High-density value line devices are STM32F100xx microcontrollers where the Flash memory density ranges between 256 and 512 Kbytes. - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where the Flash memory density ranges between 512 and 1024 Kbytes. - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers. */
@->最后,选中STM32_STARTUP,点击右侧Add Files,添加工程目录"Libraries\CMSIS\CM3\CoreSupport"下的"core_cm3.c",和工程目录"Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x"下的"system_stm32f10x.c"文件。↓
于是最终Project下可看到工程目录呈现如图状:↓
*.MDK工程文件结构说明
@->USER文件夹下面其中main.c是自己添加的,用于添加用户代码。stm32f10x_it.c是从下载的库文件中的模板里拷贝出来的,这也说明这个文件并不属于标准库中的函数。打开这个文件就可以知道这里定义的是所有中断的服务函数(以'_Handler')结尾,文件里面的所有函数都是空的,用户需要向这里添加自己的中断服务代码,并打开中断,即可使用中断了。STM32中的所有中断服务函数的名字都是在启动代码'startup_stm32f10x_xx.s'中定义过了的,比如'EXTI0_IRQHandler'(外部中断0)、'CAN1_RX1_IRQHandler'(CAN1的接受中断),'所以最好不要自己随便改名字。注意到stm32f10x_it.c并没有将所有中断函数的名字都写出来,只写出了系统内部的中断,所有外设的中断函数名都没有写,需要用户自己添加。
@->STM32_LIB文件夹下放置的是stm32外设的库函数文件,均位于工程目录'Libraries\STM32F10x_StdPeriph_Driver\src'中。若要添加新的外设只需从此目录中添加对应的c文件即可
@->STM32_STARTUP文件夹下放置的是启动代码。注意这里的启动代码并不是从Keil里面拷贝出来的,而是从下载的库文件中拷贝的。
@->CMSIS中放置的是CMSIS标准给出的一个核心文件'core_cm3.c',定义了大量内嵌汇编函数用于连接核心与上层函数;系统配置文件'system_stm32f10x.c'中定义了初始化函数、系统时钟设定等。
四.配置MDK模板:
@->右击STM32F10x_Tar,选择第一个Options for Target ‘STM32F10x_Tar’即可进入设置↓
选中Output选项卡,修改"Name of Excutable"为"ExcSTM32",改其他名也可以,但关键是不能包含下划线,否则JLink仿真会报错(*这也有待验证为什么)。选中"Create Hex File"框将生成最终的.hex文件,否则编译最后仅仅到.axf就结束了。其他设置保留默认:↓
之后还是在这一页,点击"Select Folder for Objects..."按钮,将其设置为工程目录"Solution\OBJ"即为目标文件生成的目录。
@->选中Listing选项卡,点击"Select Folder for Listings...",将其设置为工程目录"Solution\LIST"即为list文件生成的目录。
这里默认没有选中"C Compiler Listing: .\.*txt"。也可以选上,在编译时将以txt的形式多输出一份列表文件。
@->选中C/C++选项卡,点击"Include Paths",添加四条包含路径如下图,这里就包含了所有头文件的目录↓
之后在"Preprocessor Symbols"中添加Define“STM32F10X_MD,USE_STDPERIPH_DRIVER”,这是两个预定义,中间用逗号隔开的。其中“STM32F10X_MD"表明使用的是中等容量的CPU,在入口头文件中有很多地方用到了宏判断来进行定义分类,有兴趣可以翻翻头文件"stm32f10x.h"内的宏定义就明白了。"USE_STDPERIPH_DRIVER"的道理也是一样。
选中"One ELF Section per Function"。若选中了这一项,则在编译时有很多没有被用到的函数将不会被编译。对于库函数来说,实际上我们最终不可能所有函数都会用到,全部编译后的目标文件将会很大,很费资源。所以这里选中项,最终编译时将会达到很大的优化作用,有兴趣可以自己试试选中这项或不选中看看最终生成的文件大小,保准比你调整优化等级"Optimization"来的差别大。
最终的设置见图↓
至此全部MDK的设置完毕。
@->打开最开始的那个main.c文件,添加如下代码这里的主函数什么都不写↓
/** ************************************************************************** * @file main.c * @author apollius * @version V0.1 * @date Nov.20 2012 * @brief 用于STM32lib3.5的工程模板,已配置为STM32F103RB芯片 ************************************************************************** */ #include "stm32f10x.h" /*位于当前工程目录下的头文件,即STM32库V3.5中的stm32f10x.h*推荐*/ //#include <stm32f10x.h> /*位于MDK安装目录下的头文件stm32f10x.h*/ int main(void) { return 0; } /************************** END OF FILE **************************/
点击Build(F7),若一切设置正常,编译将不报错。当然到这一步完全可以就开始着手自己的项目的编写了,不过这并不是本次教程的初衷。为了有更好的代码编写体验,接下来将进行一些扩展设置,进一步设置我们的工程模板以适用于Visual Studio或Eclipse编程。
@.[FIN] @.date->Nov 20, 2012 @.author->apollius