×
单片机 > 单片机程序设计 > 详情

使用gcc工具链进行Linux环境下的stm32开发

发布时间:2020-05-23 发布时间:
|

    处于好奇和学习Linux的目的,准备开始在虚拟机VMware的Ubuntu9.10操作系统下搭建stm32的开发环境。整个过程包括:安装gcc工具链---->建立工程目录--->编写Makefile,连接文件--->编译生成可执行文件--->下载测试。

我的工程资源:http://download.csdn.net/detail/xiaoxiaoxingkongo/9732047

工程建立参考连接:http://blog.csdn.net/embbnux/article/details/17616809

烧录参考链接:http://blog.csdn.net/ybhuangfugui/article/details/52597133

1.安装gcc工具链

   a.下载gcc-arm-none-eabi-4_6-2012q4-20121016.tar.bz2

   b.解压缩

      tar -xjvf  gcc-arm-none-eabi-4_6-2012q4-20121016.tar.bz2

      我解压缩的路径为/work/stm32-tool

   c.配置环境变量,使其生效

      vim /etc/bash.bashrc

      在该文件中添加

      PATH=$PATH:/work/stm32-tool/gcc-arm-none-eabi-4_6-2012q4/bin

      wq保存退出

      source使其立即生效

      source /etc/bash.bashrc

   d.测试

      arm-none-eabi-gcc -v

      如果可以输出关于该工具的信息,说明安装成功

2.建立工程目录

   正如在IDE中需要建立合适的文件目录一样,根据需要的文件进行分类,构建工程目录,方便编写Makefile编译文件

   a.stm32的库函数目录libs

     在进行stm32的开发中,使用官方的库函数是很重要的,所以在我们的工程中也加入了官方的库函数

     STM32_USB-FS-Device_Lib_V4.0.0.rar

     下载解压后将其存放在libs目录中

   b.源文件src

     存放我们自己编写的源文件

   c.头文件inc

     存放源文件中依赖的头文件

   这三个文件目录就构成了我们的工程结构,接下来开始进行Makefile,链接文件的编写

3.编写Makefile,链接文件

   a.Makefile

      一共需要三个Makefile文件,工程根目录,libs目录,src目录各一个,基本不用更改(如果按照以上步骤建立你的工程),就不介绍了。还有一个Makefile.common文件,该文件也放在工程根目录中,其中第42行,根据stm32的型号,选择对应的类型。我的是stm32f103c8t6,选择STM32F10X_MD。

# 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_MD

#============================================================================#

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


   b.链接文件,linker.ld

     该文件也位于工程根目录。主要说明可能需要修改的地方,根据你使用的stm32型号,修改相应的RAM,FLASH大小就OK了。

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 = 20K

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 = 64K

/*Adust ORIGIN to (0x08000000 + (FLASHsize-FeePROMsize)) of target MCU*/

/*and adust LENGTH to FeePROMsize allocated:*/

/*STM32F103RBT --> 0x08000000+126K, 2K*/

EEMUL (RWX) : ORIGIN = 0x08000000+64K, LENGTH = 0K

/*STM32F103RET --> 0x08000000+508K, 4K*/

/*EEMUL (RWX) : ORIGIN = 0x08000000+508K, LENGTH = 4K*/

}

4.编译生成可执行文件

   src中加入源码文件,在shell的工程根目录下输入命令make all,即可生成hex,bin格式的可执行文件。

5.下载hex文件测试

   现在创建的开发环境只是为了提供编译工程,如果想直接在Linux环境下下载程序的朋友可以参考我参考的大牛。这里说的是如何将生成的hex文件在Windows中通过STlink下载到stm32中。

    STM32 ST-LINK Utility这个软件工具其实主要就是配套“ST-LINK”这个下载工具一起使用的上位机软件。因此使用STM32 ST-LINK Utility上位机软件需要有一个ST-LINK工具才行。它的功能和J-Link对应的工具类似,用于烧写代码。通过这个工具,加上stlink,就可以烧写hex文件啦,具体安装及使用也不难。

   STM32 ST-LINK Utility下载

    工程到此结束,本文的目的在于搭建Linux下的stm32的开发环境,主要是提供需要的资源以及搭建过程中的注意事项。其实也不难,详细的细节在参考链接里有描述,在此就不赘述了。感谢各路大牛们,开始学习!


    最后,注意工程资源在顶部有!


关键字:gcc工具链  Linux环境  stm32开发 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码