使用标准库新建工程模板
需要准备的工具
表1:需要的工具软件
序号 | 软件工具 | 描述 |
J-Link仿真器或ST-Link仿真器 | 仿真器驱动已安装 | |
MDK5软件 | 已完成该软件的安装 | |
STM32F10x标准库文件 | 版本V3.5 |
- 搭建开发环境所需工具在资料包中的位置:
- MDK5驱动安装软件:位于“...\第2部分:开发软件工具\ 1 - 搭建开发环境安装源文件\ 1--MDK5.23安装文件” 目录下
- STM32F10x标准库文件:位于“...\第2部分:开发软件工具\ 1 - 搭建开发环境安装源文件\ 10--STM32F10x标准库” 目录下。
- 注意事项:
- 本文档给出的新建工程的方法是基于STM32F10x标准库的,不同于基于HAL库建立工程的方法。
- 基于STM32F10x标准库新建工程的方法不是唯一的,本文档仅是艾克姆科技推荐用户可以借鉴的一种新建工程的方法。
新建工程模板
规划工程文件存放目录
建立工程之前,我们需要先考虑一下工程文件的组织,也就是工程的存放目录。清晰的工程目录既方便我们管理工程中的各个文件,也方便日后的维护和移植。我们可以根据自己的习惯和喜好来建立自己的工程存放目录,但是也不要太随意,文件目录应该一目了然,目录中各个文件夹的名字要能准确地指示里面的内容。
下面是我们建立工程时使用的工程目录,供大家参考。
图1:工程文件存放目录
新建工程
因为一般的项目都会用到LED指示灯,所以下面我们通过新建一个点灯的工程来作为我们的工程模板,以此来说明工程建立和配置的步骤。工程名取为:led_blinky,工程存放到D盘。
- 按照上文中描述的工程文件存放目录新建用于存放工程各个部件的文件夹。
先在D盘新建一个名字为led_blinky的文件夹,然后在这个文件夹下面新建如下图所示的5个文件夹。
- 将STM32F10x标准库Libraries文件夹里面的文件拷贝到Lib文件夹,并将STM32F10x_StdPeriph_Driver 改名为F10x_FWLIB(原文件名较长,改名是为了方便)。
- 将库配置头文件stm32f10x_conf.h拷贝到User文件夹。
图2:建好的工程文件存放目录
- 启动MDK,点击【Project】,在弹出的下拉菜单中选择【New uVision Project】。
图3:新建工程窗口
- 设置工程名和工程保存路径,设置完成后点击【保存】。
- 注意事项:工程路径和工程名设置注意事项:工程路径和工程名最好不要包含汉字字符(虽然有些计算机使用汉字字符没有问题,但是还是建议不要使用汉字字符,因为MDK对汉字字符的支持比较差),同时路径不要过深,否则打开工程或仿真时可能会出现找不到文件或者MDK崩溃的问题。
图4:设置工程路径和工程名
保存后,工程名称是:led_blinky,工程保存路径是:“…\project\led_blinky”。
- 保存工程后,会弹出器件选择窗口,选择好器件后点击【确定】。
开发板上使用的MCU型号是:STM32F103ZET6,所以,在下图的器件列表中需要选择STM32F103ZE这个型号。
图5:选择器件型号
- 配置RTE(Run-Time Environment),选择完成后点击【OK】。
勾选两个必选项:CMSIS中的CORE和DEVICE中的StartUp。注意他们的版本号,STM32标准库V3.5对应的Startup的版本号是1.0.0,所以这里Startup的版本要选择1.0.0。至于CORE版本,我们使用的是5.0.1版本(MDK5.23安装时会同时安装CMSIS5.0.1)。另外需要注意的是新建工程时,配置RTE的界面只会显示最新的CORE和DEVICE版本,如果显示的版本和我们需求的版本不一样,可以在工程配置中修改,后面在工程配置章节会说明修改方法。
图6:配置RTE
- 管理MDK工程目录。
工程新建后,MDK工程窗口中显示的是默认的目录,为了让MDK工程目录清晰,方便添加文件和管理文件,我们需要对目录进行整理。下图中是新建工程时的默认目录和整理后的目录。
图7:整理目录
我们可以看到,整理后的工程目录很直观:工程名是“led_blinky”,工程的目标设备是IK-ZET6开发板。工程包含4个组,用来归类加入到工程的文件,如果要加入STM32标准库文件,可以加入到“F10x_FWLIB”组,如果是我们自己编写的文件,可以加入到“User”组,如果使用了第三方的库,可以将文件加入到“EXTERNAL”组,如果是记录或发布相关的文档,可以加入到“DOC”组。
- 注意事项1:MDK中的工程目录不需要完全和工程文件存放目录一样。
- 注意事项2:一般情况下,工程需要实现的功能稍复杂一些,还会再根据功能添加不同的组,如添加一个“BSP”组,将指示灯LED和按键相关的文件加入到该组,如下图所示。
图8:带BSP组的目录
整理MDK工程目录时会用到下面几个操作:
- 修改组名称:先选中需要修改名称的组,然后单击即可修改名称。注意,不是双击。
- 添加组:选中Target(即整理后的目录中的IK-ZET6),右键选中“Add Group”,即可添加一个组。
- 管理软件包。
? 在这里我们可以修改CMSIS和器件包的版本,以及设置CMSIS和器件包是否自动使用已安装的最新的版本。
图9:管理软件包
- 注意事项:CMSIS我们使用的版本是5.0.1,器件包我们安装的是标准库3.5的器件包“Keil.STM32F1xx_DFP.2.2.0.pack”,所以这里选择2.2.0版本。
- 新建main.c文件并添加到工程。
? 通常,工程都会包含一个“main.c”文件,用于存放C程序的入口函数(main()函数),所以,我们需要先新建一个“main.c”文件并添加到工程。
- 执行“File→New”新建文件,如下图:
图10:新建文件
- 点击保存按钮“Save”将文件命名为“main.c”并保存到User文件夹。
- 将“main.c”文件添加到工程。
MDK新建的文件不会自动加入到工程,需要手动添加。将文件加入的到工程可通过下面3种来实现。
- 方法1:双击组名Application打开添加文件窗口,导航到“main.c”文件的存放路径,添加即可。
- 方法2:选中Application组,右键选择“Add Existing Files To…”打开添加文件窗口,导航到“main.c”文件的存放路径,添加文件。
- 方法3:通过工程项目管理添加。如下图所示:
图11:通过工程项目管理添加文件
- 向工程中添加需要的库文件
向工程中添加库文件的步骤和添加“main.c”文件的步骤一样。
本例中因为只是驱动指示灯,所以只需要添加GPIO和RCC(复位和时钟控制)这两个库文件即可。库文件名称是:stm32f10x_gpio.c和stm32f10x_rcc.c。
配置工程
点击魔术棒打开工程配置窗口。
图12:工程配置窗口
配置“Target”选项卡
图13:配置Target选项卡
主要配置下面几个项目:
- MicroLib库:勾选使用MicroLib库。Microlib是缺省 C 库的备选库。RealView MDK为进一步改进基于ARM处理器的应用代码密度,采用了新型Microlib C库(用于C的ISO标准运行时库的一个子集),并将其代码镜像降低最小以满足微控制器应用的需求。Microlib C库进行了高度优化以使代码变得很小,可将运行时库代码大大降低。
- 内存配置
新建工程的时候,MDK会自动根据选择的芯片配置内存,但是这里我们也要明白内存这样配置的依据是什么。
查阅芯片的数据手册可知STM32F103ZET6片内FLASH起始地址是0x80000000,大小是512KB(对应的16进制是:0x80000),片内RAM起始地址是0x20000000,大小是64KB(对应的16进制是:0x10000),所以内存应配置如下:
? 片内ROM设置:
起始地址(16进制) | 大小(16进制):512K字节 |
0x80000000 | 0x80000 |
片内RAM设置:
起始地址(16进制) | 大小(16进制):64K字节 |
0x20000000 | 0x10000 |
- 注意事项:晶振频率Xtal是用于软件仿真的,不需要设置。
配置“Output”选项卡
图14:配置Output选项卡
主要配置下面几个项目:
- 指定目标文件输出路径:MDK新建工程的时候会自动在工程保存目录下创建Objects文件夹,用来存放编译后生成的目标文件。这里使用默认的路径即可,一般情况下,不建议自己设置,但是我们需要知道在这里可以设置目标文件输出路径。
- 设置生成HEX文件:需要勾选“Create HEX File”,使能生成HEX文件,并设置一下输出的HEX文件的名称,设置之后,工程编译成功即可生成HEX文件,生成的HEX文件位于指定的“目标文件输出路径”的目录下。
配置“C/C++”选项卡
图15:配置“C/C++”选项卡
主要配置下面几个项目:
- 全局宏定义:如果有多个宏定义,用空格隔开。注意,这里加入的宏定义,对于整个工程有效。
- STM32F10X_HD:STM32F103ZET6的Flash是512K字节,属于高密度系列,所以要加入这个宏。
- USE_STDPERIPH_DRIVER:工程中会使用标准库的驱动,所以要加入这个宏启用外设驱动。
- 设置优化级别“Optimization”:数值越大,优化级别越高。注意如果需要仿真,将优化级别设置为最低(Level 0)。
- 勾选“One ELF Secion per Function”。
One ELF Secion per Function的机制是将每一个函数作为一个优化的单元,而并非整个文件作为参与优化的单元。该机制具有的这种优化功能特别重要,尤其是在对于生成的二进制文件大小有严格要求的场合。
One ELF Section per Function对于一个大工程的优化效果尤其突出,对于小工程优化效果不是很明显。想象一下这样的一个应用场合:在STM32F103ZET6程序开发过程中,我们会使用标准库,我们加入标准库中的一个文件到工程并不表示我们会使用这个文件中所有的函数,这样,最后生成的二进制文件中就有可能包含众多的冗余函数,造成了存储空间的浪费,通过使用One ELF Section per Function,即可在最后生成的二进制文件中将冗余函数排除掉,从而节省存储空间。
- 启用“C99 Mode”:启用C99模式后,我们就可以使用C99的一些新特性,如程序语句之后定义变量(C99之前不允许这么做),结构体指定初始化等。
- 设置头文件包含路径:
当我们引用了一个头文件时,就需要告诉编译器这个头文件的路径,否则,编译器无法定位头文件,在编译的过程中会产生错误。
头文件路径有几种设置方法,最常用的方式就是在这里加入头文件路径(其他几种方式不方便,也不灵活,极少被使用,故在此不提)。
添加头文件路径的原则是:使用了哪个头文件,就要将该头文件所在路径添加进来,如本例中使用了GPIO的头文件,所以要在这里加入路径“..\Lib\F10x_FWLIB\inc”。
路径的设置方法:
路径又分为相对路径和绝对路径,绝对路径是从盘符开始的完整的路径,相对路径是相对于工程文件“led_blinky.uvprojx”的路径。使用绝对路径时一旦将工程拷贝到其它目录,编译就会出错,因为路径变了。使用相对路径则不会出现这样的问题,所以我们通常使用的都是相对路径。相对路径中必须要掌握的几种路径表示方法:
- "..\":表示工程文件所在目录向上一级的目录。"..\"可以连用,“..\ ..\” 表示工程文件所在目录向上两级的目录,以此类推。
- ".\":表示的是当前路径。
配置“Debug”选项卡
IK-ZET6开发板支持多种仿真器,如J-LINK、ST-LINK、CMSIS-DAP等,本节以J-LINK为例说明仿真器的配置。
图16:配置“Debug”选项卡
主要配置下面几个项目:
- Run to main():勾选后,仿真时程序会自动运行到main()函数。
- 仿真器设置:选择“J-LINK/J-TRACE Cortex”,点击“Setting”按钮进入设置界面。(注意:设置时需要将J-LINK仿真器连接到计算机)。
进入仿真器设置界面后,先切换到“Debug”选项卡,配置调试接口。
图17:配置下载选项
切换到“Flash Download”选项卡,加载编程算法。
图18:配置下载选项
“Flash Download”选项卡主要设置项目如下:
- Reset and Run:下载完成后自动复位并运行程序,这一项建议勾选。有时候我们发现程序下载后需要断电重启后才能运行,原因就是漏勾选了这一项。
- RAM for Algorithm:指定用于烧写程序的RAM区域,一般使用默认设置即可。
- program algorithm:Flash编程算法,一般建立工程选择芯片后会自动添加,如果没有,点击“ADD”按钮添加即可。
管理MDK软件包
当MDK中安装了多个软件包的时候,我们可以移除不需要的软件包,移除软件包按照下面的步骤进行:
- 点击“Pack Installer”按钮,如下图所示:
图19:打开“Pack Installer”
- Pack Installer的Devices选项卡中,选中“STM32F103”,切换到packs选项卡,点击需要删除的pack后面的“Remove”按钮即可移除。移除后“Remove”按钮的名称变为“Unpack”,若需要再次安装该pack,点击“Unpack”即可。
图20:移除软件包
本文暂时没有评论,来添加一个吧(●'◡'●)