使用eclipse向导建立的工程,很容易就能编译通过,且它不再使用汇编启动文件(S文件),而是全部使用了C代码,当然一样的方便,好用。
然而,对于好奇心严重的人来说,就是想搞清楚,与以前Keil的工程有什么区别,S文件能不能用,如何组建一个和以前工程类似的文件结构。。。。。等问题,所以决定新建立一个空的工程。
工程建立,还是简单,但配置相对麻烦点:
新建工程时,选择C++工程管理,方便以后程序中应用到面向对象相关的代码。
然后输入工程名、选择Empty Project,使用ARM Cross GCC编译工具。然后下一步,再下一步,这期间,要检查一下工具链的路径是不是正确的,即:在“GNU ARM Cross Toolchain”页面中,最后完成工程建立。
才建立好的工程,在其工程目录下,只有三个项目:.settings文件夹、.cproject文件、.project文件
这时,按自己的工程管理习惯,建立相应的文件夹,用来存放对应的文件,如src、lib、inc等。然后,把stm32相应的库”STM32F10x_StdPeriph_Lib“复到过来,放到相应的文件夹下面。同时把启动用的LD文件、*.s文件找到,复制出来,我用的是STM32F103RC器件
对于eclipse,s文件要复制\Libraries\CMSIS\Device\ST\STM32F10x\Source\Templates\TrueSTUDIO下的s文件,如:Libraries\CMSIS\Device\ST\STM32F10x\Source\Templates\TrueSTUDIO\startup_stm32f10x_hd.s
对于ld文件,在库下找相应的工程例子目录,复制TrueSTUDIO文件夹下的相应文件,如TrueSTUDIO\STM3210E-EVAL\stm32_flash.ld
然后,还需要在对应的工程例子中,找到stm32 config.h文件,如“stm32f10x_conf.h”,并将其复到制工程中去。
这时,设置工程属性,主要是要添加C/C++编译器的宏(需要添加两个宏定义:STM32F10X_HD,USE_STDPERIPH_DRIVER)与include路径,然后添加汇编文件的include路径,添加Linker的LD文件及include库路径。还要选择编译工具,或添加编译工具的环境变量到工程属性的环境变量中去。
最后,在工程管理中刷新一下文件结构,打开复制过来的库文件,在不需要的库文件夹上点右键,从工程中禁止对其编译。可以编译了,这时可能会报错,提示一些什么文件找不到,根据提示,去文件中查看一下相应的文件或相关的include路径设置。
最后可能还会遇到两个提示出错或警告的:
1、/../arm-none-eabi/bin/ld.exe: warning: cannot find entry symbol Reset_Handler; defaulting to 08000000
解决:startup_stm32f10x_hd.s改文件名后缀s为大写S:startup_stm32f10x_hd.S
2、
c:/program files/eclipse/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-abort.o): In function `abort':
abort.c:(.text.abort+0xa): undefined reference to `_exit'
c:/program files/eclipse/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_kill_r':
signalr.c:(.text._kill_r+0x10): undefined reference to `_kill'
c:/program files/eclipse/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_getpid_r':
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
collect2.exe: error: ld returned 1 exit status
解决:工程属性中,C/C++ Build->Settings->Tool Settings->Optimization配置中,右边“Link-time optimizer”选项勾上。
由于芯片的存贮器大小不同,还需要修改ld文件,配置一下贮存器:
/* Highest address of the user mode stack */
_estack = 0x2000C000; /*这里要改 end of 48K RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0; /* required amount of heap */
_Min_Stack_Size = 0x800; /* required amount of stack */
/*这里要改 Specify the memory areas */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 48K
MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K
}
简单的空工程建立完了,这就和使用keil类似的文件结构,有s文件,向量表也在s中。建立一个LED灯的main.cpp文件,可以开始测试一下程序了
但是,自己建立空工程并配置,相对麻烦一点,所以还是推荐 使用向导建立一个非空的工程,这样很多配置不用去检查了。
插一句话,如果对整个eclipse开发环境不熟悉的,又想试一试的,可以看看这篇文章(公司给了时间,我写的原创文章,放到公司网站的技术贴下):
详细的eclipse编译环境塔建方法,请下载文章:
《Windows下STM32单片机的eclipse编译环境搭建》