/*

操作系统:Ubuntu16.04

硬件平台:原子Stm32F767+7‘RGB屏幕

其他操作系统与开发板搭建环境基本差不多,注意的地方我会提到的。

*/一、软件安装

l  VSCode

为什么用VSCode,相信大家都知道,没用过的同学下载下来用用。(推荐)

这个软件不管是什么系统都有,安装比较简单,不再赘述。

贴一张VSCode的图

1.png (288.37 KB, 下载次数: 5)

2017-4-11 14:39 上传

资源管理器+和vs studio一样的代码高亮+集成终端

l  Arm-none-eabi-gcc

Windows下安装傻瓜式的就不说了。

下面说下Ubuntu下安装方法:

1>解压gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2$ tar -xvf gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2

2>  将解压得得文件夹复制到/usr/bin$ sudo cp -rgcc-arm-none-eabi-5_4-2016q3 /usr/bin

3>  添加环境变量$ vim /etc/profile

添加:export PATH=/usr/bin/gcc-arm-none-eabi-5_4-2016q3/bin

PATH

4>  使环境变量生效$ source /etc/profile

$ reboot

5>测试$ arm-none-eabi-gcc -v

出现如下信息说明成功

2.png (185.81 KB, 下载次数: 1)

2017-4-11 14:40 上传

二、建立工程

就拿我的F7来说,我用的是最新的V1.6的HAL库

大体跟之前差不多,添加了些LL库的文件

3.png (187.96 KB, 下载次数: 0)

2017-4-11 14:41 上传

其实呢,这么多LL库的文件并不是所有都用得到,参考官方的模板例程,也就使用了3个如图:

4.png (264.91 KB, 下载次数: 0)

2017-4-11 14:42 上传

参考官方模板我们建立自己的工程结构

5.png (39.49 KB, 下载次数: 2)

2017-4-11 14:43 上传

6.png (41.84 KB, 下载次数: 2)

2017-4-11 14:43 上传

大体是这样的一个结构,大家可以根据自己的想法构建。

要注意的就是一下几点

启动文件:用GCC编译所需的启动文件跟再MDK编译的启动文件是不同的具体在Cube库的这里

7.png (39.48 KB, 下载次数: 2)

2017-4-11 14:44 上传

里面就是常用开发环境用的启动文件。

然后就是就是一些CMSIS标准所需的头文件

8.png (90.01 KB, 下载次数: 2)

2017-4-11 14:45 上传

根据自己板子的型号可以删除一些不必要的文件。

其中cmsis_gcc.h是用gcc编译所需的头文件。

工程目录到这一步就差不多了。三、编写Makfile

首先在HAL库文件下新建一个Makfile,为的就是将HAL库编译成一个静态的lib.

代码如下:

CC=arm-none-eabi-gcc

AR=arm-none-eabi-ar

###########################################

vpath %.c Src

CFLAGS   = -g -O2 -Wall

CFLAGS += -mthumb -mcpu=cortex-m7  -mfloat-abi=hard -mfpu=fpv5-d16

CFLAGS += -mlittle-endian  -mthumb-interwork

CFLAGS += -ffreestanding -nostdlib

CFLAGS += -IInc -I../INC -IInc/Legacy  -I../STM32F767

CFLAGS += -DSTM32F767xx -DUSE_HAL_DRIVER

SRCS = $(wildcard Src/*.c)

OBJS = $(SRCS:.c=.o)

.PHONY: libstm32f7.a

all: libstm32f7.a

%.o : %.c

$(CC)  $^ $(CFLAGS) -c -o $@

libstm32f7.a: $(OBJS)

$(AR)  -r $@ $(OBJS)

clean:

rm  -f $(OBJS) libstm32f7.a

这个Makfile相对简单,值得注意的是CFLAGS中的几个编译选项,device有关的可以查看图中的readme.txt

9.png (103.58 KB, 下载次数: 2)

2017-4-11 14:46 上传

其中一个预处理选项即CFLAGS +=-DSTM32F767xx -DUSE_HAL_DRIVER-D选项表示预定义,为什么添加这两个?

10.png (42.19 KB, 下载次数: 1)

2017-4-11 14:47 上传

很熟悉不是?其实这些最根源的是由于库文件本身的要求

11.png (86.47 KB, 下载次数: 1)

2017-4-11 14:47 上传

12.png (48.11 KB, 下载次数: 0)

2017-4-11 14:48 上传

然后再工程根目录新建一个顶层的Makefile。代码如下:PROJ_NAME = main

CC=arm-none-eabi-gcc

OBJCOPY=arm-none-eabi-objcopy

CFLAGS   = -g -O2 -Wall -TSTM32F767ZITx_FLASH.ld

CFLAGS += -mlittle-endian -mthumb  -mcpu=cortex-m7 -mthumb-interwork

CFLAGS += -mfloat-abi=hard -mfpu=fpv5-d16

CFLAGS += --specs=nosys.specs

LFLAGS += --specs=nosys.specs

SRCS = stm32f7xx_it.c system_stm32f7xx.c  stm32f7xx_hal_msp.c sys.c usart.c delay.c ltdc.c sdram.c tftlcd.c main.c

vpath %.c USER SYSTEM/usart SYSTEM/delay  SYSTEM/sys LCD STM32F767

vpath %.a HAL

ROOT=$(shell pwd)

CFLAGS += -ILCD -ISYSTEM/sys  -ISYSTEM/usart -ISYSTEM/delay -IUSER

CFLAGS += -IHAL/Inc -IHAL/Inc/Legacy  -IINC -ISTM32F767

CFLAGS += -DSTM32F767xx

SRCS +=  STM32F767/gcc/startup_stm32f767xx.s

OBJS = $(SRCS:.c=.o)

.PHONY: lib proj

all: lib proj

lib:

$(MAKE)  -C HAL

proj:       $(PROJ_NAME).elf

$(PROJ_NAME).elf: $(SRCS)

$(CC)  $(CFLAGS)  $^ -o $@ -LHAL -lstm32f7

$(OBJCOPY)  -O ihex -S $(PROJ_NAME).elf $(PROJ_NAME).hex

$(OBJCOPY)  -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin

clean:

$(MAKE)  -C HAL clean

rm  -f $(PROJ_NAME).elf

rm  -f $(PROJ_NAME).hex

rm  -f $(PROJ_NAME).bin

这里需要注意的几点是 -TSTM32F767ZITx_FLASH.ld 这是来加载linkerscript文件的。

后面会说到Linkerscript文件怎么写。

还有就是关于这个选项--specs=nosys.specs,它是关于使用重定向要用的选项具体还是看之前那个readme.txt,在Github中的GNU_DOC目录中

13.png (86.75 KB, 下载次数: 2)

2017-4-11 14:49 上传

到这儿Makefile差不多介绍完了,Makefile就是起统筹的作用。如图所示:

14.png (92.9 KB, 下载次数: 2)

2017-4-11 14:49 上传四、Linkerscript介绍

代码如下:

我也是刚接触这东西,还在学习中*  Target: STM32F767IG

*  The file is provided under the BSD license.

*/

ENTRY(Reset_Handler)

MEMORY

{

FLASH  (RX)    : ORIGIN = 0x08000000, LENGTH =  1M

SRAM  (RWX)    : ORIGIN = 0x20000000, LENGTH  = 512K

ITCMRAM  (RWX) : ORIGIN = 0x00000000, LENGTH = 16K

/*  --- begin generated external memories -- */

SDRAM  (RWX) : ORIGIN = 0xc0000000, LENGTH = 32M

/*  --- end generated external memories -- */

}

_estack = 0x20080000;

SECTIONS

{

.isr_vector  :

{

.  = ALIGN(4);

KEEP(*(.isr_vector))

.  = ALIGN(4);

}  > FLASH

.text  :

{

.  = ALIGN(4);

_stext  = .;

*(.text)

*(.text*)

*(.rodata)

*(.rodata*)

*(.glue_7)

*(.glue_7t)

KEEP(*(.init))

KEEP(*(.fini))

.  = ALIGN(4);

_etext  = .;

}  > FLASH

.ARM.extab  :

{

.  = ALIGN(4);

*(.ARM.extab)

*(.gnu.linkonce.armextab.*)

.  = ALIGN(4);

}  > FLASH

.exidx  :

{

.  = ALIGN(4);

PROVIDE(__exidx_start  = .);

*(.ARM.exidx*)

.  = ALIGN(4);

PROVIDE(__exidx_end  = .);

}  > FLASH

.ARM.attributes  :

{

*(.ARM.attributes)

}  > FLASH

.preinit_array  :

{

PROVIDE(__preinit_array_start  = .);

KEEP(*(.preinit_array*))

PROVIDE(__preinit_array_end  = .);

}  > FLASH

.init_array  :

{

PROVIDE(__init_array_start  = .);

KEEP(*(SORT(.init_array.*)))

KEEP(*(.init_array*))

PROVIDE(__init_array_end  = .);

}  > FLASH

.fini_array  :

{

PROVIDE(__fini_array_start  = .);

KEEP(*(.fini_array*))

KEEP(*(SORT(.fini_array.*)))

PROVIDE(__fini_array_end  = .);

}  > FLASH

.  = ALIGN(4);

_sidata  = .;

.data  : AT(_sidata)

{

.  = ALIGN(4);

_sdata  = .;

PROVIDE(__data_start__  = _sdata);

*(.data)

*(.data*)

.  = ALIGN(4);

_edata  = .;

PROVIDE(__data_end__  = _edata);

}  > SRAM

.bss  :

{

.  = ALIGN(4);

_sbss  = .;

PROVIDE(__bss_start__  = _sbss);

*(.bss)

*(.bss*)

*(COMMON)

.  = ALIGN(4);

_ebss  = .;

PROVIDE(__bss_end__  = _ebss);

}  > SRAM

/*  --- begin generated external memory sections -- */

.  = _sidata + SIZEOF(.data);

.  = ALIGN(4);

_sisdram_text  = .;

.sdram_text  : AT(_sisdram_text)

{

.  = ALIGN(4);

_ssdram_text  = .;

PROVIDE(__sdram_text_start  = _ssdram_text);

*(.sdram_text)

*(.sdram_text*)

.  = ALIGN(4);

_esdram_text  = .;

PROVIDE(__sdram_text_end  = _esdram_text);

}  > SDRAM

.  = _sisdram_text + SIZEOF(.sdram_text);

.  = ALIGN(4);

_sisdram_data  = .;

.sdram_data  : AT(_sisdram_data)

{

.  = ALIGN(4);

_ssdram_data  = .;

PROVIDE(__sdram_data_start  = _ssdram_data);

*(.sdram_data)

*(.sdram_data*)

.  = ALIGN(4);

_esdram_data  = .;

PROVIDE(__sdram_data_end  = _esdram_data);

}  > SDRAM

.sdram_bss  (NOLOAD) :

{

.  = ALIGN(4);

_ssdram_bss  = .;

PROVIDE(__sdram_bss_start  = _ssdram_bss);

*(.sdram_bss)

*(.sdram_bss*)

.  = ALIGN(4);

_esdram_bss  = .;

PROVIDE(__sdram_bss_end  = _esdram_bss);

}  > SDRAM

/*  --- end generated external memory sections -- */

PROVIDE(end  = .);

.heap  (NOLOAD) :

{

.  = ALIGN(4);

PROVIDE(__heap_start__  = .);

KEEP(*(.heap))

.  = ALIGN(4);

PROVIDE(__heap_end__  = .);

}  > SRAM

.reserved_for_stack  (NOLOAD) :

{

.  = ALIGN(4);

PROVIDE(__reserved_for_stack_start__  = .);

KEEP(*(.reserved_for_stack))

.  = ALIGN(4);

PROVIDE(__reserved_for_stack_end__  = .);

}  > SRAM

}

关于官方的linkerscript在这里:

15.png (39.31 KB, 下载次数: 1)

2017-4-11 14:51 上传

我这个Linker script只是在官方的基础添加对SDRAM的支持。

为什么呢,因为要使用RGB屏,

16.png (84.81 KB, 下载次数: 1)

2017-4-11 14:52 上传

一下子定义了这么大的数组,显然RAM是放不下的,只有放在SDRAM中了,图中被注释的部分是在MDK Keil的用法。

当然在ubuntu下装上st-link驱动或其他的再加上debug server进行调试也是没有问题的,我还没有尝试,先就写到这儿了。

整个过程遇到了很多问题没一一记录下来,权当一个粗糙的笔记,如有疑问请跟帖。

stm32 vscode 编译_vs code+gcc stm32编译环境搭建相关推荐

  1. STM32入门笔记(02):MDK Keil5 开发环境搭建及新建工程模板教程(SPL库函数版)

    目录 Keil5 开发环境搭建 芯片数据手册 Mec 多功能智能小车底盘开发与使用手册 Mec 主控原理图 Mec STM32F103VET6集成主控板资源分配 Mec OLED 显示内容 如何给 S ...

  2. java服务器要二次编译,ecology项目二次开发环境搭建

    ecology项目二次开发环境搭建 Submitted By Weaver 文档版本控制 文档简要信息: 文档主题(Title) ecology项目二次开发环境搭建 作者(Author) 审批者 (T ...

  3. 编译imx6 android,SAIL-IMX6Q ANDROID开发环境搭建与系统编译

    1Android开发环境搭建 1.1升级开发环境源 在终端执行命令:# apt-get update 如图所示: 图片19.png (36.7 KB, 下载次数: 9) 2019-7-8 09:50 ...

  4. STM32上手-STWingSKIT_BC28学习笔记(一)环境搭建和LED灯点亮

    嵌入式STM32上手学习笔记(一)LED灯点亮 STM32开发环境的搭建 1. 安装keil5 IDE 2. 下载STM32F1的支持包 3. 在Pack installer中找到F1支持包下载 4. ...

  5. C C++混合编译问题,gcc可以编译过,但是g++编译不过(restrict引起的问题)

    C C++混合编译问题 编译c c++混合的代码遇到的问题记录: 代码库中引入了string vetor等c++相关,链接的时候报错 如下: 对'std::allocator::allocator() ...

  6. vscode中文_VS Code 中文社区正式成立啦!VS Code Day 圆满落幕!

    背景简介 Visual Studio Code 是一款现代化轻量级代码编辑器,它免费.开源.跨平台.功能强大.本次 VS Code Day 是广大 VS Code 爱好者一起学习与交流的盛会,让我们对 ...

  7. vscode配置js环境_VS Code配置Python开发环境

    Visual Studio Code是一个跨平台轻量级的代码编辑工具,经过简单的配置可以轻松实现Python开发环境的搭建.VS Code拥有丰富的扩展应用,通过安装这些应用,使得Python的开发更 ...

  8. VSCode用Run code插件配置python环境(win10)

    文章目录 一.下载python编译器(一个就够了) 1.python官网 2.Anaconda 二.VSCode配置 1.插件 2.配置Run code (1)图形化配置 (2)settings.js ...

  9. 20秒 一键配置 VSCode (Visual Studio Code) C/C++开发环境

    用分享的方式成长,用有趣的眼光看世界. 欢迎来到22 26 25的博客 ! 热爱编码.算法.知识总结,不定期更新有趣.有料.有营养内容. 让我们共同学习,共同进步. 好文推荐:   [刷题笔记0]系列 ...

最新文章

  1. 心得丨一文告诉你想学数据分析该读什么书、从哪本读起
  2. Oracle已从2019年1月起收取Java费用
  3. 01----mockjs介绍
  4. C++和Python,JSON文件的读取和保存
  5. unity 是厘米还是米_乔丹19岁才1.75米,2年增高近20公分,这个长高方法你能坚持多久...
  6. Google浏览器调试前端代码
  7. 新华三的背景_智能联接,新华三在重新勾勒拓扑图
  8. [JAVA实现]微信公众号网页授权登录,java开发面试笔试题
  9. PHP常用的数组相关处理函数
  10. 读 《.Net 之美》解析.Net Remoting (应用程序域)-- Part.1
  11. python菜鸟教程 | 字典(Dictionary)
  12. 2016北航计算机学院研究生院,北京航空航天大学2016年计算机考研分数线_北京航空航天大学考研复试分数线...
  13. PG in not in系列方案比较
  14. Wagtail SearchBackend —— ElasticSearch7 https 连接问题
  15. 做一个文字跟随鼠标java_JavaScript实现文字跟随鼠标特效
  16. iOS自动打包,并上传蒲公英
  17. mysql网络数据库操作模块_15.mysql数据库操作与Paramiko模块
  18. iOS 取绝对值用法
  19. 教师资格证计算机科目有哪些内容,初中教师资格证考试科目及内容有哪些?
  20. 全球第二款3D打印药物!三迭纪产品获美国FDA新药临床试验批准

热门文章

  1. 马斯克谈买比特币:当法币实际利率为负时 只有“傻子”才不放眼他处
  2. 信安教程第二版-第13章网络安全漏洞防护技术原理与应用
  3. niosii spi 外部_NIOS II SPI详解 如何使用SPI方式传输
  4. mysql知识点汇总
  5. 2017-2018-1 20155234 《信息安全系统设计基础》第13周学习总结
  6. 【转载】特殊宏://{{AFX_MSG、//{{AFX_VIRTUAL、//{{AFX_MSG_MAP、//{{AFX_DATA_INIT
  7. Windows8Windows Phone 做一个图片效果
  8. 设计模式系列:小小总结
  9. Mr.J-- jQuery学习笔记(六)--attrprop方法
  10. BZOJ1861: [Zjoi2006]Book 书架