找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6043|回复: 0
打印 上一主题 下一主题
收起左侧

在MDK开发环境下的STM32工程结构

[复制链接]
跳转到指定楼层
楼主
ID:82083 发表于 2015-6-9 02:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最近迫于找工作的压力,我不得不加快嵌入式学习的步伐,不再和AVR、PIC8位机纠缠了,开始学习32位单片机。开发环境如下:STM32F103RBT6+MDK+JLINK。今天打开了第一个程序:流水灯。程序内容很简单,只是这个工程的结构看上去很是复杂,不像之前一个工程里就那么几个C源程序和头文件。因此,今天很有必要讨论一下这个工程的结构,相当于一个程序的骨架。

其实认真研究一下,会发现例程工程和之前我们使用编写51单片机程序用的工程大同小异。至于刚开始感觉这个结构很复杂,我的原因是之前编写51程序是将所有的代码几乎都写进主源程序里,头文件和多个源程序的使用很少。开发STM32时,因为有了官方的封装的外围器件驱动代码库,这样我就不得不使用头文件和多个源程序,感觉不适应,只能说是少见多怪。其实想想,开发STM32的这种编程方式才是科学的。STM32的外围器件驱动库的作用其实就是将面向寄存器的操作封装成为函数,这样我们在编写具体的应用程序的时候就可以直接调用这些函数,这样,一方面降低编写程序的难度,提高了编程的准确性,另一方面,也提高了程序的可读性。在编程之前,我们必须将我们的要用到的外围器件的驱动程序的头文件(各种宏定义和寄存器操作函数的声明)和源程序(宏定义和各种寄存器操作函数的实现)从头到尾看一遍,这样我们在编写程序的时候心里才有数,知道用哪些宏定义的变量和函数。

说了这么多,回到工程结构上来。STM32的例程工程通常包含几个组User,RVMDK,CMSIS,StdPeriph_Driver,DOC。在3.0.0版本的外围器件驱动库的例程工程中只有这些,在3.3.0和3.5.0的版本中,还有一个STM32_EVAL组,这个组的源程序和头文件定义了一些与STM32自己的开发板相关一些变量,如果你用的不是这几款开发板,这个组就可以删去。

User组里放的是我们自己的编写的源代码和头文件。

RVMDK组通常存放的是汇编启动代码。

CMSIS(Cortex Microcontroler Software InterfaceStandard)组放的时与Cortex-M3相关的文件,如core_cm3.c和system_stmf10x.c。

StdPeriph_Driver组里放的是外围器件驱动代码。用什么就向这个组里加入什么。例程中所有的驱动都加上了,这在我们实际使用时是没有必要的。

DOC组放一些说明文本,这从侧面说明说明一个问题,工程这种文件组织形式一方面有利于多个程序文件的编译,另一方面则方便文件浏览。参与编译的是工程里的启动代码(.s),源程序(.c)和头文件(.h)。这些代码经compiler编译生成目标文件(.obj),然后linker再将这些目标文件链接成可执行文件(.hex)(在PC环境下则是.exe)。

有一点需要明确,工程结构仅仅是一个映射。它只是使程序看起来有条理。

这么多组只是浮云,在电脑里并不一定要有User,RVMDK,CMSIS,StdPeriph_Driver,DOC这些文件夹。这些组包含的文件都存放在外围器件驱动压缩包解压出得到Library文件夹里。咱们只要把这些文件映射到工程中,并且在工程设置中将这些文件的路径指明,这样编译器在编译的时候遇到文件包含时就到这个指定路径里找头文件。另外,例程模板文件夹里还有两个文件夹(List和Obj),它们两个负责存放编译链接过程中产生的中间文件。

我的第一个工程是这样建立的:

1、建立一个文件夹,并命名为GPIO。

2、在这个文件夹下,新建文件夹,命名为RVMDK,然后在RVMDK文件夹下建立两个文件夹,分别命名为Obj和List。

3、将例程STM32F10x_StdPeriph_Lib_V3.0.0\Project\Examples\GPIO\IOToggle中的所有文件复制到GPIO文件夹下,我们的程序就以其中的main.c为基础。

4、接下来就该建立工程了,这和之前建立51工程一样,我将工程建立在RVMDK文件夹下。

5、将之前提到那些工作组(User,RVMDK,CMSIS,StdPeriph_Driver,DOC)添加到工程中,我只添加了User,Startup,Driver这几个工作组。然后把从STM32F10x_StdPeriph_Lib_V3.0.0\Project\Examples\GPIO\IOToggle复制的源程序添加到User工作组,把STM32F10x_StdPeriph_Lib_V3.0.0\Libraries\STM32F10x_StdPeriph_Driver\src中的源程序添加到Driver工作组,把STM32F10x_StdPeriph_Lib_V3.0.0\Libraries\CMSIS\Core\CM3下的源程序(.c)和STM32F10x_StdPeriph_Lib_V3.0.0\Libraries\CMSIS\Core\CM3\startup\arm的启动文件(.s)添加到Startup工作组。这样工程就搭建好了。

6、之前建立51工程时,工程的设置很简单。不过在建立STM32工程时,工程的设置很重要。设置的主要内容是指明文件包含路径。就是指示编译器在编译时遇到文件包含是应该到哪儿去寻找被包含的头文件。如果路径设置不对或者有遗漏,编译器一旦找不到要找的头文件,就会到keil自己的头文件库去寻找,由于头文件库的版本不配,就会编译失败,出现一堆令人头疼的error。

7、 指示include路径有

..\

..\..\..\Libraries\STM32F10x_StdPeriph_Driver\inc

..\..\..\Libraries\CMSIS\Core\CM3

注:..\ 的意思是工程文件所在路径的上一层    .\  则是工程文件的当前路径,即工程文件所在的文件夹里。

我的工程文件夹GPIO位于与模板(template)相同的路径(STM32F10x_StdPeriph_Lib_V3.0.0\Project)。

另外还要将USE_STDPERIPH_DRIVER,STM32F10X_MD写入工程配置面板的C/C++选项面板的define栏里。

现在基本上大功告成了,保存后,按下F7,就

Build target 'GPIO'
compiling main.c...
compiling core_cm3.c...
compiling system_stm32f10x.c...
compiling misc.c...
compiling stm32f10x_gpio.c...
compiling stm32f10x_rcc.c...
linking...
Program Size: Code=2588 RO-data=268 RW-data=24ZI-data=608  
FromELF: creating hex file...
".\Obj\GPIO.axf" - 0 Error(s), 0 Warning(s).



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表