在Keil5中配置使⽤GCC编译器开发STM32
Keil⼀般使⽤ARMCC编译MCU⼯程代码。偶然听说Keil也是⽀持内嵌GCC编译器的。于是尝试了⽹上博客所述的⼀些⽅法,最终到了⼀篇博客
按照⽂中所述,发现仍存在⼀些其他错误,后来⼜查了其他相关资料,在这作以总结
Prefix:arm-none-eabi-
Folder:D:\keil_MDK\Keil_v5\ARM\GCC\ (注:这⾥是刚刚安装的GCC所在位置)
###四、配置⼯程设置
####1.配置CC编译规则
注意勾选⼀下选项,填写规则
Misc Controls : -mcpu=cortex-m3 -mthumb -fdata-sections -ffunction-sections
注:
1.这⾥我⽤的cortex-m3,如果你是m4内核就改成4)
2.-mthumb的意义是:使⽤这个编译选项⽣成的⽬标⽂件是Thumb的
3.-fdata-sections和-ffunction-sections和下⽂连接规则⼀起说
####2.配置Assembler编译规则gnu编译器
类似前⼀项
Misc Controls : -mcpu=cortex-m3 -mthumb
####3.配置Linker连接规则
这⾥要添加连接脚本,⼀般可以在官⽅提供的固件库包到类似的
Misc Controls : -Wl,–gc-sections
注:
1.注意这个gc前⾯是两个短⼩的“–”,由于博客的问题直接复制会出错
2.-wl, 表⽰后⾯的参数 --gc-sections 传递给链接器
3.-fdata-sections和-ffunction-sections和–gc-sections的说明如下
-ffunction-sections和-fdata-sections会使编译器为每个function和data item分配独⽴的section。 --gc-sections会使连接器删除没有被使⽤的section。
连接操作以section作为最⼩的处理单元,只要⼀个section中有某个符号被引⽤,该section就会被放⼊output中。这些选项⼀起使⽤会从最终的输出⽂件中删除所有未被使⽤的function和data, 只包含⽤到的unction和data。
####4.stm32f10x_flash_extsram.ld内容
/*
Default linker script for STM32F10x_1024K_1024K
Copyright RAISONANCE S.A.S. 2008
*/
/* include the common STM32F10x sub-script */
/* Common part of the linker scripts for STM32 devices*/
/* default stack sizes.
These are used by the startup in order to allocate stacks for the different modes.
*/
__Stack_Size = 1024 ;
PROVIDE ( _Stack_Size = __Stack_Size ) ;
__Stack_Init = _estack  - __Stack_Size ;
/*"PROVIDE" allows to easily override these values from an object file or the commmand line.*/
PROVIDE ( _Stack_Init = __Stack_Init ) ;
/*
There will be a link error if there is not this amount of RAM free at the end.
*/
_Minimum_Stack_Size = 0x100 ;
/* include the memory spaces definitions sub-script */
/*
Linker subscript for STM32F10x definitions with 1024K Flash and 1024K External SRAM */
/
* Memory Spaces Definitions */
MEMORY
{
RAM (xrw) : ORIGIN = 0x68000000, LENGTH = 1024K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
}
/
* higher address of the user mode stack */
_estack = 0x68100000;
/* include the sections management sub-script for FLASH mode */
/* Sections Definitions */
SECTIONS
{
/* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector))            /* Startup code */
. = ALIGN(4);
} >FLASH
/* for some STRx devices, the beginning of the startup code is stored in the .flashtext section, which goes to FLASH */    .flashtext :
{
. = ALIGN(4);
*(.flashtext)            /* Startup code */
. = ALIGN(4);
} >FLASH
/* the program code is stored in the .text section, which goes to Flash */
.text :
{
. = ALIGN(4);
*(.text)                  /* remaining code */
*(.text.*)                  /* remaining code */
*(.rodata)                /* read-only data (constants) */
*(.rodata*)
*(.glue_7)
*(.glue_7t)
*(.glue_7t)
. = ALIGN(4);
_etext = .;
/* This is used by the startup in order to initialize the .data secion */
_sidata = _etext;
} >FLASH
/* This is the initialized data section
The program executes knowing that the data is in the RAM
but the loader puts the initial values in the FLASH (inidata).
It is one task of the startup to copy the initial values from FLASH to RAM. */    .data  : AT ( _sidata )
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data secion */
_sdata = . ;
*(.data)
*(.data.*)
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data secion */
_edata = . ;
} >RAM
/* This is the uninitialized data section */
.bss :
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .bss secion */
_sbss = .;
*(.bss)
*(COMMON)
. = ALIGN(4);
/* This is used by the startup in order to initialize the .bss secion */
_ebss = . ;
} >RAM
PROVIDE ( end = _ebss );
PROVIDE ( _end = _ebss );
/* This is the user stack section
This is just to check that there is enough RAM left for the User mode stack    It should generate an error if it's full.
*/
._usrstack :
{
. = ALIGN(4);
_susrstack = . ;
. = . + _Minimum_Stack_Size ;
. = ALIGN(4);
_eusrstack = . ;
} >RAM
/* this is the FLASH Bank1 */

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。