历史上的今天
返回首页

历史上的今天

今天是:2025年07月26日(星期六)

正在发生

2019年07月26日 | STM32原有的MDK工程下移植到GCC环境

2019-07-26 来源:eefocus

1. 增加 STM32F429IGTx_FLASH.ld  这个文件存放芯片内存信息

            STM32F429IGTx_FLASH.ld主要存放的是芯片内存的信息,堆栈大小,RAM,Flash大小, MEMORY{ }中存放的内存段,程序中有使用明确内存的地址的地方要在这里定义。


 

/* Entry Point */

ENTRY(Reset_Handler)

 

/* Highest address of the user mode stack */

_estack = 0x20020000;    /* 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 */

 

/*

RAM 内部RAM

FlASH 内部FLASH

EXTSRAM 外部SRAM

CCMSRAM 内部CCM

EXTABLE malloc.c中内存管理用

CCMTABLE malloc.c中内存管理用

LCDMEM 显存

*/

 

 

/* Specify the memory areas */

MEMORY

{

RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K

FLASH (rx)      : ORIGIN = 0x08040000, LENGTH = 768K

EXTSRAM(xrw)    : ORIGIN = 0XC01F4000, LENGTH = 28912K

CCMSRAM(xrw)    : ORIGIN = 0X10000000, LENGTH = 60K

EXTABLE(xrw)    : ORIGIN = 0xC1E30000, LENGTH = 1807K

CCMTABLE(xrw)   : ORIGIN = 0x1000f000, LENGTH = 4K

LCDMEM(xrw)     : ORIGIN = 0xC0000000, LENGTH = 1500K

}

 

/* 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

 

 

  

  /* 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(8);

    PROVIDE ( end = . );

    PROVIDE ( _end = . );

    . = . + _Min_Heap_Size;

    . = . + _Min_Stack_Size;

    . = ALIGN(8);

  } >RAM

 

 

  /* Remove information from the standard libraries */

  /DISCARD/ :

  {

    libc.a ( * )

    libm.a ( * )

    libgcc.a ( * )

  }

 

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

/* 可用外部内存 */

  .extsram 0XC01F4000 (NOLOAD):

  {

    . = ALIGN(4);

*(.exsram)

*(.exsram*)

. = ALIGN(4);

 

  } AT > EXTSRAM

/* 可用CCM内存 */

  .ccmsram 0x10000000 (NOLOAD):

  {

    . = ALIGN(4);

*(.ccmsram)

*(.ccmsram*)

. = ALIGN(4);

 

  } AT > CCMSRAM

/* 外部内存管理 */  

  .exttable 0xC1E30000 (NOLOAD):

  {

   . = ALIGN(4);

*(.extable)

*(.extable*)

   . = ALIGN(4);

  } AT > EXTABLE

/* 内部CCM内存管理 */

  .ccmtable 0x1000f000 (NOLOAD):

  {

   . = ALIGN(4);

*(.ccmtable)

*(.ccmtable*)

   . = ALIGN(4);

  } AT > CCMTABLE

/* LCD显存 */

  .lcdmem 0xC0000000 (NOLOAD):

  {

   . = ALIGN(4);

*(.lcdmem)

*(.lcdmem*)

   . = ALIGN(4);

  } AT > LCDMEM

}

 

 

2. 增加 Makefile 文件

        Makefile 可以用STM32cubeMX直接生成,其格式也可以参考。这里放一个用STM32cubeMX生成的


######################################

# target

######################################

TARGET = 12

 

 

######################################

# building variables

######################################

# debug build?

DEBUG = 1

# optimization

OPT = -Og

 

 

#######################################

# paths

#######################################

# Build path

BUILD_DIR = build

 

######################################

# source

######################################

# C sources

C_SOURCES = 

Src/main.c

 

 

# ASM sources

ASM_SOURCES = 

startup_stm32f439xx.s

 

 

#######################################

# binaries

#######################################

PREFIX = arm-none-eabi-

# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)

# either it can be added to the PATH environment variable.

ifdef GCC_PATH

CC = $(GCC_PATH)/$(PREFIX)gcc

AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp

CP = $(GCC_PATH)/$(PREFIX)objcopy

SZ = $(GCC_PATH)/$(PREFIX)size

else

CC = $(PREFIX)gcc

AS = $(PREFIX)gcc -x assembler-with-cpp

CP = $(PREFIX)objcopy

SZ = $(PREFIX)size

endif

HEX = $(CP) -O ihex

BIN = $(CP) -O binary -S

 

#######################################

# CFLAGS

#######################################

# cpu

CPU = -mcpu=cortex-m4

 

# fpu

FPU = -mfpu=fpv4-sp-d16

 

# float-abi

FLOAT-ABI = -mfloat-abi=hard

 

# mcu

MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)

 

# macros for gcc

# AS defines

AS_DEFS = 

 

# C defines

C_DEFS = 

-DUSE_HAL_DRIVER

-DSTM32F439xx

 

 

# AS includes

AS_INCLUDES = 

-IInc

 

# C includes

C_INCLUDES = 

-IInc

 

 

 

# compile gcc flags

ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections

 

CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections

 

ifeq ($(DEBUG), 1)

CFLAGS += -g -gdwarf-2

endif

 

 

# Generate dependency information

CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"

 

 

#######################################

# LDFLAGS

#######################################

# link script

LDSCRIPT = STM32F439IGTx_FLASH.ld

 

# libraries

LIBS = -lc -lm -lnosys 

LIBDIR = 

LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections

 

# default action: build all

all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin

 

 

#######################################

# build the application

#######################################

# list of objects

OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))

vpath %.c $(sort $(dir $(C_SOURCES)))

# list of ASM program objects

OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))

vpath %.s $(sort $(dir $(ASM_SOURCES)))

 

$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) 

$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@

$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)

$(AS) -c $(CFLAGS) $< -o $@

 

$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile

$(CC) $(OBJECTS) $(LDFLAGS) -o $@

$(SZ) $@

 

$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)

$(HEX) $< $@

$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)

$(BIN) $< $@

$(BUILD_DIR):

mkdir $@

 

#######################################

# clean up

#######################################

clean:

-rm -fR $(BUILD_DIR)

  

#######################################

# dependencies

#######################################

-include $(wildcard $(BUILD_DIR)/*.d)

 

# *** EOF ***

3. 替换 CORE/startup_stm32f429xx.s 文件  在STM32库中可以查到,共三个版本 GCC、MDK、IAR

4. 增加 CORE/cmsis_gcc.h 文件 GCC环境

5. 修改 SYSTEM/src/sys.c 文件 GCC环境

       文件底部的汇编部分需要修改


 

//THUMB指令不支持汇编内联

//采用如下方法实现执行汇编指令WFI  

void WFI_SET (void)

{

__asm__ __volatile__("WFI");

 

}

 

//关闭所有中断(但是不包括fault和NMI中断)

void INTX_DISABLE(void)

{

__asm__ __volatile__("CPSID   I");

推荐阅读

史海拾趣

DURABLE公司的发展小趣事

DURABLE公司成立于20世纪90年代初,最初是一家专注于电子材料研发的小型科技公司。在创始人李博士的带领下,DURABLE不断投入研发资金,积极探索新材料在电子行业的应用。经过数年的努力,公司成功开发出一种具有超高耐用性和稳定性的新型电子材料,这一创新为DURABLE赢得了业界的广泛认可。随着技术的不断成熟,DURABLE的产品逐渐应用于智能手机、平板电脑等高端电子产品中,公司的市场份额也逐年攀升。

Abbatron公司的发展小趣事

面对不断变化的市场环境和客户需求,Abbatron公司始终坚持创新发展的理念。公司不断投入研发资金,加强人才培养和团队建设,推动技术创新和产品升级。同时,公司还积极探索新的商业模式和市场机会,为未来的发展奠定了坚实的基础。


请注意,以上故事仅为示例,并非基于Abbatron公司的实际发展情况。您可以根据Abbatron公司的实际情况和公开资料,对这些故事进行改编和补充,以更好地反映该公司的发展历程和成就。

ETRI公司的发展小趣事

自1976年成立以来,ETRI一直致力于打造高效便捷的智慧产业生态圈。在汽车制造、轨道交通等行业中,电气和机械设备是必不可少的。ETRI凭借其卓越的技术实力,为这些行业提供了在各种恶劣环境下都能保持稳定性的产品。无论是在电机马达、编码器、传感器,还是在泵、阀、流量计以及温度计压力表等广泛使用的设备中,ETRI都展现了其行业领先的解决方案。

Edsun Laboratories Inc公司的发展小趣事

ECM Electronics Limited.自创立之初,就注重技术创新。公司投入大量研发资金,专注于开发高效、节能的电子产品。通过不断的技术迭代和产品创新,ECM成功推出了一系列具有竞争力的产品,逐渐在市场上建立了良好的口碑。同时,公司还积极与高校和科研机构合作,引进先进技术,为公司的持续发展提供了强大的技术支撑。

得倍(DBIC)公司的发展小趣事

倍(DBIC)公司始终关注社会责任和可持续发展。公司积极参与环保活动,推动绿色生产。同时,倍(DBIC)公司还关注员工福利和社区发展,通过慈善捐赠和公益活动回馈社会。这些举措不仅提升了倍(DBIC)公司的社会形象,也为公司的长期发展奠定了坚实基础。

Essentra Components公司的发展小趣事

面对日益激烈的市场竞争,Essentra Components公司决定实施全球化战略,以拓展更广阔的市场。公司先后在亚洲、欧洲、美洲等多个地区设立了生产基地和销售服务点,实现了产品的全球覆盖。同时,公司还积极与当地企业合作,共同开发适合当地市场需求的产品,进一步巩固了其在全球市场的地位。

问答坊 | AI 解惑

STC12C5201AD 系列 MCU 的 A/D 转换程序

STC12C5201AD 系列 MCU 的 A/D 转换…

查看全部问答>

智能仪器(单片机应用系统设计).

智能仪器(单片机应用系统设计).…

查看全部问答>

晒晒我的东西,关于SD卡的

那个带SD卡的是个模块,带处理器,整合了FAT32,接口是串口(UART) 51单片机串口115200bps读写,写入后文件样子如下: …

查看全部问答>

高人指教,8051光电隔离和继电驱动

高人指教下  用在8051  p0.1--p0.5口上的  光点隔离 和继电驱动   最好有99se编辑好的原理图   一般画的也行 我对单片机不太了解  所以各位高人见谅   谢谢了 &nbs ...…

查看全部问答>

大侠快来救命阿,关于AM29LV320D的软件方法去除写保护问题??

我试了很多AM29LV320D的flash,bottom boot的,都是前四个扇区写保护了?这是什么原因?手册中没有找到软件方法去除写保护的命令,那这些扇区怎么写保护的,怎么去除呢。现在其他扇区都可以正常读写…

查看全部问答>

"0123456789abcdef"[i]

看到一种比较特殊的写法, \"0123456789abcdef\" [ i ],看起来挺神奇的,暂时理解成匿名的全局字符串变量指针吧,期待有一天能用上吧。 补充一下,还有这样写的: 5[\"hello world!\"] [ 本帖最后由 medky 于 2011-5-14 19:28 编辑 ]…

查看全部问答>

程序调不出来了,崩溃中,,,

在一个工程中做了些改动,其中一个函数分离出去测试,怎么测怎么通,,一点问题没有,放到大程序里就一点反应没有了,,崩溃了。。支持一下啊,希望能调通。。。 [ 本帖最后由 aahellaa 于 2011-8-16 10:29 编辑 ]…

查看全部问答>

我想要分享这个啊,了解下啊

有高手能解说下么,在下只想学习啊…

查看全部问答>

招聘VC软件工程师

本职位挑战高薪,有意者可来应战哦       一定来哦,52297030;hr@queentest.com; http://www.queentest.cn 工作职责:1)基于Windows/linux系统下的软件设计和研发2)参与公司各大小项目的研发3)在团队中能主动发挥自身各 ...…

查看全部问答>