Keil5.15使用GCC编译器编译STM32工程

2015年07月08日 18:44:04
我们使用Keil一般使用ARMCC编译MCU工程代码.其实,Keil也是支持内嵌GCC编译器的.我们可以使用GCC来编译我们的工程代码.

一、下载GCC编译器

GCC编译器下载地址
GCC编译器官网

二、安装GCC

我们可以把GCC解压到keil的安装目录下面.如下图

这里写图片描述

三、配置Keil使用GCC编译器

这里写图片描述

1、配置CC编译规则,Misc Controls 填写

-mcpu=cortex-m4 -mthumb -fdata-sections -ffunction-sections
这里写图片描述

2、Assembler中规则,Misc Controls 填写

-mcpu=cortex-m4 -mthumb
这里写图片描述

3、Linker中填写,Misc Controls 填写

-Wl,–gc-sections

-Wl,–gc-sections 这个主要是要把没有调用的函数不编译到hex中
这里写图片描述

注意:对于-mcpu=cortex-m4这个,如果你使用的是m3的芯片,则修改成-mcpu=cortex-m3

4、STM32F405NI_FLASH.ld的代码参考

/*
*****************************************************************************
**
**  File        : stm32_flash.ld
**
**  Abstract    : Linker script for STM32F407VG Device with
**                1024KByte FLASH, 128KByte RAM
**
**                Set heap size, stack size and stack location according
**                to application requirements.
**
**                Set memory bank area and size if external memory is used.
**
**  Target      : STMicroelectronics STM32
**
**  Environment : Atollic TrueSTUDIO(R)
**
**  Distribution: The file is distributed 揳s is,?without any warranty
**                of any kind.
**
**  (c)Copyright Atollic AB.
**  You may use this file as-is or modify it according to the needs of your
**  project. This file may only be built (assembled or compiled and linked)
**  using the Atollic TrueSTUDIO(R) product. The use of this file together
**  with other tools than Atollic TrueSTUDIO(R) is not permitted.
**
*****************************************************************************
*/

/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = 0x2001FFFF;    /* end of RAM */

/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x400;      /* required amount of heap  */
_Min_Stack_Size = 0x800; /* required amount of stack */

/* Specify the memory areas */
MEMORY
{
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
CCMRAM (rw)      : ORIGIN = 0x10000000, LENGTH = 64K
}

/* Define output sections */
SECTIONS
{
  /* The startup code goes first into FLASH */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
  } >FLASH

  /* The program code and other data goes into FLASH */
  .text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } >FLASH

  /* Constant data goes into FLASH */
  .rodata :
  {
    . = ALIGN(4);
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } >FLASH

  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
  .ARM : {
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
  } >FLASH

  .preinit_array     :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } >FLASH
  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } >FLASH
  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } >FLASH

  /* used by the startup to initialize data */
  _sidata = LOADADDR(.data);

  /* Initialized data sections goes into RAM, load LMA copy after code */
  .data : 
  {
    . = ALIGN(4);
    _sdata = .;        /* create a global symbol at data start */
    *(.data)           /* .data sections */
    *(.data*)          /* .data* sections */

    . = ALIGN(4);
    _edata = .;        /* define a global symbol at data end */
  } >RAM AT> FLASH

  _siccmram = LOADADDR(.ccmram);

  /* CCM-RAM section 
  * 
  * IMPORTANT NOTE! 
  * If initialized variables will be placed in this section, 
  * the startup code needs to be modified to copy the init-values.  
  */
  .ccmram :
  {
    . = ALIGN(4);
    _sccmram = .;       /* create a global symbol at ccmram start */
    *(.ccmram)
    *(.ccmram*)

    . = ALIGN(4);
    _eccmram = .;       /* create a global symbol at ccmram end */
  } >CCMRAM AT> FLASH


  /* Uninitialized data section */
  . = ALIGN(4);
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss secion */
    _sbss = .;         /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)

    . = ALIGN(4);
    _ebss = .;         /* define a global symbol at bss end */
    __bss_end__ = _ebss;
  } >RAM

  /* User_heap_stack section, used to check that there is enough RAM left */
  ._user_heap_stack :
  {
    . = ALIGN(4);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(4);
  } >RAM



  /* Remove information from the standard libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }

  .ARM.attributes 0 : { *(.ARM.attributes) }
}

从我粘贴的代码中,可以知道我是从STM32F407VG这个芯片的配置文件中拷贝过来的.

四、修改启动代码,使用GCC专用的.S文件

由于GCC与ARMCC的汇编代码格式不相同,不信你可以用比较工具看一下支持GCC的.S与支持ARMCC的.S写法是否一样.
那么我们需要重新写支持GCC的.S的启动代码吗?当然不需要,因为ST的已经为我们写好了.
如,我使用的gcc路径

D:\Code\project\Library\CMSIS\Device\ST\STM32F4xx\Source\Templates\gcc_ride7

这里写图片描述

五、配置完毕,编译程序排除解决相关错误

如果你使用到一些标准的C 库函数,如spirntf这些东西,或者你会报如下错误.

C:/Keil_v5/ARM/GCC/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/armv7e-m\libg.a(lib_a-sbrkr.o): In function _sbrk_r':
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to
_sbrk’
collect2.exe: error: ld returned 1 exit status

对与该问题的解决方法可以参考如下链接: 解决`_sbrk’错误的方法

这个链接主要告诉我们,如果有使用标准的C 函数,则要包含syscall.c 这个文件.

那么这个文件在哪里可以找到呢?
在Keil的pack文件目录下可以根据自己的芯片类型找到.如我的路径:

C:\Keil_v5\ARM\Pack\Keil\STM32F4xx_DFP\2.5.0\Projects\STM32F4-Discovery\Examples\BSP\SW4STM32

这里写图片描述

那么此时,编译代码即可,原来的错误已经没有了.

至于如何设置JLINK及ST-LINK作为调试,这个跟使用ARMCC一样设置.这里大家可以在网上找一些教程,这里就不再介绍了.

来自:http://blog.csdn.net/lan120576664

windows环境下arm gcc+Keil开发环境的搭建

操作系统:Window7 64bit Keil版本 V4.70 交叉工具链:arm-none-eabi-gcc v4.7.2     由于刚开始学习嵌入式时用的linux环境下的arm-linu...
  • vigour1000
  • vigour1000
  • 2014年03月23日 12:24
  • 1105

试图搞懂MDK程序下载到flash(二)--分散加载文件scatter

版权声明:本文为博主原创文章,未经博主允许不得转载。 分散加载文件概念      对于分散加载文件的概念,在《ARM体系结构与编程》书第11章有明确介绍。      分散加载...
  • niepangu
  • niepangu
  • 2015年11月21日 11:03
  • 779

使用Visual Studio + Visual Assist X + MDK(编译器) 构建STM32开发环境

自己有一块STM32103的开发小板,想学学STM32开发,在网上搜搜入门教程,却发现,这些教程真是太令人恶心了!他们要每一次新建一个项目都要Copy一个比整个源代码大出几千倍的Standard Pe...
  • weizehua
  • weizehua
  • 2013年10月12日 12:36
  • 14266

Windows环境下搭建基于Eclipse的STM32 GCC 开发环境(二)工程设置篇

工具安装完成后,接下来就可以
  • at91rm9200
  • at91rm9200
  • 2014年04月10日 09:56
  • 9858

.a文件和.lib文件的区别

最近开始学习使用dev-c++,在学习opengl的时候发现dev-c++使用的链接库的后缀名是.a,而不是.lib。在网上搜了搜发现.a就是dev-c++所使用的静态链接库文件。 dev-c++使用...
  • tudoumayi
  • tudoumayi
  • 2010年01月17日 12:46
  • 14864

Keil5.15使用GCC编译器链接.a库文件

我们知道,当使用第三方的代码时,人家有可能会扔个Lib文件给你.这时候,别人只要提供header文件给你,则你就可以通过Lib文件及header的函数声明,对Lib中的函数进行调用.在Keil中如果使...
  • lan120576664
  • lan120576664
  • 2015年07月10日 11:49
  • 4700

如何使用GNU编译器GCC来编译Cortex-M3?GCC + STM32

这里有个德国人做的样例,各位可以参考下: http://gandalf.arubi.uni-kl.de/avr_projects/arm_projects/index_cortex.html...
  • lanmanck
  • lanmanck
  • 2012年12月07日 15:04
  • 4368

stm32库函数在gcc下的开发环境配置完成

开始使用libopencm3来开发stm32很方便,但是当前该项目还在进行中,无法很顺心的使用,无奈在编译arm-none-eabi-gcc的时候没有编译官方库,只得下载stm32的官方库(V3.5)...
  • xiaocaoguangming
  • xiaocaoguangming
  • 2011年12月22日 12:01
  • 5385

ubuntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立

买了一个STM32开发板,却不想在window下开发,也不想用那么占内存的IAR MDK等软件,所以决定在ubuntu下建立该开发环境,像之前avr linux一样,找了下资料,国内有人做过,但都没有...
  • canyue102
  • canyue102
  • 2013年12月27日 19:49
  • 19370

Windows环境下搭建基于Eclipse的STM32 GCC 开发环境(一)工具篇

这段时间玩了一段STM32F207和STM32F407,以前一直用IAR环境,但STM32的库函数太多,码代码实在是费劲,要是有类似VC助手那样的提示功能就好了。上网搜索了一堆资料,貌似Eclipse...
  • at91rm9200
  • at91rm9200
  • 2014年04月03日 11:27
  • 21145
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Keil5.15使用GCC编译器编译STM32工程
举报原因:
原因补充:

(最多只允许输入30个字)