使用gcc工具链进行Linux环境下的stm32开发_linux stm32 gcc ride truestuio-程序员宅基地

技术标签: C/C++  硬件外设  

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

    处于好奇和学习Linux的目的,准备开始在虚拟机VMware的Ubuntu9.10操作系统下搭建stm32的开发环境。整个过程包括:安装gcc工具链---->建立工程目录--->编写Makefile,连接文件--->编译生成可执行文件--->下载测试。
1.安装gcc工具链
   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的开发中,使用官方的库函数是很重要的,所以在我们的工程中也加入了官方的库函数
     下载解压后将其存放在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的开发环境,主要是提供需要的资源以及搭建过程中的注意事项。其实也不难,详细的细节在参考链接里有描述,在此就不赘述了。感谢各路大牛们,开始学习!

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

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaoxiaoxingkongo/article/details/54232726

智能推荐

django基于微信小程序的学生考勤管理系统(程序+开题报告)_开发学生考勤管理app存在的代码难题和解决办法-程序员宅基地

文章浏览阅读600次,点赞13次,收藏12次。此外,系统还可以提供请假功能,方便学生在线提交请假申请,并得到及时的审批和反馈。最重要的是,基于微信小程序的学生考勤管理系统可以提供数据统计和分析功能,帮助学校领导更好地了解学生的出勤情况,为学校的管理和决策提供有力支持。通过该系统的实施,可以提高学生考勤管理的效率和准确性,减轻教师和辅导员的工作负担,促进学校管理的科学化和规范化。本研究拟解决的主要问题包括如何设计一个用户友好、易操作的学生考勤管理界面,如何实现学生、教师、辅导员和学校领导之间的信息共享和协同工作,以及如何保证考勤数据的准确性和安全性等。_开发学生考勤管理app存在的代码难题和解决办法

java/php/node.js/python教师教学质量评价系统【2024年毕设】-程序员宅基地

文章浏览阅读78次。springboot基于springboot和vue技术的视频与图集网站。springboot基于springbootvue框架的零售店记账系统。springboot基于springboot的学生宿舍管理系统。springboot基于springboot城市智能出行系统。springboot四川工商学院食堂送餐系统的研究与设计。springboot基于javaweb的校友管理系统。springboot基于协同过滤算法的音乐推荐系统。springboot基于微信小程序的社交系统。

层次Softmax相关论文整理_softmax论文-程序员宅基地

文章浏览阅读4.6k次,点赞6次,收藏5次。Softmax函数是逻辑函数的一种推广,广泛应用于神经网络的多分类问题中,然而其计算复杂度与类别大小呈线性关系,在应用于语言模型、机器翻译时会带来高额的计算量,故而不少研究尝试寻找其高效的近似方法,层次Softmax便是其中一种常用的方法,本小节中将介绍层次Softmax中的一些代表模型。1992年,Brown等人在论文《Class-based n-gram models of natural..._softmax论文

sed_find_awk_grep刷题_unix中在当前目录下所有.cc 的文件中找到含有“asiainfo”内容的文件,命令为_____-程序员宅基地

文章浏览阅读627次。填空Unix中在当前目录下所有.cc 的文件中找到含有“asiainfo”内容的文件,命令为:grep 'asiainfo' file使用AWK指定分隔符的参数是 -Fawk -F简答找出当前目录下包含127.0.0.1关键字的文件?grep '127.0.0.1' files删除/显示1.txt文件第3行到第10行的内容?sed -n '3,10p' file..._unix中在当前目录下所有.cc 的文件中找到含有“asiainfo”内容的文件,命令为_____

oracle scn 转时间,oracle SCN跟TIMESTAMP之间转换-程序员宅基地

文章浏览阅读274次。sql代码--获取当前的SCN代码如下:select dbms_flashback.get_system_change_number scn1,timestamp_to_scn(sysdate) scn2 from dual;--将SCN转换成功时间代码如下:select to_char(scn_to_timestamp(34607271),'yyyy-mm-dd hh24:mi:ss') chr..._ora-06512: 在 "sys.scn_to_timestamp", line 1

建筑与建材行业相关深度学习数据集大合集_工程施工数据集csdn-程序员宅基地

文章浏览阅读1.2k次。近期又整理了一批建筑与建材行业相关深度学习数据集,分享给大家。废话不多说,直接上干货!!_工程施工数据集csdn

随便推点

基于Java-SpringBoot+vue实现的前后端分离信息管理系统设计和实现_springboot 和vue框架实现的前后端分离项目系统架构设计-程序员宅基地

文章浏览阅读1k次,点赞9次,收藏16次。当今社会,随着科学技术的发展,以及市场经济的多元化,使人才的流动速度大大增加,因此也对党建工作的管理层面工作带来了空前且复杂的挑战, 从而使得如何高效的开展管理党建工作成为了亟待解决的问题。为此将高速发展的信息科学技术引入到党建工作管理的应用中,力求合理有效的提升全面各项工作的进展,实现以人为本的科学发展思想和意识,是一种高效可实现的方法。 Java作为一种面向对象的、可以撰写跨平台应用软件的程序设计语言,其技术具有卓越的通用性、高效性、平台移植性以及安全性,如今已广泛应用于 PC、数据中心、游戏控制台、科_springboot 和vue框架实现的前后端分离项目系统架构设计

android漏洞修复工具,张源:安卓软件漏洞 修复与检测技术研究-程序员宅基地

文章浏览阅读246次。随着安卓生态系统的发展,安卓软件的安全性不容忽视。安卓软件的漏洞会导致重大的危害,例如隐私泄露、金钱丢失、钓鱼攻击等。告介绍安卓软件漏洞修复和检测的相关工作。漏洞修复是一个困难的过程,并且在漏洞被修复后经常需要花大量的时间去更新具有漏洞的软件。本次报告提出了一个基于规则进行漏洞修复的系统,可以及时的修复软件中存在的权限泄露漏洞。通过对安卓系统进行改造,告介绍如何使用规则去主动的修复具有漏洞的软件并..._有修复漏洞功能的软件安卓版

初中生学c++还是python_2020,你该学习Python还是C++-程序员宅基地

文章浏览阅读1.1k次。前面有一段时间,我学习了Python这门语言,所以到现在,总会有人问我:“你觉得Python还是C++实用?哪个更好用?”接下来的文章就想给大家介绍下两者的一些区别以及优缺点。首先不多说,先给大家说下他们俩的一些差异或者优缺点吧:Python是通用的,也是高级编程语言之一。在python中编写代码时,无需声明即可直接使用变量。在C ++中,单个程序需要在要运行代码的每个操作系统上进行编译。Pyth..._学c++还是学python

企业微信-通讯录管理-成员管理以及部门管理_企业微信 接口创建部门需要通讯录应用吗-程序员宅基地

文章浏览阅读4.8k次。企业微信-通讯录管理-成员管理以及部门管理官方文档通讯录管理的相关接口可以对企业微信里面部门、成员、标签等通讯录信息进行查询、添加、修改、删除等操作。一、开启企业微信通讯录相关权限我们使用通讯录管理的相关接口,原则上需要使用 通讯录管理的 secret,但实际上我们也可以使用企业内应用 secret。但是使用应用 secret 只能进行“查询”、“邀请”等非写操作,而且只能操作应用可见范围内的通讯录。获取通讯录管理 secret 的流程:进入企业微信管理后台,在“管理工具” — “通讯录同步_企业微信 接口创建部门需要通讯录应用吗

MFC:整数编辑框CEdit_mfc cedit 整数-程序员宅基地

文章浏览阅读786次。_mfc cedit 整数

MFC控件使用说明_mfcgetcheck-程序员宅基地

文章浏览阅读9.5k次,点赞15次,收藏77次。VC++控件工具箱:2 按钮(Button):用来接收用户的命令,应用程序在接收到用户命令后,通常需要进行一些后台工作。按钮可以响应单击或双击动作,在按钮接收到鼠标动作后,向其父窗口发送相应的控件通知,用户可以对这些控件通知进行消息映射,从而进行相应的处理。在一个对话框中,可以定义一个默认按钮,这只要选中按钮属性中的“Default”选项。如果在对话框活动的时候按下了Enter键,则等同于单..._mfcgetcheck

推荐文章

热门文章

相关标签