使⽤EclipseIDEforGNUARM搭建STM32的开发环境
01:下载必要的⽂件
02:软件安装
2.1 这⼀步⽐较简单,这三个都是绿⾊软件,直接解压到想要存放的路径即可,如果想要在任意地⽅使⽤make和arm-none-eabi-gcc还可以把他俩安装⽬录的bin⽂件夹添加到path。
添加环境变量不是必须的,因为即使配置了PATH,Eclipse⾥⾯还是需要再配置⼀遍。
如果添加了环境变量,可以使⽤make和arm gcc的 --version输出下版本信息,以判断是否成功添加。
2.2 eclipse安装完成后,还可以根据⾃⼰的电脑配置修改下启动配置⽂件“eclipse.ini”(以下是8G内存的配置参数,仅供参考),如果对java虚拟机不了解的话也可以跳过这⼀步。
-Xms1024m
-Xmx2048m
-XX:PermSize=256m
-XX:MaxPermSize=256m
-Xverify:none
2.3 eclipse的基本配置,这⼀步是将步骤(2.1),安装的编译⼯具配置到eclipse,
选择Window -> Preference打开eclipse的设置窗⼝。
切换到MCU列表,对带有全局(Global)属性的配置项⽬进⾏修改。
在ARM Toolchains Paths中,Default toolchain可以选择任意的,前提是下回创建⼯程时需要选择被配置的那个,
因此为了⽅便可以配置下拉列表的第⼀个,“GNU MCU Eclipse ARM Enbedded GCC”。
Toolchain name ⽆法修改,保持默认即可。
Toolchain folder 设置到arm-gcc安装⽬录的bin⽂件夹。
切换⾄Global Build Tools Path,此处填⼊make⼯具安装路径下的bin⽂件夹。
如果安装了jlink,还可以配置下jlink gdb路径,切换⾄ Global SEGGER J-Link Path,在Executable中填⼊,在Folder中填⼊你的jlink安装路径。
03:建⽴项⽬
3.1 打开eclipse,选择File -> new -> C/C++ Project -> C Managed Build,如果想使⽤C++开发的话,也可以选择下⾯⼀⾏的C++ Managed Build,
(但是需要考虑的是这个C++标准⽀持的不是很全,且⽣成的⼆进制⽂件较⼤),然后点击Next即可进⼊⼯程建⽴界⾯。
3.2 这⾥是对⼯程的基本信息进⾏配置,例如⼯程名称,保存路径,模板代码等。
Project name:可以按照需求填写;
Location:可以选择default location(即设置的⼯作区⽂件夹)或者⾃定义的路径;
Project type:该列表下有很多ST系列MCU的模板代码,可以按照⾃⼰的设备平台选择,这⾥指定了平台后,会有对应的STD库或者HAL库被⾃动添加;Toolchains:这⾥使⽤ARM Cross GCC交叉编译器即可,然后点击NEXT
3.3 对芯⽚配置进⾏修改。
Chip family 选择所使⽤的芯⽚系列即可。
Flash size(KB) 芯⽚的Flash容量,这后期在⾥根据芯⽚设置,如果不清楚可以任意写,ldscript中还是可以修改的。
RAM size(KB) 芯⽚的RAM⼤⼩,同上。
Clock(Hz): 有晶振的填HSE时钟,没晶振的填HSI时钟,该配置实际上没啥卵⽤,在STM32的初始化⽂件system_stm32f0xx.c中可以修改,即使在此处配置了,也不会同步更新到模板代码中。
Content:提供了Blinky 和Empty两个demo,⼀个是闪灯程序,另⼀个则是空项⽬,第⼀次开始可以选择Blinky熟悉下⼯程结构。
Use system calls: 这⾥是标准库的系统调⽤,主要为stdin stdout标准输⼊/输出流服务,如果需要在eclipse console中打印log,可以选择Semihosting;如果习惯使⽤Jlink RTT也可以选择POSIX或者Freestanding。
Trace output:如果在Use system calls中没有选择Semihosting,这⼀部分的修改是不⽣效的,前⼀步
选择了Semihosting后这⾥可以选择STDOUT和DEBUG 通道,功能上⼆者没有区别(⼀个是RUN的输出,另⼀个是DEBUG的输出)。
下⾯的勾选框中,可以把Enable -Werror去除,因为ST的标准库有些编码不规范的地⽅,去除Werror避免编译报错。
点击NEXT后可以对项⽬的⽂件夹名称进⾏修改,这⾥也可以使⽤默认的。
再次点击NEXT后可以选择创建的版本,⼀般⽽⾔会有debug和release两个版本,同时勾选Debug和release会创建⼀条宏定义,⽤以切换代码版本,这⾥只选个release即可。
接下来选择arm⼯具链,使⽤之前配置好的,最后点击Finish即可创建⼯程。
04:修改项⽬
4.1 打开main.c,屏蔽掉trace_puts、puts、fprintf、trace_printf打印函数。
4.2 修改连接脚本,打开ldscripts/mem.ld,在MEMORY中仅保留RAM和FLASH(根据你的芯⽚决定)
4.3 打开sections.ld,删除SECTIONS中之前在MEMORY中移除的段,堆栈⼤⼩也可以在此修改。
__stack = ORIGIN(RAM) + LENGTH(RAM);
_estack = __stack;
__Main_Stack_Size = 1024 ;
PROVIDE ( _Main_Stack_Size = __Main_Stack_Size ) ;
__Main_Stack_Limit = __stack - __Main_Stack_Size ;
PROVIDE ( _Main_Stack_Limit = __Main_Stack_Limit ) ;
_Minimum_Stack_Size = 256 ;
PROVIDE ( _Heap_Begin = _end_noinit ) ;
PROVIDE ( _Heap_Limit = __stack - __Main_Stack_Size ) ;
SECTIONS
{
.
isr_vector : ALIGN(4)
{
FILL(0xFF)
__vectors_start = ABSOLUTE(.) ;
__vectors_start__ = ABSOLUTE(.) ; /* STM specific definition */ KEEP(*(.isr_vector)) /* Interrupt vectors */
*(.after_vectors .after_vectors.*) /* Startup code and ISR */
} >FLASH
.inits : ALIGN(4)
{
__data_regions_array_start = .;
LONG(LOADADDR(.data));
LONG(ADDR(.data));
LONG(ADDR(.data)+SIZEOF(.data));
__data_regions_array_end = .;
__bss_regions_array_start = .;
LONG(ADDR(.bss));
LONG(ADDR(.bss)+SIZEOF(.bss));
__bss_regions_array_end = .;
KEEP(*(.init))
KEEP(*(.fini))
. = ALIGN(4);
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP(*(.preinit_array_sysinit .preinit_array_sysinit.*))
KEEP(*(.preinit_array_platform .preinit_array_platform.*))
KEEP(*(.preinit_array .preinit_array.*))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(4);
PROVIDE_HIDDEN (__init_array_start = .);
KEEP(*(SORT(.init_array.*)))
KEEP(*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array))
PROVIDE_HIDDEN (__fini_array_end = .);
} >FLASH
.text : ALIGN(4)
{
*(.text .text.*)
*(.rodata .rodata.* .constdata .constdata.*)
*(vtable) /* C++ virtual tables */
KEEP(*(.eh_frame*))
*(.glue_7)
*(.glue_7t)
.ab : ALIGN(4)
{
*(.ab* .gnu.linkonce.armextab.*)
} > FLASH
. = ALIGN(4);
__exidx_start = .;
.idx : ALIGN(4)
{
*(.idx* .gnu.linkonce.armexidx.*)
} > FLASH
__exidx_end = .;
. = ALIGN(4);
_etext = .;
__etext = .;
_sidata = LOADADDR(.data);
.data : ALIGN(4)
{
FILL(0xFF)
_sdata = . ; /* STM specific definition */
__data_start__ = . ;
*(.data_begin .data_begin.*)
*(.data .data.*)
*(.data_end .data_end.*)
. = ALIGN(4);
_edata = . ; /* STM specific definition */
__data_end__ = . ;
} >RAM AT>FLASH
.bss (NOLOAD) : ALIGN(4)
{
__bss_start__ = .; /* standard newlib definition */ _sbss = .; /* STM specific definition */
*(.bss_begin .bss_begin.*)
*(.bss .bss.*)
*(COMMON)
*(.bss_end .bss_end.*)
. = ALIGN(4);
__bss_end__ = .; /* standard newlib definition */ _ebss = . ; /* STM specific definition */
} >RAM
.noinit (NOLOAD) : ALIGN(4)
{
_noinit = .;
*(.noinit .noinit.*)
. = ALIGN(4) ;
_end_noinit = .;
java编译器ide最新版下载} > RAM
PROVIDE ( end = _end_noinit ); /* was _ebss */
PROVIDE ( _end = _end_noinit );
PROVIDE ( __end = _end_noinit );
PROVIDE ( __end__ = _end_noinit );
._check_stack : ALIGN(4)
{
. = . + _Minimum_Stack_Size ;
} >RAM
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.
stabstr 0 : { *(.stabstr) }
.l 0 : { *(.l) }
.lstr 0 : { *(.lstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
ment 0 : { *(ment) }
}
4.4 编译前的相关配置,点击下Project Explorer中的项⽬名称,在Project -> Properties -> C/C++ Build Settings中做出如下配置:
在Create Flash Image中可以选择输出Hex或者bin⽂件。
在C/C++ Build -> Behavior 中将并⾏编译打开(链接还是单线程的),这样可以提⾼编译速度,⼀般项⽬配合8线程处理器,4~5秒即可完成。
以上配置完成后,基本可以进⾏编译了(makefile由eclipse根据配置⾃动⽣成),编译完成后有可执⾏⽂件各个段的占⽤空间信息。
05:程序下载
06:基于标准库(StdPeriph_Lib)(HAL库也同样适⽤)建⽴⼯程
STM32F072
USE_STDPERIPH_DRIVER
HSE_VALUE=16000000
这三个宏定义都在stm32f0xx.h是被使⽤,其中'STM32F072'是必须的,另外两个可选。
C/C++ Build -> Settings Tool Settings ->GNU ARM Cross C Compiler -> Includes 添加include path
这⾥也可以使⽤相对路径。
C/C++ Build -> Settings Tool Settings ->GNU ARM Cross C Compiler -> Optimization 语⾔标准选择c99或者c11都可以,在gnu编译器⾥,选择gnu99或gnu11
C/C++ Build -> Settings Tool Settings ->GNU ARM Cross C Compiler -> warnings 这三个建议打开,编译时的warning可能会在运⾏时变成error,有必要提前处理。
C/C++ Build -> Settings Tool Settings ->GNU ARM Cross C Linker -> General
Script files 添加先前复制进项⽬的STM32F072VB_FLASH.ld⽂件,只需输⼊⽂件名即可。
链接选项 -nostartfiles -Xlinker --gc-sections也需要勾选下。
C/C++ Build -> Settings Tool Settings ->GNU ARM Cross C Linker -> Libraries
只需要修改 Library search path,设置之前新建的ldscript⽂件夹,使⽤相对路径"../ldscript"或者eclispe定义的宏${workspace_loc:/${ProjName}/ldscript}都可,Libraries栏下其他项⽬保持默认。
C/C++ Build -> Settings Tool Settings ->GNU ARM Cross C Compiler -> Miscellaneous
勾选newlib-nano
C/C++ Build -> Settings Tool Settings ->GNU ARM Cross Create Flash Image -> General
这⾥可以选择⽣成bin⽂件orhex⽂件,我这⾥使⽤bin⽂件。(jlink下载时使⽤的是elf⽂件,因此这⾥
选择bin⽂件或hex⽂件取决于其他烧写⼯具的要求),
C/C++ Build栏的修改就此完成了,其他的保持默认即可。
C/C++ General -> Paths and Symbols -> Source Location
点击Add Folder,把我们的启动⽂件所在的⽂件夹也添加进来。
可以添加.c⽂件编译的过滤器,可以屏蔽掉当前⽤不到的c⽂件,增加编译速度。
按照如下步骤点击⿏标
选择需要屏蔽的⽂件,对于Hello World⼯程来说,⽤不到外设库,可以全部屏蔽(以后⽤到需要到这⾥解除过滤)。
最后保存即可,可以看到Includes增加了我们⾃定义的路径,src⽬录下红⾊的叉也消失了(如果未消失,可按F5刷新)。
最后点击Project -> Build Project
可以看出,开启并⾏编译后速度飞快。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论