OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7954|回复: 2

vs code+gcc stm32编译环境搭建

[复制链接]

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2016-10-23
在线时间
31 小时
发表于 2017-4-11 14:55:34 | 显示全部楼层 |阅读模式
/*
操作系统:Ubuntu16.04
硬件平台:原子Stm32F767+7‘RGB屏幕
其他操作系统与开发板搭建环境基本差不多,注意的地方我会提到的。
工程Github
*/
一、软件安装
l  VSCode
为什么用VSCode,相信大家都知道,没用过的同学下载下来用用。(推荐)
这个软件不管是什么系统都有,安装比较简单,不再赘述。
详情和下载请点击:https://code.visualstudio.com/
       贴一张VSCode的图
1.png
资源管理器+和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/binPATH
  
4>  使环境变量生效
  
$ source /etc/profile
  
$ reboot
  
       5>测试
  
$ arm-none-eabi-gcc -v
  

出现如下信息说明成功
2.png

二、建立工程
   就拿我的F7来说,我用的是最新的V1.6的HAL库

   大体跟之前差不多,添加了些LL库的文件
3.png
其实呢,这么多LL库的文件并不是所有都用得到,参考官方的模板例程,也就使用了3个如图:
4.png

参考官方模板我们建立自己的工程结构
5.png
6.png
大体是这样的一个结构,大家可以根据自己的想法构建。
要注意的就是一下几点

启动文件:用GCC编译所需的启动文件跟再MDK编译的启动文件是不同的具体在Cube库的这里
7.png
里面就是常用开发环境用的启动文件。

然后就是就是一些CMSIS标准所需的头文件
8.png
根据自己板子的型号可以删除一些不必要的文件。
其中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
其中一个预处理选项即CFLAGS +=-DSTM32F767xx -DUSE_HAL_DRIVER -D选项表示预定义,为什么添加这两个?
10.png
很熟悉不是?其实这些最根源的是由于库文件本身的要求
11.png
12.png
然后再工程根目录新建一个顶层的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
到这儿Makefile差不多介绍完了,Makefile就是起统筹的作用。如图所示:
14.png
四、Linkerscript介绍
代码如下:

我也是刚接触这东西,还在学习中
  
/* Generated by LinkerScriptGenerator  [http://visualgdb.com/tools/LinkerScriptGenerator]
  
*  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
我这个Linker script只是在官方的基础添加对SDRAM的支持。

为什么呢,因为要使用RGB屏,
16.png
一下子定义了这么大的数组,显然RAM是放不下的,只有放在SDRAM中了,图中被注释的部分是在MDK Keil的用法。

当然在ubuntu下装上st-link驱动或其他的再加上debug server进行调试也是没有问题的,我还没有尝试,先就写到这儿了。
整个过程遇到了很多问题没一一记录下来,权当一个粗糙的笔记,如有疑问请跟帖。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2016-10-23
在线时间
31 小时
 楼主| 发表于 2017-4-11 14:59:59 | 显示全部楼层
表格的背景怎么默认是纯黑,我编辑的时候是灰度适中的啊,尴尬,https://github.com/near2see/stm3 ... tm32f767_vscode_gcc上有doc版的可以去下载。。。
回复 支持 反对

使用道具 举报

30

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2017-5-1
在线时间
63 小时
发表于 2017-10-21 19:35:34 | 显示全部楼层
这个编译环境和MDK5有什么区别?请老师明示!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 19:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表