一、下载GCC编译器

GCC编译器下载地址 

二、安装GCC

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

三、配置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) }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187

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

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

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

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

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

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

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一样设置.这里大家可以在网上找一些教程,这里就不再介绍了.
  • 1
  • 2
  • 3
  • 4

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

Keil5.15使用GCC编译器编译STM32工程相关推荐

  1. Keil5配置GCC编译器编译STM32工程

    Keil一般使用ARMCC编译MCU工程代码.偶然听说Keil也是支持内嵌GCC编译器的.于是尝试了网上博客所述的一些方法,最终找到了一篇博客 http://blog.csdn.net/lan1205 ...

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

    我们知道,当使用第三方的代码时,人家有可能会扔个Lib文件给你.这时候,别人仅仅要提供header文件给你,则你就能够通过Lib文件及header的函数声明,对Lib中的函数进行调用.在Keil中假设 ...

  3. 深度剖析“GCC编译器编译过程”

    (这张图是本人画的并非网络图,如果有编译过程没有提到的可以提出来) 首先说说第一步 一.预编译 1.配置编译器环境  编译器在编译之前要运行配置文件通常叫configure的配置文件,一般这个配置文件 ...

  4. Keil中配置GCC编译器开发STM32

    一.下载编译链: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolc ...

  5. linux gcc编译c文件头文件,使用GCC编译器编译C语言

    GCC编译C源代码有四个步骤:预处理-->编译-->汇编-->链接. 可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的过程. 下面将通过对一个程序的编译来演示 ...

  6. windows 使用GCC编译器编译c++程序 开始学习c++最好的环境配置

    1.安装编译器gcc >下载 MinGW Installer  https://osdn.net/projects/mingw/downloads/68260/mingw-get-setup.e ...

  7. gcc编译器 编译的4个步骤

    一.预处理 hello.c 经过预处理得到 hello.i gcc -E hello.c -o hello.i -E的含义:说明这是一个预处理操作 生成预处理文件(.i) -o的含义: 确定 输出文件 ...

  8. Windows环境下CubeMX+VScode+Gcc+OpenOCD开发STM32环境搭建

    为啥要这么麻烦嘛,这个不解释,生命在于折腾,相信很多人都在折腾,也很多人去百度过,按百度的教程估计还是有很多人不会弄,所以写这篇教程为那些还没有折腾成功的砖工提供点线索. VScode现在真的很强大, ...

  9. 在 Windows 下用 GCC 编译器练习 C/C++ 的简单教程

    2018年8月更新: 这个暑假博主和小伙伴.老师一同为师弟师妹们折腾了一个关于计算机学习交流的小社区 0xFFFF ,经过一个暑假的积淀,留下了不少适合计算机入门阅读的内容,推荐给看到这篇文章的你. ...

最新文章

  1. 关于人工智能的解读,看这一篇就够了
  2. 腾讯产品课观后感之定位2018-08-22
  3. IOS静态库生成及测试
  4. linux 远程图形终端,图形终端远程操作Linux
  5. mysql服务的启动和停止 net stop mysql net start mysql
  6. 求数组里面的最大值和最小值
  7. java获取xlsx某列数据_Java读取Excel指定列的数据详细教程和注意事项
  8. np.random.choice用法
  9. IBM heapAnalyzer
  10. python 切片函数,python切片详解
  11. Thymeleaf 的使用
  12. 在工作中常用到的SQL
  13. html实现在线展示pdf文件,在html页面中展示pdf文件,实现在线阅读
  14. 注册表修改服务器连接数量,如何通过Win10注册表更改时间服务器参数值?
  15. Veritas Backup Exec 21设置备份任务
  16. amoeba mysql下载_amoeba for mysql
  17. python怎样查找收盘价_如何在Python中从晨星获得调整后的收盘价?
  18. PDF文件格式转换攻略:PDF格式转换图片格式
  19. FRW辐轮王全球十大顶级运动户外品牌第一自行车受邀中国进博会
  20. 树莓派3B和攀藤PMS5003ST

热门文章

  1. Android 实现uc浏览器一样的菜单
  2. 属蛇的2020年运势_第一运程 属蛇人2020年每月运势
  3. ABP框架源码中的Linq扩展方法
  4. 模型推理时显存不足问题
  5. 6款红黄黑榜摄像头评测:谁最安全?谁画质好?从此让你不再踩雷
  6. Qt windows下获取CPU、主板、硬盘、网卡等相关信息
  7. “文心CV大模型” - VIMER-UFO论文报告
  8. php 图片大小更改,word图片怎么统一调整大小
  9. 计算机视觉注意力网络(三)——CBAM [ECCV 2018]
  10. 文件资源管理器Ranger的使用