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

  1. 打开命令行,输入sudo apt-get install arm-none-eabi-gcc
  2. 等待安装完成,在命令行输入arm-none-eabi-gcc -v,出现下图所示的输出,说明安装成功Screenshot from 2017-11-07 22-36-04.png-94.3kB

二、安装openocd

openocd用来给目标板下载程序

  1. 在命令行输入sudo apt-get install openocd
  2. 等待安装完成,在命令行输入openocd -v,出现下图所示的输出,说明安装成功Screenshot from 2017-11-07 22-49-31.png-18.4kB

三、安装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) );

  1. 第一个代码段

    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);
    }
    
  2. 第二个代码段

    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下,如下图所示:Screenshot from 2017-11-07 23-22-07.png-26kB
我用的是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编译环境搭建相关推荐

  1. VScode+gcc编译环境搭建

    VScode+gcc编译环境搭建 VScode下载 GCC安装 可能出现的问题 一些IDE集成开发环境占用内存大,体量大,比如Visual studio. Visual Studio Code (简称 ...

  2. 安装mips编译器和模拟器/mips GCC编译环境搭建

    目录 安装mips编译器和模拟器/mips编译环境搭建 Linux Windows 安装mips编译器和模拟器/mips编译环境搭建 安装mips上的GCC编译器. Linux 以下内容在Ubuntu ...

  3. 基于stm32f103R6 Keil uVision5编译环境搭建

    1.新建一个项目,如图,我建的工程名称为LED. 2.点击Target,再点击Options for target. 3.点击Device,这里我选择的是stm32f103R6(根据个人情况而定),也 ...

  4. Windows编译环境搭建(VS2010)

    引言:   本篇文章基于教程目的(由于windows和linux相关环境搭建篇幅过大,在博客中做这些讲解),主要描述Windows的发展历程和编译环境搭建(基于 Visual Studio 2010版 ...

  5. 【华为云技术分享】鲲鹏弹性云服务器GCC交叉编译环境搭建指南

    南七技校林书豪 1.简介 交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码.本指南主要内容为在非ARM架构服务器环境下搭建ARM的GCC编译环境,编译基于ARM架构的应用软件.交叉编译 ...

  6. Hi3516DV300编译环境搭建问题及解决

    Hi3516DV300编译环境搭建问题及解决 1.安装完工具链,提示找不到gcc 问题: bash: /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target ...

  7. FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译

    FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译 什么是Firmament? Firmament (FMT) 是一款基于模型设计 (Model-Based-Design, M ...

  8. Sky37E/D 基于Ubuntu21.04 编译环境搭建

    Sky37E/D 基于Ubuntu21.04 编译环境搭建 0. 下载安装Ubuntu 21.04 官网下载ubuntu21.04镜像(ubuntu-21.04-desktop-amd64.iso) ...

  9. RISC-V GNU编译环境搭建与运行实践

    RISC-V GNU编译环境搭建与运行实践 riscv-gnu-toolchain交叉编译工具链 riscv-gnu-toolchain下载 riscv-gnu-toolchain编译 RISC-V运 ...

最新文章

  1. eclipse安装Eclipse HTML Editor插件
  2. linux usb xhci ehci,ehci和xhci有什么区别
  3. 人工智能第六课:如何做研究
  4. Intel Hex概述
  5. delphi7 mysql控件_Delphi7连接MySql数据库-DBGrid控件显示数据
  6. 三次hermite插值matlab,三次hermite插值
  7. 宝峰uv5r怎么设置信道_宝峰5R说明书 及设置方法
  8. vue-router懒加载,用于多页面项目
  9. linux dot命令,linux绘图工具之dot
  10. unity 制作拼图游戏
  11. android时间轴折线图,echarts时间轴折线图
  12. USB PD 等多协议快充方案
  13. 51单片机仿真——中断系统(2)
  14. mysql rollup函数_Mysql,Oracle使用rollup函数完成行列统计
  15. 微赛智慧体育从微信入口提供SaaS服务,力求统一体育服务行业标准
  16. 教师资格中学计算机知识点,2017年教师资格证《信息技术》高频考点
  17. 《战争通论》详细分析世界十大兵书…
  18. 元宇宙:迈向新世界的脚步
  19. VS2019运行缺少MSVCP110D 和MSVCR110D的解决办法
  20. Python中文分词工具大合集:安装、使用和测试

热门文章

  1. 电视台的流媒体地址 mms
  2. Warning:Configuration 'compile' is obsolete and has been replaced with 'implementation'. It will be
  3. python 波形包络线_Python在信号与系统中的应用(1)——Hilbert变换,Hilbert在单边带包络检波的应用,FIR_LPF滤波器设计,还有逼格高高的FM(PM)调制...
  4. Go (Golang) 语言-Golang 定时器Timer和Ticker、time.AfterFunc、time.NewTicker()实例
  5. JavaScript对XML的一些DOM操作
  6. 谈谈30这个程序员迷茫的年龄
  7. 程序员批注《语言学教程》——第三章 从语素到短语
  8. Pytorch:手撕ResNet34实现汽车分类
  9. 导图解文 从梦想到财富(13)你的运气,为什么一直不好?
  10. 【自然语言处理】BERT-Whitening