600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > stm32 vscode 编译_vscode+gcc开发stm32环境搭建

stm32 vscode 编译_vscode+gcc开发stm32环境搭建

时间:2024-07-26 13:24:02

相关推荐

stm32 vscode 编译_vscode+gcc开发stm32环境搭建

/*

操作系统:Ubuntu16.04

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

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

*/

一、软件安装

l VSCode

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

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

贴一张VSCode的图

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

l Arm-none-eabi-gcc

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

下面说下Ubuntu下安装方法:

1>解压gcc-arm-none-eabi-5_4-q3-0926-linux.tar.bz2

$ tar -xvf gcc-arm-none-eabi-5_4-q3-0926-linux.tar.bz2

2>

将解压得得文件夹复制到/usr/bin

$ sudo cp -r gcc-arm-none-eabi-5_4-q3 /usr/bin

3>

添加环境变量

$ vim /etc/profile

添加:

export PATH=/usr/bin/gcc-arm-none-eabi-5_4-q3/bin:$PATH

4>

使环境变量生效

$ source /etc/profile

$ reboot

5>测试

$ arm-none-eabi-gcc -v

出现如下信息说明成功

二、建立工程

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

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

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

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

大体是这样的一个结构,大家可以根据自己的想法构建。 要注意的就是一下几点

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

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

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

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

其中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

其中一个预处理选项即CFLAGS

+= -DSTM32F767xx -DUSE_HAL_DRIVER -D选项表示预定义,为什么添加这两个?

很熟悉不是?其实这些最根源的是由于

然后再工程根目录新建一个顶层的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目录中

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

四、Linkerscript介绍

代码如下:

/* Generated by LinkerScriptGenerator [/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 = 0x0000;

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在这里:

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

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

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。