本帖最后由 Gemini 于 2017-1-3 15:10 编辑  
 
买了一个STM32开发板,却不想在window下开发,也不想用那么占内存的IAR MDK等软件,所以决定在ubuntu下建立该开发环境,像之前avr linux一样,找了下资料,国内有人做过,但都没有很详尽的教程,所以花了三四天才完成.其实原理很简单,就是安装适用与STM32的GCC,以及建立该工程,主要是Makefile加上STM32的官方库. 个人原创,转载请注明原文出处: 参考:  
 环境:  ubuntu 13.10 stm32f103zet6 
  一  STM 32 GCC 安装 stm32 属于arm cortex-m系列thumb指令集,所以给arm用的arm-none-eabi就可以了,首先是下载 下载地址: https://launchpad.net/gcc-arm-embedded/+download 下载其中的gcc-arm-none-eabi-version-linux.tar.bz2 解压到你知道的目录会产生 gcc-arm-none-eabi的文件夹 把该编译器添加到你的环境中: - <font face="微软雅黑" size="3">sudo gedit  ~/.bashrc</font>
 
  复制代码在最后一行添加: - <font face="微软雅黑" size="3">1
 
 - export PATH=$PATH:/your_stm_gcc_dir/gcc-arm-none-eabi-4_8-2013q4/bin
 
 - </font>
 
  复制代码 
因为我之前有添加过树莓派的编译器了,所以实际上是这样的: - <font face="微软雅黑" size="3">export PATH=$PATH:/your_pi_gcc_dir/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/:/your_stm_gcc_dir/gcc-arm-none-eabi-4_8-2013q4/bin
 
 - </font>
 
  复制代码 
两个编译器环境中间用冒号隔开; 注销后测试: - <font face="微软雅黑" size="3">arm-none-eabi-gcc -v</font>
 
  复制代码 
可以查看到该编译器的版本,就表示可以了. 二  工程环境的建立 新建个工程文件夹,及其目录 - <font face="微软雅黑" size="3">mkdir stm_project
 
 - cd stm_project
 
 - mkdir libs
 
 - mkdir src
 
 - mkdir inc</font>
 
  复制代码 
下载,安装官方库: stm32的寄存器不像51 avr等单片机,那么少,自己写写库,背背寄存器就可以了,所以ST公司提供了他们官方的库,为了避免重复造轮子,就直接采用他们的库,库版本为STM32_USB-FS-Device_Lib_V4.0.0,这个库多了usb支持,下载的话到st官网搜索stm32f10x就有了.  
 下载链接:  
 解压,把解压好的文件夹复制到刚才新建的libs里面. 在工程根目录下新建Makefile.common文件,这个为通用makefile - <font face="微软雅黑" size="3"># include Makefile
 
 -  
 
 - #This file is included in the general Makefile, the libs Makefile and the src Makefile
 
 - #Different optimize settings for library and source files can be realized by using arguments
 
 - #Compiler optimize settings:
 
 - # -O0 no optimize, reduce compilation time and make debugging produce the expected results (default).
 
 - # -O1 optimize, reduce code size and execution time, without much increase of compilation time.
 
 - # -O2 optimize, reduce code execution time compared to ‘O1’, increase of compilation time.
 
 - # -O3 optimize, turns on all optimizations, further increase of compilation time.
 
 - # -Os optimize for size, enables all ‘-O2’ optimizations that do not typically increase code size and other code size optimizations.
 
 - #Recommended optimize settings for release version: -O3
 
 - #Recommended optimize settings for debug version: -O0
 
 - #Valid parameters :
 
 - # OptLIB=0 --> optimize library files using the -O0 setting
 
 - # OptLIB=1 --> optimize library files using the -O1 setting
 
 - # OptLIB=2 --> optimize library files using the -O2 setting
 
 - # OptLIB=3 --> optimize library files using the -O3 setting
 
 - # OptLIB=s --> optimize library files using the -Os setting
 
 - # OptSRC=0 --> optimize source files using the -O0 setting
 
 - # OptSRC=1 --> optimize source files using the -O1 setting
 
 - # OptSRC=2 --> optimize source files using the -O2 setting
 
 - # OptSRC=3 --> optimize source files using the -O3 setting
 
 - # OptSRC=s --> optimize source files using the -Os setting
 
 - # all --> build all
 
 - # libs --> build libs only
 
 - # src --> build src only
 
 - # clean --> clean project
 
 - # tshow --> show optimize settings
 
 - #Example:
 
 - # make OptLIB=3 OptSRC=0 all tshow
 
 -  
 
 - TOP=$(shell readlink -f "$(dir $(lastword $(MAKEFILE_LIST)))")
 
 - PROGRAM=main
 
 - LIBDIR=$(TOP)/libs
 
 -  
 
 - #Adust the following line to the library in use
 
 - #=========add by embbnux 根据你的库不同,调整这个地方的库目录地址====================#
 
 -  STMLIB=$(LIBDIR)/STM32_USB-FS-Device_Lib_V4.0.0/Libraries
 
 - #=========add by embbnux 根据你的stm32芯片型号容量不同,修改这个地方的TypeOfMCU=======#
 
 - #Adjust TypeOfMCU in use, see CMSIS file "stm32f10x.h"#STM32F103RBT (128KB FLASH, 20KB RAM) --> STM32F10X_MD#TypeOfMCU=STM32F10X_MD#STM32F103RET (512KB FLASH, 64KB RAM) --> STM32F10X_HD#STM32F103ZET (512KB FLASH, 64KB RAM) --> STM32F10X_HD
 
 - #============================================================================#
 
 - TypeOfMCU=STM32F10X_HD
 
 - #============================================================================#
 
 - TC=arm-none-eabi
 
 - CC=$(TC)-gcc
 
 - LD=$(TC)-ld -v
 
 - OBJCOPY=$(TC)-objcopy
 
 - AR=$(TC)-ar
 
 - GDB=$(TC)-gdb
 
 - INCLUDE=-I$(TOP)/inc
 
 - INCLUDE+=-I$(STMLIB)/CMSIS/Include
 
 - INCLUDE+=-I$(STMLIB)/CMSIS/Device/ST/STM32F10x/Include
 
 - INCLUDE+=-I$(STMLIB)/CMSIS/Device/ST/STM32F10x/Source/Templates
 
 - INCLUDE+=-I$(STMLIB)/STM32F10x_StdPeriph_Driver/inc
 
 - INCLUDE+=-I$(STMLIB)/STM32_USB-FS-Device_Driver/inc
 
 - COMMONFLAGS=-g -mcpu=cortex-m3 -mthumb
 
 - COMMONFLAGSlib=$(COMMONFLAGS)
 
 - #Commands for general Makefile and src Makefile
 
 - ifeq ($(OptSRC),0)
 
 -   COMMONFLAGS+=-O0
 
 -   InfoTextSrc=src (no optimize, -O0)
 
 - else ifeq ($(OptSRC),1)
 
 -   COMMONFLAGS+=-O1
 
 -   InfoTextSrc=src (optimize time+ size+, -O1)
 
 - else ifeq ($(OptSRC),2)
 
 -   COMMONFLAGS+=-O2
 
 -   InfoTextSrc=src (optimize time++ size+, -O2)
 
 - else ifeq ($(OptSRC),s)
 
 -     COMMONFLAGS+=-Os
 
 -    InfoTextSrc=src (optimize size++, -Os)
 
 - else
 
 -   COMMONFLAGS+=-O3
 
 -   InfoTextSrc=src (full optimize, -O3)
 
 - endif
 
 - CFLAGS+=$(COMMONFLAGS) -Wall -Werror $(INCLUDE)
 
 - CFLAGS+=-D $(TypeOfMCU)
 
 - CFLAGS+=-D VECT_TAB_FLASH
 
 -  
 
 - #Commands for libs Makefile
 
 - ifeq ($(OptLIB),0)
 
 -   COMMONFLAGSlib+=-O0
 
 -   InfoTextLib=libs (no optimize, -O0)
 
 - else ifeq ($(OptLIB),1)
 
 -   COMMONFLAGSlib+=-O1
 
 -   InfoTextLib=libs (optimize time+ size+, -O1)
 
 - else ifeq ($(OptLIB),2)
 
 -   COMMONFLAGSlib+=-O2
 
 -   InfoTextLib=libs (optimize time++ size+, -O2)
 
 - else ifeq ($(OptLIB),s)
 
 -   COMMONFLAGSlib+=-Os
 
 -   InfoTextLib=libs (optimize size++, -Os)
 
 - else
 
 -   COMMONFLAGSlib+=-O3
 
 -   InfoTextLib=libs (full optimize, -O3)
 
 - endif
 
 - CFLAGSlib+=$(COMMONFLAGSlib) -Wall -Werror $(INCLUDE)
 
 - CFLAGSlib+=-D $(TypeOfMCU)
 
 - CFLAGSlib+=-D VECT_TAB_FLASH</font>
 
  复制代码编译该库: - <font face="微软雅黑" size="3">make clean
 
 - make</font>
 
  复制代码 
就会在lib目录下生成libstm32.a,这个就是编译好的静态库了.  
   建立工程编译ld文件 这个ld文件,为在编译时告诉编译器把代码放到什么地址,根据芯片的内存以及flash容量不同有所调整 在工程根目录下新建linker.ld文件 代码较长,请到我的资源里面下载,或者查看参考pdf里面的:  
 这里说明需要修改的地方,根据芯片型号不同,选择相应的RAM FLASH大小 - <font face="微软雅黑" size="3">MEMORY {
 
 -  /*Adust LENGTH to RAMsize of target MCU:*/
 
 -  /*STM32F103RBT --> 20K*/
 
 -  /*RAM (RWX) : ORIGIN = 0x20000000 , LENGTH = 20K*/
 
 -  /*STM32F103RET --> 64K*/
 
 -  /*STM32F103ZET --> 64K*/
 
 -  RAM (RWX) : ORIGIN = 0x20000000 , LENGTH = 64K
 
 -  EXTSRAM (RWX) : ORIGIN = 0x68000000 , LENGTH = 0
 
 -  /*Adust LENGTH to (FLASHsize - FeePROMsize) of target MCU:*/
 
 -  /*STM32F103RBT --> 126K*/
 
 -  FLASH (RX) : ORIGIN = 0x08000000 , LENGTH = 126K
 
 -  /*STM32F103RET --> 508K*/
 
 -  /*FLASH (RX) : ORIGIN = 0x08000000 , LENGTH = 508K*/
 
 -  /*STM32F103ZET --> 508K*/
 
 -  FLASH (RX) : ORIGIN = 0x08000000 , LENGTH = 508K
 
 -  /*Adust ORIGIN to (0x08000000 + (FLASHsize-FeePROMsize)) of target MCU*/
 
 -  /*and adust LENGTH to FeePROMsize allocated:*/
 
 -  /*STM32F103RBT --> 0x08000000+126K, 2K*/
 
 -  EEMUL (RWX) : ORIGIN = 0x08000000+126K, LENGTH = 2K
 
 -  /*STM32F103RET --> 0x08000000+508K, 4K*/
 
 -  /*EEMUL (RWX) : ORIGIN = 0x08000000+508K, LENGTH = 4K*/
 
 - }</font>
 
  复制代码在工程根目录下新建Makefile文件: - <font face="微软雅黑" size="3"># general Makefile
 
 -  
 
 - include Makefile.common
 
 - LDFLAGS=$(COMMONFLAGS) -fno-exceptions -ffunction-sections -fdata-sections -L$(LIBDIR) -nostartfiles -Wl,--gc-sections,-Tlinker.ld
 
 -  
 
 - LDLIBS+=-lm
 
 - LDLIBS+=-lstm32
 
 -  
 
 - STARTUP=startup.c
 
 -  
 
 - all: libs src
 
 -  $(CC) -o $(PROGRAM).elf $(LDFLAGS) \
 
 -  -Wl,--whole-archive \
 
 -  src/app.a \
 
 -  -Wl,--no-whole-archive \
 
 -  $(LDLIBS)
 
 -  $(OBJCOPY) -O ihex $(PROGRAM).elf $(PROGRAM).hex
 
 -  $(OBJCOPY) -O binary $(PROGRAM).elf $(PROGRAM).bin
 
 - #Extract info contained in ELF to readable text-files:
 
 -  arm-none-eabi-readelf -a $(PROGRAM).elf > $(PROGRAM).info_elf
 
 -  arm-none-eabi-size -d -B -t $(PROGRAM).elf > $(PROGRAM).info_size
 
 -  arm-none-eabi-objdump -S $(PROGRAM).elf > $(PROGRAM).info_code
 
 -  arm-none-eabi-nm -t d -S --size-sort -s $(PROGRAM).elf > $(PROGRAM).info_symbol
 
 -  
 
 - .PHONY: libs src clean tshow
 
 -  
 
 - libs:
 
 -  $(MAKE) -C libs $@
 
 - src:
 
 -  $(MAKE) -C src $@
 
 - clean:
 
 -  $(MAKE) -C src $@
 
 -  $(MAKE) -C libs $@
 
 -  rm -f $(PROGRAM).elf $(PROGRAM).hex $(PROGRAM).bin $(PROGRAM).info_elf $(PROGRAM).info_size
 
 -  rm -f $(PROGRAM).info_code
 
 -  rm -f $(PROGRAM).info_symbol
 
 - tshow:
 
 -  @echo "######################################################################################################"
 
 -  @echo "################# optimize settings: $(InfoTextLib), $(InfoTextSrc)"
 
 -  @echo "######################################################################################################"
 
 - </font>
 
  复制代码差不多就好了,在src里面添加测试源码 主要是startup.c 以及main.c,这里就不在说明了,可以查看该参考资料的pdf或者到我的资源下载  
 src目录下新建文件Makefile: - <font face="微软雅黑" size="3"># src Makefile
 
 -  
 
 - include ../Makefile.common
 
 -  
 
 - OBJS+=startup.o
 
 - OBJS+=main.o
 
 -  
 
 - all: src
 
 -  
 
 - src: app.a
 
 -  
 
 - app.a: $(OBJS)
 
 - $(AR) cr app.a $(OBJS)
 
 - .PHONY: src clean tshow
 
 -  
 
 - clean:
 
 - rm -f app.a $(OBJS)
 
 - tshow:
 
 - @echo "######################################################################################################"
 
 - @echo "################# optimize settings: $(InfoTextLib), $(InfoTextSrc)"
 
 - @echo "######################################################################################################"
 
 - </font>
 
  复制代码然后进入工程主目录,下make就好了. - <font face="微软雅黑" size="3">make clean
 
 - make OptLIB=0 OptSRC=0 all tshow</font>
 
  复制代码 
然后,就完成了.  
 |