用arm-none-eabi-gcc编译STM32F10x

对于ubuntu 14.04(我的是14.10),官方仓库里就有适用的交叉编译器

apt-get install gcc-arm-none-eabi

对于较低的版本,可以使用https://launchpad.net/gcc-arm-embedded/提供的二进制压缩包,

以及https://launchpad.net/~terry.guo/+archive/ubuntu/gcc-arm-embedded提供的软件源

add-apt-repository ppa:terry.guo/gcc-arm-embeddedapt-get updateapt-get install gcc-arm-none-eabi

以下是项目的makefile,CMSIS中核心支持使用2.00版本,硬件支持使用3.5版本,外设驱动为3.5版

makefile使用find找到所有.c和.s文件,根据自动依赖进行编译。编译出来的文件,根据stm32_f103ze_gcc.ld生成.bin和.hex文件

TARGET=stm32
########################################################################
export CC             = arm-none-eabi-gcc
export AS             = arm-none-eabi-as
export LD             = arm-none-eabi-ld
export OBJCOPY            = arm-none-eabi-objcopy

TOP=$(shell pwd)
INC_FLAGS=    -I $(TOP)/lib/CMSIS_200/CM3/CoreSupport/                     -I $(TOP)/lib/CMSIS_200/CM3/DeviceSupport/ST/STM32F10x             -I $(TOP)/lib/STM32F10x_StdPeriph_Driver/inc                -I $(TOP)/src

export CFLAGS= -W -Wall -g -mcpu=cortex-m3 -mthumb -D STM32F10X_HD -D USE_STDPERIPH_DRIVER $(INC_FLAGS)
ASFLAGS= -W -Wall -g -Wall -mcpu=cortex-m3 -mthumb
########################################################################
C_SRC=$(shell find ./ -name ‘*.c‘)
C_OBJ=$(C_SRC:%.c=%.o)
C_DEP=$(C_SRC:%.c=%.cdep)

ASM_SRC=$(shell find ./ -name ‘*.s‘)
ASM_OBJ=$(ASM_SRC:%.s=%.o)
ASM_DEP=$(ASM_SRC:%.s=%.adep)

########################################################################
.PHONY: all clean
all:$(C_DEP) $(ASM_DEP) $(C_OBJ) $(ASM_OBJ)
    $(LD) $(C_OBJ) $(ASM_OBJ) -T stm32_f103ze_gcc.ld -o $(TARGET).elf 

    $(OBJCOPY) $(TARGET).elf  $(TARGET).bin -Obinary
    $(OBJCOPY) $(TARGET).elf  $(TARGET).hex -Oihex
###################################
%.cdep:%.c
    $(CC) -MM $< > [email protected] $(CFLAGS)
sinclude $(C_DEP)
$(C_OBJ):%.o:%.c
    $(CC) -c $< -o [email protected] $(CFLAGS)
####################################
%.adep:%.s
    $(CC) -MM $< > [email protected] $(ASFLAGS)
sinclude $(ASM_DEP)
$(ASM_OBJ):%.o:%.s
    $(AS) -c [email protected] -o [email protected] $(ASFLAGS)
####################################
clean:
    @for i in $(shell find ./ -name ‘*.o‘);do if [ -e $${i} ];then rm $${i};fi;done
    @for i in $(shell find ./ -name ‘*.cdep‘);do if [ -e $${i} ];then rm $${i};fi;done
    @for i in $(shell find ./ -name ‘*.adep‘);do if [ -e $${i} ];then rm $${i};fi;done
stm32_f103ze_gcc.ld的内容
_estack = 0x20000400;

MEMORY
{
    FLASH_ON_CHIP   (rx)    : ORIGIN = 0x08000000, LENGTH = 512K
    SRAM_ON_CHIP    (rwx)   : ORIGIN = 0x20000000, LENGTH = 64K
}

SECTIONS
{
    .text : {
        KEEP(*(.isr_vector))
        *(.text*)
        *(.rodata*)
        _etext = .;
    } > FLASH_ON_CHIP

    _sidata = .;

/*    .data : AT(ADDR(.text) + SIZEOF(.text)) {*/
    .data : AT(_sidata) {
        _sdata = .;
        *(vtable)
        *(.data*)
        _edata = .;
    } > SRAM_ON_CHIP

    .bss : {
        _sbss = .;
        *(.bss*)
        *(COMMON)
        _ebss = .;
    } > SRAM_ON_CHIP
}
时间: 2024-10-10 17:04:18

用arm-none-eabi-gcc编译STM32F10x的相关文章

GCC编译uboot出现(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0&#39;错误的解决办法

/opt/arm-2010.09/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/armv4t/libgcc.a(_bswapsi2.o):(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0' make: *** [u-boot] Error 1 一旦编译uboot出现上述错误,请不要慌张!解决办法官网已经给出,主要解决办法如下: vim 打开./lib_arm/eabi_com

GCC编译命令常用选项

GCC是GUN Compiler Collection的简称,除编译程序外,还包含其他相关工具.GCC可将高级语言编写的源代码构建成计算机直接执行的二进制代码.GCC是Linux平台下最常用的编译程序,也是Linux平台编译器的事实标准.GCC支持四十余种不同目标体系结构(如X86系列.ARM及PowerPC等),可运行在不同的操作系统上(如Linux.Solaris及Windows等).GCC既支持基于宿主的开发(即在A平台上编译该平台使用的程序),也支持交叉编译(即在A平台上编译供B平台使用

linux下使用gcc编译运行C程序

gcc(GNU Compiler Collection)是Linux下最常用的C语言编译器,是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.  在linux系统中,常见的使用方法有两种,如下: gcc -o out in1 in2 //gcc编译以及链接(对in1文件和in2文件进行编译生成out.bin文件,"-o":表示生成可执行文件) gcc -c out in1 in2 // gcc编译不链接(对in1文件和in2文件文件进

gcc 编译控制选项

gcc 编译控制选项前面已经讲过, gcc 的基本用法是:$ gcc [选项] [文件名]gcc 有很多编译控制选项,使得 gcc 可以根据不同的参数进行不同的编译处理,可供 gcc调用的参数大约有 100 来个,但实际使用中并不会用到这么的多选项和参数.这里只介绍一些最基本和常用的控制选项以及参数,如表 10.3 所列.表 10.3 gcc 常用选项和参数 名称 功能描述 -c 只编译不链接.编译器只是将输入的.c 等源代码文件生成.o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件

GCC 编译详解 (转)

朋友用C调用lua的库,但是不能直接调用源码,必须要编译成静态链接库才可以使用,问学长说是因为要分开编译链接.这就不理解了,于是转一篇讲编译的文章学习一下,补补课… GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Java.Fortran.Pascal.Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种

[原]高版本gcc编译哟优化可能导致问题

系统:ubuntu14.04 编译器:gcc4.8.2 问题描述:工作需要,使用libnids,所以就下了最新版本的1.24,编译安装后,发现tcp报文重组工作无法完成,具体表现为虽然通过nids_register_tcp函数注册了回调函数,但函数一直不能被执行,通过对libnids执行流程的跟踪,发现在计算checksum的时候出了问题,checksum的值一直不为零,导致libnids认为数据报损坏. 不明所以,但通过思考,觉得问题应该处在编译器上,是不是64位和32为的问题呢?源码中并没有

万年历算法的实现(C语言--gcc编译)

/** cal.c * * 现行的格里历是从儒略历演化而来的.儒略历每4年一个润年,润年366天,平年365天.* 如果从公元1年算的话,那么凡是能够被4整除的都是润年.从天文角度看,儒略历这种 * 历法是有误差的,到16世纪误差已经达到了10天.1582年,罗马教皇对儒略历进行了 * 一次校定,该年的10-5到10-14这10天被抹掉,并规定凡不能被400整除的世纪年不再 * 算为润年,校定之后的儒略历即为现行的格里历. * * 但是英国直到1752年才开始使用格里历,此时时间误差已经达到了1

使用gcc编译gdb调试

gcc 在linux系统中,默认是没有安装gcc编译器的,可以通过命令 rpm -q | grep gcc 来查看.安装命令为: yum -y install gcc 安装后,编写一个.c结尾的文件. gcc test.c 就会默认输出一个a.out的输出文件,这个输出文件就是可执行文件. 如果加上-o选项,则可以自定目标文件. gcc -o test test.c test就是它的可执行文件. 一般都默认加上-Wall 选项,可以自动提示一些出错警告的信息. gcc -Wall -o test

linux 下gcc 编译结构体问题

最近在linux 学习c语言的编程,发现好多原来在vs 上的在linux 都编译不过去,今天就遇到了一个问题就是结构体的编译的问题, 结构体大概的定义是 struct Node{ int a; int b; }; 在利用gcc 编译的时候就显示 错误:‘Node’未声明(在此函数内第一次使用), 这就让我感觉很奇怪,原来这都是可以的 后来查了资料改成这个样子就可以了 typedef struct Node{ int a; int b; }Node; 这样就编译成功了.

gcc编译c语言

摘自<Linux程序设计>第四版,人民邮电出版社 c语言程序的编译与调试<<使用gcc编译,gdb调试>> 程序编译过程:词法分析-->语法分析-->中间代码生成-->代码优化-->目标代码生成gcc编译器:预处理(preprocessing)-->编译(compilation)-->汇编(assembly)-->连接(link) 文件后缀名说明:.c:c语言代码.a:由目标文件构成的库文件.C,.cc,.cpp:C++代码.h