你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】使用eclipse搭建stm32f7xx环境的工程

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:50
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。

Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。

CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。

GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。

Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。

GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。

下面介绍下我自己的安装使用过程。

1、搭建基于eclipse的开发环境需要安装的软件包:

20200518114132563.png


202102240948015.png



按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。

20210224095516888.png


点14.15.5 LTS 下载

20210224095643120.png


双击安装

20210224095732314.png


安装完毕后用npm命令安装xpm:npm install --global xpm@latest

20210224095848166.png


xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。

20210224094649121.png



eclipse C/C++版本

 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)

20200518114203468.png



安装GNU ARM Eclipse插件。

用xpm工具安装:

arm或者riscv平台的工具链根据工程需要选择。

2021022410433298.png




打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。

20200518114221864.png



选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。

创建一个基于STM32f7x系列的空工程

20200518114234290.png


然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。

20200518114311876.png




2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法
①选择工程->roperties->C/C++ General->Indexer

②勾选Enable project specific settings

③勾选Index unused headers as C++ files

③勾选Index unused headers as C files


3、提示错误“③勾选Index unused headers as C++ files”
解决Eclipse semantic error

项目->properties->c/c++ General ->Code Analysis

(1) Potential Programming Problems

No return value

Unused return value

Assignment to iteself

(2)Coding Style 全部

(3)Syntax and semantic Errors全部

(4)Securirty Vulnerabilities 全部

以上内容全部勾去,如下图所示

20200518114341413.png




4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,
context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode

网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb

20200518114419879.png


编译错误可以解决,不知道会不会导致运行时出错。

另外选择用硬浮点的设置方法:

20200518114439766.png


20200518114447984.png



5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误
divsi3.S:330: Error: Thumb does not support conditional execution

看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。

6、HAL库中的接口未定义报错
Description    Resource Path Location Type

undefined reference to `HAL_UART_Init'    main.c    /mkwsf7/src/app   line 305   C/C++ Problem

创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:

2020051811450640.png




解决方法:

properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。

7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。

20200518114516419.png



8、出现一堆系统调用接口链接失败
类似这样的报错:
  1. gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-writer.o): In function `_write_r':

  2. writer.c:(.text._write_r+0x10): undefined reference to `_write'

  3. d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-closer.o): In function `_close_r':

  4. closer.c:(.text._close_r+0xc): undefined reference to `_close'

  5. d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-fstatr.o): In function `_fstat_r':

  6. fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'

  7. d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-isattyr.o): In function `_isatty_r':

  8. isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'

  9. d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-lseekr.o): In function `_lseek_r':

  10. lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'

  11. d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-readr.o): In function `_read_r':

  12. readr.c:(.text._read_r+0x10): undefined reference to `_read'
复制代码

在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。
独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。

默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。

除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。

9、编译出现如下错误:
In file included from ../system/include/cmsis/arm_nnfunctions.h:163,

                 from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:

../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type

  452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)

      | ^~~~~~~~~~~~~~~~~~~~

../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type

  467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)

      | ^~~~~~~~~~~~~~~~~~~~

../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type

  481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)

      | ^~~~~~~~~~~~~~~~~~~~

../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type

  494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)

大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。

10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory
   32 | #include "cmsis_device.h"

      |          ^~~~~~~~~~~~~~~~

compilation terminated.

system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed

make: *** [system/src/diag/trace_impl.o] Error 1

新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。


收藏 评论0 发布时间:2021-12-13 22:50

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版