之前在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的文件夹

把该编译器添加到你的环境中:

[plain] view plaincopy

  1. sudo gedit  ~/.bashrc



在最后一行添加:

[plain] view plaincopy

  1. export PATH=$PATH:/your_stm_gcc_dir/gcc-arm-none-eabi-4_8-2013q4/bin

因为我之前有添加过树莓派的编译器了,所以实际上是这样的:

[plain] view plaincopy

  1. 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

两个编译器环境中间用冒号隔开;

注销后测试:

[plain] view plaincopy

  1. arm-none-eabi-gcc -v

可以查看到该编译器的版本,就表示可以了.

二  工程环境的建立

新建个工程文件夹,及其目录

[plain] view plaincopy

  1. mkdir stm_project
  2. cd stm_project
  3. mkdir libs
  4. mkdir src
  5. mkdir inc


下载,安装官方库:

stm32的寄存器不像51 avr等单片机,那么少,自己写写库,背背寄存器就可以了,所以ST公司提供了他们官方的库,为了避免重复造轮子,就直接采用他们的库,库版本为STM32_USB-FS-Device_Lib_V4.0.0,这个库多了usb支持,下载的话到st官网搜索stm32f10x就有了.

下载链接:

stsw-stm32121.zip

解压,把解压好的文件夹复制到刚才新建的libs里面.

在工程根目录下新建Makefile.common文件,这个为通用makefile

[cpp] view plaincopy

  1. # include Makefile
  2. #This file is included in the general Makefile, the libs Makefile and the src Makefile
  3. #Different optimize settings for library and source files can be realized by using arguments
  4. #Compiler optimize settings:
  5. # -O0 no optimize, reduce compilation time and make debugging produce the expected results (default).
  6. # -O1 optimize, reduce code size and execution time, without much increase of compilation time.
  7. # -O2 optimize, reduce code execution time compared to ‘O1’, increase of compilation time.
  8. # -O3 optimize, turns on all optimizations, further increase of compilation time.
  9. # -Os optimize for size, enables all ‘-O2’ optimizations that do not typically increase code size and other code size optimizations.
  10. #Recommended optimize settings for release version: -O3
  11. #Recommended optimize settings for debug version: -O0
  12. #Valid parameters :
  13. # OptLIB=0 --> optimize library files using the -O0 setting
  14. # OptLIB=1 --> optimize library files using the -O1 setting
  15. # OptLIB=2 --> optimize library files using the -O2 setting
  16. # OptLIB=3 --> optimize library files using the -O3 setting
  17. # OptLIB=s --> optimize library files using the -Os setting
  18. # OptSRC=0 --> optimize source files using the -O0 setting
  19. # OptSRC=1 --> optimize source files using the -O1 setting
  20. # OptSRC=2 --> optimize source files using the -O2 setting
  21. # OptSRC=3 --> optimize source files using the -O3 setting
  22. # OptSRC=s --> optimize source files using the -Os setting
  23. # all --> build all
  24. # libs --> build libs only
  25. # src --> build src only
  26. # clean --> clean project
  27. # tshow --> show optimize settings
  28. #Example:
  29. # make OptLIB=3 OptSRC=0 all tshow
  30. TOP=$(shell readlink -f "$(dir $(lastword $(MAKEFILE_LIST)))")
  31. PROGRAM=main
  32. LIBDIR=$(TOP)/libs
  33. #Adust the following line to the library in use
  34. #=========add by embbnux  根据你的库不同,调整这个地方的库目录地址====================#
  35. STMLIB=$(LIBDIR)/STM32_USB-FS-Device_Lib_V4.0.0/Libraries
  36. #=========add by embbnux  根据你的stm32芯片型号容量不同,修改这个地方的TypeOfMCU=======#
  37. #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
  38. #============================================================================#
  39. TypeOfMCU=STM32F10X_HD
  40. #============================================================================#
  41. TC=arm-none-eabi
  42. CC=$(TC)-gcc
  43. LD=$(TC)-ld -v
  44. OBJCOPY=$(TC)-objcopy
  45. AR=$(TC)-ar
  46. GDB=$(TC)-gdb
  47. INCLUDE=-I$(TOP)/inc
  48. INCLUDE+=-I$(STMLIB)/CMSIS/Include
  49. INCLUDE+=-I$(STMLIB)/CMSIS/Device/ST/STM32F10x/Include
  50. INCLUDE+=-I$(STMLIB)/CMSIS/Device/ST/STM32F10x/Source/Templates
  51. INCLUDE+=-I$(STMLIB)/STM32F10x_StdPeriph_Driver/inc
  52. INCLUDE+=-I$(STMLIB)/STM32_USB-FS-Device_Driver/inc
  53. COMMONFLAGS=-g -mcpu=cortex-m3 -mthumb
  54. COMMONFLAGSlib=$(COMMONFLAGS)
  55. #Commands for general Makefile and src Makefile
  56. ifeq ($(OptSRC),0)
  57. COMMONFLAGS+=-O0
  58. InfoTextSrc=src (no optimize, -O0)
  59. elseifeq ($(OptSRC),1)
  60. COMMONFLAGS+=-O1
  61. InfoTextSrc=src (optimize time+ size+, -O1)
  62. elseifeq ($(OptSRC),2)
  63. COMMONFLAGS+=-O2
  64. InfoTextSrc=src (optimize time++ size+, -O2)
  65. elseifeq ($(OptSRC),s)
  66. COMMONFLAGS+=-Os
  67. InfoTextSrc=src (optimize size++, -Os)
  68. else
  69. COMMONFLAGS+=-O3
  70. InfoTextSrc=src (full optimize, -O3)
  71. endif
  72. CFLAGS+=$(COMMONFLAGS) -Wall -Werror $(INCLUDE)
  73. CFLAGS+=-D $(TypeOfMCU)
  74. CFLAGS+=-D VECT_TAB_FLASH
  75. #Commands for libs Makefile
  76. ifeq ($(OptLIB),0)
  77. COMMONFLAGSlib+=-O0
  78. InfoTextLib=libs (no optimize, -O0)
  79. elseifeq ($(OptLIB),1)
  80. COMMONFLAGSlib+=-O1
  81. InfoTextLib=libs (optimize time+ size+, -O1)
  82. elseifeq ($(OptLIB),2)
  83. COMMONFLAGSlib+=-O2
  84. InfoTextLib=libs (optimize time++ size+, -O2)
  85. elseifeq ($(OptLIB),s)
  86. COMMONFLAGSlib+=-Os
  87. InfoTextLib=libs (optimize size++, -Os)
  88. else
  89. COMMONFLAGSlib+=-O3
  90. InfoTextLib=libs (full optimize, -O3)
  91. endif
  92. CFLAGSlib+=$(COMMONFLAGSlib) -Wall -Werror $(INCLUDE)
  93. CFLAGSlib+=-D $(TypeOfMCU)
  94. CFLAGSlib+=-D VECT_TAB_FLASH


编译库文件:

进入libs文件夹,新建Makefile:

[cpp] view plaincopy

  1. # libs Makefile
  2. include ../Makefile.common
  3. LIBS+=libstm32.a
  4. CFLAGSlib+=-c
  5. all: libs
  6. libs: $(LIBS)
  7. libstm32.a:
  8. @echo -n "Building $@ ..."
  9. @cd $(STMLIB)/CMSIS/Device/ST/STM32F10x/Source/Templates && \
  10. $(CC) $(CFLAGSlib) \
  11. system_stm32f10x.c
  12. @cd $(STMLIB)/STM32F10x_StdPeriph_Driver/src && \
  13. $(CC) $(CFLAGSlib) \
  14. -D"assert_param(expr)=((void)0)"\
  15. -I../../CMSIS/Include \
  16. -I../../CMSIS/Device/ST/STM32F10x/Include \
  17. -I../inc \
  18. *.c
  19. #   @cd $(STMLIB)/STM32_USB-FS-Device_Driver/src && \
  20. #   $(CC) $(CFLAGSlib) \
  21. #   -D"assert_param(expr)=((void)0)" \
  22. #   -I../../CMSIS/Include \
  23. #   -I../../CMSIS/Device/ST/STM32F10x/Include \
  24. #   -I../inc \
  25. #   *.c
  26. @$(AR) cr $(LIBDIR)/$@ \
  27. $(STMLIB)/CMSIS/Device/ST/STM32F10x/Source/Templates/system_stm32f10x.o \
  28. $(STMLIB)/STM32F10x_StdPeriph_Driver/src/*.o \
  29. #       $(STMLIB)/STM32_USB-FS-Device_Driver/src/*.o
  30. @echo "done."
  31. .PHONY: libs clean tshow
  32. clean:
  33. rm -f $(STMLIB)/CMSIS/Device/ST/STM32F10x/Source/Templates/system_stm32f10x.o
  34. rm -f $(STMLIB)/STM32F10x_StdPeriph_Driver/src/*.o
  35. rm -f $(STMLIB)/STM32_USB-FS-Device_Driver/src/*.o
  36. rm -f $(LIBS)
  37. tshow:
  38. @echo "######################################################################################################"
  39. @echo "################# optimize settings: $(InfoTextLib), $(InfoTextSrc)"
  40. @echo "######################################################################################################"

编译该库:

[plain] view plaincopy

  1. make clean
  2. make

就会在lib目录下生成libstm32.a,这个就是编译好的静态库了.

建立工程编译ld文件

这个ld文件,为在编译时告诉编译器把代码放到什么地址,根据芯片的内存以及flash容量不同有所调整

在工程根目录下新建linker.ld文件

代码较长,请到我的资源里面下载,或者查看参考pdf里面的:

http://download.csdn.net/detail/canyue102/6778837

这里说明需要修改的地方,根据芯片型号不同,选择相应的RAM FLASH大小

[css] view plaincopy

  1. MEMORY {
  2. /*Adust LENGTH to RAMsize of target MCU:*/
  3. /*STM32F103RBT --> 20K*/
  4. /*RAM (RWX) : ORIGIN = 0x20000000 , LENGTH = 20K*/
  5. /*STM32F103RET --> 64K*/
  6. /*STM32F103ZET --> 64K*/
  7. RAM (RWX) : ORIGIN = 0x20000000, LENGTH =64K
  8. EXTSRAM (RWX) : ORIGIN = 0x68000000, LENGTH =0
  9. /*Adust LENGTH to (FLASHsize - FeePROMsize) of target MCU:*/
  10. /*STM32F103RBT --> 126K*/
  11. FLASH (RX) : ORIGIN = 0x08000000, LENGTH =126K
  12. /*STM32F103RET --> 508K*/
  13. /*FLASH (RX) : ORIGIN = 0x08000000 , LENGTH = 508K*/
  14. /*STM32F103ZET --> 508K*/
  15. FLASH (RX) : ORIGIN = 0x08000000, LENGTH =508K
  16. /*Adust ORIGIN to (0x08000000 + (FLASHsize-FeePROMsize)) of target MCU*/
  17. /*and adust LENGTH to FeePROMsize allocated:*/
  18. /*STM32F103RBT --> 0x08000000+126K, 2K*/
  19. EEMUL (RWX) : ORIGIN = 0x08000000+126K, LENGTH =2K
  20. /*STM32F103RET --> 0x08000000+508K, 4K*/
  21. /*EEMUL (RWX) : ORIGIN = 0x08000000+508K, LENGTH = 4K*/
  22. }

在工程根目录下新建Makefile文件:

[plain] view plaincopy

  1. # general Makefile
  2. include Makefile.common
  3. LDFLAGS=$(COMMONFLAGS) -fno-exceptions -ffunction-sections -fdata-sections -L$(LIBDIR) -nostartfiles -Wl,--gc-sections,-Tlinker.ld
  4. LDLIBS+=-lm
  5. LDLIBS+=-lstm32
  6. STARTUP=startup.c
  7. all: libs src
  8. $(CC) -o $(PROGRAM).elf $(LDFLAGS) \
  9. -Wl,--whole-archive \
  10. src/app.a \
  11. -Wl,--no-whole-archive \
  12. $(LDLIBS)
  13. $(OBJCOPY) -O ihex $(PROGRAM).elf $(PROGRAM).hex
  14. $(OBJCOPY) -O binary $(PROGRAM).elf $(PROGRAM).bin
  15. #Extract info contained in ELF to readable text-files:
  16. arm-none-eabi-readelf -a $(PROGRAM).elf > $(PROGRAM).info_elf
  17. arm-none-eabi-size -d -B -t $(PROGRAM).elf > $(PROGRAM).info_size
  18. arm-none-eabi-objdump -S $(PROGRAM).elf > $(PROGRAM).info_code
  19. arm-none-eabi-nm -t d -S --size-sort -s $(PROGRAM).elf > $(PROGRAM).info_symbol
  20. .PHONY: libs src clean tshow
  21. libs:
  22. $(MAKE) -C libs $@
  23. src:
  24. $(MAKE) -C src $@
  25. clean:
  26. $(MAKE) -C src $@
  27. $(MAKE) -C libs $@
  28. rm -f $(PROGRAM).elf $(PROGRAM).hex $(PROGRAM).bin $(PROGRAM).info_elf $(PROGRAM).info_size
  29. rm -f $(PROGRAM).info_code
  30. rm -f $(PROGRAM).info_symbol
  31. tshow:
  32. @echo "######################################################################################################"
  33. @echo "################# optimize settings: $(InfoTextLib), $(InfoTextSrc)"
  34. @echo "######################################################################################################"



差不多就好了,在src里面添加测试源码

主要是startup.c 以及main.c,这里就不在说明了,可以查看该pdf或者到我的资源下载

http://download.csdn.net/detail/canyue102/6778885

然后进入工程主目录,下make就好了.

[plain] view plaincopy

  1. make clean
  2. make OptLIB=0 OptSRC=0 all tshow

然后,就完成了,关于ubuntu下烧录程序到stm32下,请见下一篇博客

buntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立相关推荐

  1. ubuntu linux下建立stm32开发环境: 程序烧录 openocd+openjtag

    原文出处: http://blog.csdn.net/embbnux/article/details/17619621 之前建立stm32开发环境,程序也已经编译好生成main.bin,接下来就是要把 ...

  2. GCC编译器简明教程(Linux下C语言开发环境的搭建)

    GCC编译器简明教程(Linux下C语言开发环境的搭建) 市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境(例如GNOME.KDE.Unity等)和各种常用的必 ...

  3. LibOpenCM3(一) Linux下命令行开发环境配置

    目录 LibOpenCM3(一) Linux下命令行开发环境配置 LibOpenCM3(二) 项目模板 Makefile分析 LibOpenCM3(三) .ld文件(连接器脚本)和startup代码说 ...

  4. linux 下51单片机开发环境搭建

    linux 下51单片机开发环境搭建(arch linux) 编译sdcc 软件: sdcc 命令:sdcc file.c 得到一堆文件需要( .inx) 命令: packihx file.inx & ...

  5. Linux 下搭建 Scala 开发环境

    在实际开发中,我们的项目是部署到 linux,因此,我们需要在 Linux 下搭建 scala 的环境. 具体的步骤如下: 下载对应的 scala 的安装软件.scala-2.11.8.tgz 通过远 ...

  6. linux下julia的开发环境,Ubuntu搭建Julia远程开发环境

    Julia作为一门新兴的编程语言,还是可以学一学的,这里总结了一下Ubuntu系统远程搭建Julia开发环境的方法. 前期准备: 云服务器一台,操作系统为Ubuntu18.04, xshell6 + ...

  7. 阿里云服务器搭建python web环境_《Python入门》Linux 下 Python Web开发环境搭建笔记-阿里云开发者社区...

    之前写过 Windows 7下Python Web开发环境搭建笔记,今天写一下在Linux系统下搭建Python Web的开发测试环境. 我使用的系统是:ubuntu 14.04 server,根据个 ...

  8. Python入门 Linux 下 Python Web开发环境搭建笔记

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 之前写过 ...

  9. 《Python入门》Linux 下 Python Web开发环境搭建笔记

    之前写过 Windows 7下Python Web开发环境搭建笔记,今天写一下在Linux系统下搭建Python Web的开发测试环境. 我使用的系统是:ubuntu 14.04 server,Cen ...

最新文章

  1. android连接usb外设通讯_iOS App连接外设的几种方式
  2. python中进制_python中进制的算法
  3. linux下大于2TB硬盘格式化及挂载,linux下大于2T的分区方法
  4. 我的世界服务器怎么显示腐竹来了,我的世界腐竹开服必看manu权限组教程
  5. VTK修炼之道20:图像基本操作_图像类型转换
  6. 最全的 eclipse web 项目目录结构
  7. 解决centos6.5出现-bash: mysql: command not found的方法
  8. 分布式 虚拟时间和虚拟同步_分布式虚拟跟踪
  9. 锐起无盘服务器ip设置,锐起无盘系统教程dhcp
  10. 约瑟夫环c语言代码顺序存储,约瑟夫环问题算法的C语言代码实现
  11. 套用这套模板,玩转周报、月报、年报更省事
  12. android ps1 变量配置,安卓ps模拟器ePSXe使用图文教程
  13. 3DS MAX 导入骨骼动画插件
  14. 手绘板的制作——重置与橡皮擦(2)
  15. Y2K问题和2038问题
  16. 求导四则运算以及三角函数求导 Derivative formulas
  17. 那些在风雨中依然坚守的人们
  18. Android Studio报错--Error: Library projects cannot set applicationId. applicationId is set to ...
  19. 如何用lisp画蔓叶线_用Autolisp 在AutoCAD中实现多种曲线的绘制
  20. 【SNS】什么是精英?什么是草根?为什么要SNS?

热门文章

  1. 网络编程Socket之UDP
  2. BZOJ 2073: [POI2004]PRZ( 状压dp )
  3. USACO 3.2 kimbits DP
  4. 【十五分钟Talkshow】工作流及工作流框架、服务
  5. 《Shell脚本学习指南》第四章 文本处理工具
  6. Oracle 10G 全新创建数据库过程(暂记)
  7. c# 写入xml 怪异的事情
  8. htmlcss实例小项目_HTMLCSS学习笔记(十九)-- 媒体查询
  9. C语言优先级——取反和移位
  10. 【强化学习】Q-Learning