STM32 gcc编译环境搭建
STM32 gcc编译环境搭建
标签(空格分隔): stm32 gcc Makefile
说在前面的话
gcc编译器兼容Windows、Linux和MAC,可自行去官网下载,此处提供参考链接:https://launchpad.net/gcc-arm-embedded/,Linux可直接在命令行输入命令:
sudo apt-get install arm-none-eabi-gcc
,自动下载安装。gcc在三大平台操作命令完全一样,下面以Linux的Ubuntu发行版为例,说明下如何为stm32搭建gcc编译环境,从此摆脱IDE~~~
本文只提供开发流程,具体技术细节不懂的欢迎在评论下留言,互相学习,或者可以自行百度~
一、安装arm gcc
- 打开命令行,输入
sudo apt-get install arm-none-eabi-gcc
- 等待安装完成,在命令行输入
arm-none-eabi-gcc -v
,出现下图所示的输出,说明安装成功
二、安装openocd
openocd用来给目标板下载程序
- 在命令行输入
sudo apt-get install openocd
- 等待安装完成,在命令行输入
openocd -v
,出现下图所示的输出,说明安装成功
三、安装jlink驱动
此处提供参考链接http://blog.csdn.net/justloong/article/details/73467875
四、修改ST的内核文件
此处以stm32f103ze为例,打开ST官方提供的内核文件STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c
,将下面两段代码中的第5行(源文件的736行)和第5行(源文件的753行)的"=r"
改为"=&r"
,变成__ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
和__ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
第一个代码段
uint32_t __STREXB(uint8_t value, uint8_t *addr) {uint32_t result=0;__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );return(result); }
第二个代码段
uint32_t __STREXH(uint16_t value, uint16_t *addr) {uint32_t result=0;__ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );return(result); }
五、替换启动文件
stm32开发的同学都熟悉它的汇编启动文件,但是在MDk中使用的启动文件和gcc环境使用的启动文件并不相同,因为前者是arm汇编的语法,后者是gcc汇编的语法,在gcc环境下,只能使用后者,否则无法编译,而gcc下的启动文件在TM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7
下,同时跟它同级目录下还有一个文件夹,叫TrueSTUDIO
,里面的启动文件是ST官方为了适配他们自己的开发环境而做的,同样可以在gcc环境中使用。
六、添加链接脚本
gcc编译需要后缀为.ld的链接脚本,里面说明了FLASH、RAM、烧录地址等信息,直接使用ST固件库里的即可,在STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Template/TrueSTUDIO
下,如下图所示:
我用的是f103ze,属于大容量,选择STM3210E-EVAL
下的stm32_flash.ld
文件,将其拷贝到自己工程根目录。TrueSTUDIO下的其他文件夹里的启动文件,都是根据不同芯片容量密度分类的,里面有readme,请阅读后,选择适合自己平台的脚本文件。
七、编写Makefile
Makefile是一种自动化的脚本,一般用来执行gcc的自动编译(当然,除此之外,它最重要的目的就是为了工程管理),关于如何编写Makefile,此处提供参考链接http://seisman.info/how-to-write-makefile.html,文档是一名叫做陈皓的工程师编写的,比较系统全面,下面粘贴出我自己工程的Makefile作为参考,实现了代码编译(make
)、目标文件清除(make clean
)和程序下载(make download
)功能,只要在工程根目录下打开命令行,输入括号中的命令即可。
#工程的名称及最后生成文件的名字
TARGET = LED#设定临时性环境变量
export CC = arm-none-eabi-gcc
export AS = arm-none-eabi-as
export LD = arm-none-eabi-ld
export OBJCOPY = arm-none-eabi-objcopy#读取当前工作目录
TOP=$(shell pwd)#设定包含文件目录
INC_FLAGS= -I $(TOP)/CORE \-I $(TOP)/HARDWARE/LED \-I $(TOP)/STM32F10x_FWLib/inc \-I $(TOP)/SYSTEM/delay \-I $(TOP)/SYSTEM/sys \-I $(TOP)/SYSTEM/usart \-I $(TOP)/USERCFLAGS = -W -Wall -g -mcpu=cortex-m3 -mthumb -D STM32F10X_HD -D USE_STDPERIPH_DRIVER $(INC_FLAGS) -O3 -std=gnu11
ASFLAGS = -W -Wall -g -Wall -mcpu=cortex-m3 -mthumbC_SRC=$(shell find ./ -name '*.c')
C_OBJ=$(C_SRC:%.c=%.o) ASM_SRC=$(shell find ./ -name '*.s')
ASM_OBJ=$(ASM_SRC:%.s=%.o).PHONY: all clean update all:$(C_OBJ) $(ASM_OBJ)$(CC) $(C_OBJ) $(ASM_OBJ) -T stm32_flash.ld -o $(TARGET).elf -mthumb -mcpu=cortex-m3 -Wl,--start-group -lc -lm -Wl,--end-group -specs=nano.specs -specs=nosys.specs -static -Wl,-cref,-u,Reset_Handler -Wl,-Map=Project.map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 $(OBJCOPY) $(TARGET).elf $(TARGET).bin -Obinary $(OBJCOPY) $(TARGET).elf $(TARGET).hex -Oihex$(C_OBJ):%.o:%.c@$(CC) -c $(CFLAGS) -o $@ $<$(ASM_OBJ):%.o:%.s$(CC) -c $(ASFLAGS) -o $@ $<clean:rm -f $(shell find ./ -name '*.o')rm -f $(shell find ./ -name '*.d')rm -f $(shell find ./ -name '*.map')rm -f $(shell find ./ -name '*.elf')rm -f $(shell find ./ -name '*.bin')rm -f $(shell find ./ -name '*.hex')download:openocd -f /usr/share/openocd/scripts/interface/jlink.cfg -f /usr/share/openocd/scripts/target/stm32f1x.cfg -c init -c halt -c "flash write_image erase $(TOP)/$(TARGET).hex" -c reset -c shutdown
STM32 gcc编译环境搭建相关推荐
- VScode+gcc编译环境搭建
VScode+gcc编译环境搭建 VScode下载 GCC安装 可能出现的问题 一些IDE集成开发环境占用内存大,体量大,比如Visual studio. Visual Studio Code (简称 ...
- 安装mips编译器和模拟器/mips GCC编译环境搭建
目录 安装mips编译器和模拟器/mips编译环境搭建 Linux Windows 安装mips编译器和模拟器/mips编译环境搭建 安装mips上的GCC编译器. Linux 以下内容在Ubuntu ...
- 基于stm32f103R6 Keil uVision5编译环境搭建
1.新建一个项目,如图,我建的工程名称为LED. 2.点击Target,再点击Options for target. 3.点击Device,这里我选择的是stm32f103R6(根据个人情况而定),也 ...
- Windows编译环境搭建(VS2010)
引言: 本篇文章基于教程目的(由于windows和linux相关环境搭建篇幅过大,在博客中做这些讲解),主要描述Windows的发展历程和编译环境搭建(基于 Visual Studio 2010版 ...
- 【华为云技术分享】鲲鹏弹性云服务器GCC交叉编译环境搭建指南
南七技校林书豪 1.简介 交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码.本指南主要内容为在非ARM架构服务器环境下搭建ARM的GCC编译环境,编译基于ARM架构的应用软件.交叉编译 ...
- Hi3516DV300编译环境搭建问题及解决
Hi3516DV300编译环境搭建问题及解决 1.安装完工具链,提示找不到gcc 问题: bash: /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target ...
- FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译
FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译 什么是Firmament? Firmament (FMT) 是一款基于模型设计 (Model-Based-Design, M ...
- Sky37E/D 基于Ubuntu21.04 编译环境搭建
Sky37E/D 基于Ubuntu21.04 编译环境搭建 0. 下载安装Ubuntu 21.04 官网下载ubuntu21.04镜像(ubuntu-21.04-desktop-amd64.iso) ...
- RISC-V GNU编译环境搭建与运行实践
RISC-V GNU编译环境搭建与运行实践 riscv-gnu-toolchain交叉编译工具链 riscv-gnu-toolchain下载 riscv-gnu-toolchain编译 RISC-V运 ...
最新文章
- eclipse安装Eclipse HTML Editor插件
- linux usb xhci ehci,ehci和xhci有什么区别
- 人工智能第六课:如何做研究
- Intel Hex概述
- delphi7 mysql控件_Delphi7连接MySql数据库-DBGrid控件显示数据
- 三次hermite插值matlab,三次hermite插值
- 宝峰uv5r怎么设置信道_宝峰5R说明书 及设置方法
- vue-router懒加载,用于多页面项目
- linux dot命令,linux绘图工具之dot
- unity 制作拼图游戏
- android时间轴折线图,echarts时间轴折线图
- USB PD 等多协议快充方案
- 51单片机仿真——中断系统(2)
- mysql rollup函数_Mysql,Oracle使用rollup函数完成行列统计
- 微赛智慧体育从微信入口提供SaaS服务,力求统一体育服务行业标准
- 教师资格中学计算机知识点,2017年教师资格证《信息技术》高频考点
- 《战争通论》详细分析世界十大兵书…
- 元宇宙:迈向新世界的脚步
- VS2019运行缺少MSVCP110D 和MSVCR110D的解决办法
- Python中文分词工具大合集:安装、使用和测试
热门文章
- 电视台的流媒体地址 mms
- Warning:Configuration 'compile' is obsolete and has been replaced with 'implementation'. It will be
- python 波形包络线_Python在信号与系统中的应用(1)——Hilbert变换,Hilbert在单边带包络检波的应用,FIR_LPF滤波器设计,还有逼格高高的FM(PM)调制...
- Go (Golang) 语言-Golang 定时器Timer和Ticker、time.AfterFunc、time.NewTicker()实例
- JavaScript对XML的一些DOM操作
- 谈谈30这个程序员迷茫的年龄
- 程序员批注《语言学教程》——第三章 从语素到短语
- Pytorch:手撕ResNet34实现汽车分类
- 导图解文 从梦想到财富(13)你的运气,为什么一直不好?
- 【自然语言处理】BERT-Whitening