历史上的今天
返回首页

历史上的今天

今天是:2025年07月26日(星期六)

正在发生

2019年07月26日 | 使用gcc工具链进行Linux环境下的stm32开发

2019-07-26 来源:eefocus

    处于好奇和学习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的开发环境,主要是提供需要的资源以及搭建过程中的注意事项。其实也不难,详细的细节在参考链接里有描述,在此就不赘述了。感谢各路大牛们,开始学习!


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


推荐阅读

史海拾趣

Emerson Embedded Power公司的发展小趣事

在电子行业的早期,Emerson Embedded Power就开始注重技术创新。该公司不断投入研发资源,开发高效、可靠的电源解决方案,以满足不断增长的市场需求。其创新的电源管理技术不仅提高了设备的性能,还降低了能源消耗,赢得了客户的广泛认可。

Alcatel-Lucent公司的发展小趣事

随着数字化技术的快速发展,Emerson Embedded Power紧跟时代潮流,积极推动数字化转型。该公司利用大数据、云计算等先进技术,优化产品设计、生产和供应链管理,提高了生产效率和产品质量。同时,公司还积极探索数字化营销和服务模式,为客户提供更加便捷、高效的服务体验。

Arduino公司的发展小趣事

随着物联网和智能设备的兴起,Arduino平台在智能家居、智能农业、机器人等领域的应用越来越广泛。开发者们可以利用Arduino平台来设计和开发各种智能设备和应用,实现设备的互联互通和智能化控制。这些应用不仅提高了人们的生活质量,也推动了电子行业的进步和发展。

这五个故事展示了Arduino公司在电子行业中的发展历程和取得的成就。从最初的廉价微控制器解决方案,到如今的多样化主板和广泛应用,Arduino始终秉持着创新、开放和合作的精神,为电子行业的发展做出了重要贡献。

Electronic Concepts Inc公司的发展小趣事

随着市场的竞争加剧,ECI意识到只有不断创新才能在行业中立足。在总经理张女士的领导下,公司投入大量资源进行研发,成功推出了一系列具有竞争力的新产品。其中,一款集成了先进算法的智能传感器,因其高精度和低功耗特性,在市场上大受欢迎。这一创新不仅提升了ECI的品牌形象,也为公司带来了丰厚的利润。

Concurrent Logic公司的发展小趣事

在取得初步成功后,Concurrent Logic开始扩展其产品线。他们不仅开发了多款针对不同应用场景的并行处理芯片,还进军了与并行计算紧密相关的其他硬件领域,如高性能的服务器和存储设备。这些新产品的研发和上市,进一步增强了公司在市场上的竞争力。

bb-smartworx公司的发展小趣事

随着公司规模的扩大,Concurrent Logic开始寻求国际合作。他们与日本、韩国和欧洲的几家公司签订了技术合作协议,共同开发新一代的并行处理解决方案。这些合作为公司带来了更广阔的市场和更多的资源,推动了技术的进一步创新。

问答坊 | AI 解惑

无形的屏幕

哇,我的电脑屏幕隐形了,成透明的了,这...这...怎么可能?淡定淡定,这不是灵异事件,奥秘来自于墙纸...厌倦了常规的墙纸当屏幕背景,那就看一下这一组怪异墙纸,它们会让你的屏幕变无形。但是事实是,屏幕还在,只不过是视觉欺骗了我们的感觉。 ...…

查看全部问答>

有人知道用920T的盒做个ARM9的板子,大约要多少钱吗?

有人知道用920T的盒做个ARM9的板子,大约要多少钱吗?芯片在哪买?…

查看全部问答>

能否根据windows驱动程序(release bin)编写linux驱动

有没有可能通过反编译等方式生成一个linux驱动 有没有捷径可以走…

查看全部问答>

请教一个简单的C51程序,

#include main() {         TMOD=0X10;         TH1=0XFE;         TL1=0X0C;         TR1=1;         ET1=1;       ...…

查看全部问答>

wince下调用软键盘的问题

在wince下调用软键盘,代码如下 void CRecorderDlg::OnBnClickedButton6() {         // TODO: Add your control notification handler code here         SipShowIM(SIPF_ON);  //Shows&nb ...…

查看全部问答>

在wince 下怎么能读取 一个像素 alpha 通道的值

我想把一个带 透明通道的bitmap作为前景贴到一个不带透明通道的背景bitmap上,试了几种方法 都不理想,包括 TransparentBlt(...),alphablend(...),还使用过maskdc 的方法,都不理想。 前两种方法把我的小的前景,拉伸到跟背景一样大;而且Transpa ...…

查看全部问答>

发个清华蓬远地取模软件

前几天取汉字模从网上下个软件,不太好,就因为取然的格式带H地,我要C语言数组地,以前用过清华蓬远的取模软件,我认为是最好地,今天翻出特发上来,大家共享,我也MARK,省得以后再找不到,呵呵…

查看全部问答>

一个晶振引发的问题

本来是51好板,就是CPU座松了,让同事搞一下变紧,拿回来突然不好用,仿真器上也不好用,本来屏幕可显开机画面,但怎么也搞不定,由于急有找了另一台机器总算把程序实验完,第二天对着这个坏板研究起来,首先是换51的40脚DIP座,小心得很,因为板上 ...…

查看全部问答>

菜农友情为STM32设计一种通用加密方法之原理

今天连续看了两篇关于加密方面的帖子,感觉自己应该友情奉献一回了~~~ 设想一种加密办法,大家看看可行吗? 关于STM32F器件电子签名以及加密问题-请指点 今日方知STM32的UID为96位即12个字节,以前知道STM32内嵌CRC32. 网上在线CRC演算工 ...…

查看全部问答>

急求一个实际应用中的反向比例运算放大电路

简要说明一下放大电路的原理和作用…

查看全部问答>