vscode+gcc开发stm32环境搭建

文章转自:https://zhuanlan.zhihu.com/p/26292456

如有侵权,请联系删除

/*

操作系统:Ubuntu16.04

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

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

工程Github

*/

一、软件安装

VSCode

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

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

详情和下载请点击:Visual Studio Code - Code Editing. Redefined

贴一张VSCode的图

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

Arm-none-eabi-gcc

下载链接:GNU ARM Embedded Toolchain

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 -r gcc-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

出现如下信息说明成功

二、建立工程

就拿我的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 [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在这里:

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

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

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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值