ubuntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立
来源:互联网 发布:韩顺平php全套视频400 编辑:程序博客网 时间:2024/05/16 17:20
之前在e络盟的意法半导体掏了一个STM32开发板挺好的,却不想在window下开发,也不想用那么占内存的IAR MDK等软件,所以决定在ubuntu下建立该开发环境,像之前avr linux一样,找了下资料,国内有人做过,但都没有很详尽的教程,所以花了三四天才完成.其实原理很简单,就是安装适用与STM32的GCC,以及建立该工程,主要是Makefile加上STM32的官方库.
个人原创,转载请注明原文出处:
http://blog.csdn.net/embbnux/article/details/17616809
参考:
How-to manual Installing a toolchain for Cortex-M3/STM32 on Ubuntu by Peter Seng
博文新地址转为下面链接,有问题到该地址评论哦:
https://www.embbnux.com/2014/02/01/linux_stm32_gcc_makefile/
博主最近在电脑上自建了博客,以后会更多的用那个了,欢迎关注访问,里面也有很多有用资源:
http://www.embbnux.com/
环境:
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的文件夹
把该编译器添加到你的环境中:
sudo gedit ~/.bashrc
在最后一行添加:
export PATH=$PATH:/your_stm_gcc_dir/gcc-arm-none-eabi-4_8-2013q4/bin因为我之前有添加过树莓派的编译器了,所以实际上是这样的:
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
两个编译器环境中间用冒号隔开;
注销后测试:
arm-none-eabi-gcc -v可以查看到该编译器的版本,就表示可以了.
二 工程环境的建立
mkdir stm_projectcd stm_projectmkdir libsmkdir srcmkdir inc
下载,安装官方库:
stm32的寄存器不像51 avr等单片机,那么少,自己写写库,背背寄存器就可以了,所以ST公司提供了他们官方的库,为了避免重复造轮子,就直接采用他们的库,库版本为STM32_USB-FS-Device_Lib_V4.0.0,这个库多了usb支持,下载的话到st官网搜索stm32f10x就有了.
下载链接:
stsw-stm32121.zip
解压,把解压好的文件夹复制到刚才新建的libs里面.
在工程根目录下新建Makefile.common文件,这个为通用makefile
# 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 tshowTOP=$(shell readlink -f "$(dir $(lastword $(MAKEFILE_LIST)))")PROGRAM=mainLIBDIR=$(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-eabiCC=$(TC)-gccLD=$(TC)-ld -vOBJCOPY=$(TC)-objcopyAR=$(TC)-arGDB=$(TC)-gdbINCLUDE=-I$(TOP)/incINCLUDE+=-I$(STMLIB)/CMSIS/IncludeINCLUDE+=-I$(STMLIB)/CMSIS/Device/ST/STM32F10x/IncludeINCLUDE+=-I$(STMLIB)/CMSIS/Device/ST/STM32F10x/Source/TemplatesINCLUDE+=-I$(STMLIB)/STM32F10x_StdPeriph_Driver/incINCLUDE+=-I$(STMLIB)/STM32_USB-FS-Device_Driver/incCOMMONFLAGS=-g -mcpu=cortex-m3 -mthumbCOMMONFLAGSlib=$(COMMONFLAGS)#Commands for general Makefile and src Makefileifeq ($(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)endifCFLAGS+=$(COMMONFLAGS) -Wall -Werror $(INCLUDE)CFLAGS+=-D $(TypeOfMCU)CFLAGS+=-D VECT_TAB_FLASH#Commands for libs Makefileifeq ($(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)endifCFLAGSlib+=$(COMMONFLAGSlib) -Wall -Werror $(INCLUDE)CFLAGSlib+=-D $(TypeOfMCU)CFLAGSlib+=-D VECT_TAB_FLASH
编译库文件:
进入libs文件夹,新建Makefile:
# libs Makefileinclude ../Makefile.commonLIBS+=libstm32.aCFLAGSlib+=-call: libslibs: $(LIBS)libstm32.a:@echo -n "Building $@ ..."@cd $(STMLIB)/CMSIS/Device/ST/STM32F10x/Source/Templates && \$(CC) $(CFLAGSlib) \system_stm32f10x.c@cd $(STMLIB)/STM32F10x_StdPeriph_Driver/src && \$(CC) $(CFLAGSlib) \-D"assert_param(expr)=((void)0)" \-I../../CMSIS/Include \-I../../CMSIS/Device/ST/STM32F10x/Include \-I../inc \*.c#@cd $(STMLIB)/STM32_USB-FS-Device_Driver/src && \#$(CC) $(CFLAGSlib) \#-D"assert_param(expr)=((void)0)" \#-I../../CMSIS/Include \#-I../../CMSIS/Device/ST/STM32F10x/Include \#-I../inc \#*.c@$(AR) cr $(LIBDIR)/$@ \$(STMLIB)/CMSIS/Device/ST/STM32F10x/Source/Templates/system_stm32f10x.o \$(STMLIB)/STM32F10x_StdPeriph_Driver/src/*.o \#$(STMLIB)/STM32_USB-FS-Device_Driver/src/*.o@echo "done.".PHONY: libs clean tshowclean:rm -f $(STMLIB)/CMSIS/Device/ST/STM32F10x/Source/Templates/system_stm32f10x.orm -f $(STMLIB)/STM32F10x_StdPeriph_Driver/src/*.orm -f $(STMLIB)/STM32_USB-FS-Device_Driver/src/*.orm -f $(LIBS)tshow:@echo "######################################################################################################"@echo "################# optimize settings: $(InfoTextLib), $(InfoTextSrc)"@echo "######################################################################################################"编译该库:
make cleanmake
就会在lib目录下生成libstm32.a,这个就是编译好的静态库了.
建立工程编译ld文件
这个ld文件,为在编译时告诉编译器把代码放到什么地址,根据芯片的内存以及flash容量不同有所调整
在工程根目录下新建linker.ld文件
代码较长,请到我的资源里面下载,或者查看参考pdf里面的:
http://download.csdn.net/detail/canyue102/6778837
这里说明需要修改的地方,根据芯片型号不同,选择相应的RAM FLASH大小
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 = 64KEXTSRAM (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*/}在工程根目录下新建Makefile文件:
# general Makefileinclude Makefile.commonLDFLAGS=$(COMMONFLAGS) -fno-exceptions -ffunction-sections -fdata-sections -L$(LIBDIR) -nostartfiles -Wl,--gc-sections,-Tlinker.ldLDLIBS+=-lmLDLIBS+=-lstm32STARTUP=startup.call: 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_elfarm-none-eabi-size -d -B -t $(PROGRAM).elf > $(PROGRAM).info_sizearm-none-eabi-objdump -S $(PROGRAM).elf > $(PROGRAM).info_codearm-none-eabi-nm -t d -S --size-sort -s $(PROGRAM).elf > $(PROGRAM).info_symbol.PHONY: libs src clean tshowlibs:$(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_sizerm -f $(PROGRAM).info_coderm -f $(PROGRAM).info_symboltshow:@echo "######################################################################################################"@echo "################# optimize settings: $(InfoTextLib), $(InfoTextSrc)"@echo "######################################################################################################"
差不多就好了,在src里面添加测试源码
主要是startup.c 以及main.c,这里就不在说明了,可以查看该pdf或者到我的资源下载
http://download.csdn.net/detail/canyue102/6778885
然后进入工程主目录,下make就好了.
make cleanmake OptLIB=0 OptSRC=0 all tshow然后,就完成了,关于ubuntu下烧录程序到stm32下,请见下一篇博客
- ubuntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立
- ubuntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立
- ubuntu linux下建立stm32开发环境: 程序烧录 openocd+openjtag
- ubuntu linux下建立stm32开发环境: 程序烧录 openocd+openjtag
- STM32在KEIL MDK环境下建立新工程
- linux下GTK开发环境建立(ubuntu)(转)
- Ubuntu Linux 安装后,建立嵌入式开发环境
- STM32建立IAR开发环境
- Ubuntu下建立Android开发环境
- Ubuntu下建立Android开发环境
- Ubuntu下建立Android开发环境
- Ubuntu apache2下建立django开发环境
- ubuntu 下Gtk 开发环境建立
- ubuntu开发环境建立
- Ubuntu上建立Arm Linux 开发环境
- 嵌入式 Ubuntu下如何建立gcc和g++编译环境
- feodra 20下建立STM32开发环境(1)
- Linux下Java开发环境建立
- Django外键的删除
- wince 中使用HttpSendRequest函数POST数据时应该注意的一点
- Python中生成唯一码(uuid的使用)
- jquery集合遍历
- edx 学习备忘
- ubuntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立
- 排序算法(七):归并排序
- IOS通过加速感应器实现手机实现手机屏幕上的足球可以来回的滚动反弹
- 将阿拉伯数字钱格式转换成中文格式
- linux核心版本号的说明
- DML、DDL、DCL区别
- android之surfaceview画图
- 深入浅出Java并发包—锁(Lock)VS同步(synchronized)
- paip.log4j 日志系统 参数以及最佳实践