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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:50
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。
  K2 Z# A# W8 C# Z& i
" D1 `$ l2 r  _1 W& EEclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。
6 P, [! R6 g5 h* Y# L
; f+ i% @- V& Q- N7 g. _CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。& i8 M: N2 R% J

' U2 J9 r4 j2 {9 U3 ]" y1 d6 _" zGNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。* |5 {) f7 ~1 q$ J
. L; S7 }2 X4 I$ e
Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。8 f; W4 l5 @/ k8 ~. W
) U" M4 Z% A3 t8 o! J2 m  A8 I
GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。
- d6 B8 o# M4 M: D& Y. }' O  \, Y/ P- J$ J/ c8 h
下面介绍下我自己的安装使用过程。4 T- w6 d0 H/ x5 ?3 N9 j5 W. H4 |

1 }5 z# P6 Y8 E0 Z& g$ S# r1、搭建基于eclipse的开发环境需要安装的软件包:# L, ?& x9 H! u4 @6 E

. @( b, C9 @/ c2 p5 Y
20200518114132563.png
7 t/ ^  ^$ Q: [
/ X" L9 M5 c, j
202102240948015.png

6 ?7 ~* x: C( Z9 L
4 `; c9 Y5 I" f; o  U: {
" p! g# f6 ^% P) O- e/ c/ V/ |# ?按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。
3 P! W- N/ p$ L) I4 U5 h7 [. Q/ S" o
7 K' B( B9 p. @& a  y: F' L
20210224095516888.png

* L& ]3 k! s7 d7 z( y2 h+ o) o: T+ i) r4 \
点14.15.5 LTS 下载/ L" F" b: V0 S

  t# t, s9 |1 L5 @, p' d
20210224095643120.png
! H9 r2 }6 d& E2 u
- W5 z( Q) n% U1 Y* S% ^& ?
双击安装
; e8 [1 H0 L. {' z6 u8 g% r' e, p4 ?& Y* i3 X- V: @& _. i' `) |
20210224095732314.png

+ w, D1 g9 L/ w
4 X) M; \$ S8 p. X安装完毕后用npm命令安装xpm:npm install --global xpm@latest
! z8 K: q2 j3 i* A) @' k$ U( T6 C# q' M2 P$ [* ^9 R2 F
20210224095848166.png

- P" g) e  B' q$ F, w  D$ x0 \
: q2 R; Y4 ~# k0 wxpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。
6 |% }' s8 m0 n4 `6 @% _; T$ ?# O+ @1 i1 C- V( |
20210224094649121.png

- O0 Q$ P+ d0 @- A" z: {, y0 B1 [) |3 A4 q8 k3 z8 H
8 G* W- J( S+ H$ K. p, a
eclipse C/C++版本
: u% j2 s8 g* [- A9 V- G! @
% U6 x8 m$ f: l! b" B& b 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)
3 q. r) d/ ?2 Z4 Y0 u. m, Q4 q8 y( w. Z- W# V, x# y% F& i
20200518114203468.png
$ S6 t$ ~  z" E7 |
! E) F, A; w$ u3 u
" X' t, e+ T. u' t3 ^
安装GNU ARM Eclipse插件。
& w5 a" s# ]- ?& W- I; z+ M, h  }8 o2 P6 i* R
用xpm工具安装:
, X5 D9 G# d+ O, @  a* a. C0 y! E+ h; m$ p7 q% A1 L& N. j
arm或者riscv平台的工具链根据工程需要选择。
/ F+ I$ H( W. H% u7 X) `7 u
1 N% i0 g. n- N. x6 j* V; d; S
2021022410433298.png
! h$ q* I# n2 `

6 u& o' |+ f) e( ~0 t+ k, }. N2 v, P  A$ l% {
) y$ ^/ {9 j) L0 ~) T9 O* E+ B
打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。) U4 Z5 X7 y3 C$ ?
* O4 i+ V0 S5 c( l& C
20200518114221864.png
9 s) E( ?9 z5 |9 q" I

; d) `/ s3 G* K2 U  Z7 p
% E7 H/ V  |8 w选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。
  _+ h, a) P6 G  H9 D
! v/ `$ A: O0 U  \% F5 O9 @( I创建一个基于STM32f7x系列的空工程
& Q7 e0 N0 W. d9 S8 e0 {4 ?5 L& G: F* }1 N$ x, y
20200518114234290.png

( s0 d  E% d! \8 s$ {6 H% u, D2 P! o+ f# Y( O: a
然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。! A) x. z* J% S/ e, U7 h
  f; L. ?1 t% n  s
20200518114311876.png
# Z, ^, B' B! ]  G0 b
! L3 E1 C+ [" R1 W

  m) ]1 P, f5 K1 i  \$ m" S2 v; D' W( c. \. J6 K
2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法
4 ^) `4 K# i0 q- Q1 D①选择工程->roperties->C/C++ General->Indexer# Z9 V, ]- q# V3 d1 {# _  A

! ]7 _, }, K( k, {4 e( ]( k②勾选Enable project specific settings
" ~. _$ [( R/ M0 R$ u+ M8 p. d7 F& r9 c& d3 T5 D! O
③勾选Index unused headers as C++ files
( m; m9 ~+ ]# O) \* p: }9 D, E. d7 D8 W
③勾选Index unused headers as C files
2 [: J+ X  L4 J# C' d) R
9 X: ]2 `# C- t$ O4 Y- C, y5 c# m0 r7 A
3、提示错误“③勾选Index unused headers as C++ files”+ t+ b2 g* Q  z$ y8 g
解决Eclipse semantic error
7 e: F: E  S" C$ p) f. j& G- v0 U+ i. h
6 c1 `* @5 M& l! z/ d项目->properties->c/c++ General ->Code Analysis9 u" c7 G( P: B$ S; C% q1 D* s

. `8 z$ x5 u2 u2 D(1) Potential Programming Problems
7 X' w% o$ r" g- A: n2 k! @
! X7 A6 |, n9 V& e; ~' TNo return value
. L/ L# B" q; T: \7 T& }- c. h$ K: j0 z' H- M
Unused return value
9 j  f+ z3 K9 l: ~, K+ m) j5 \
6 F- f: f2 Z) L/ _) aAssignment to iteself
3 h" {+ u6 J8 N3 L; Q& D" ?# ~7 H3 ]5 j8 u7 A2 ^  i" p! T" @% G
(2)Coding Style 全部
" d, w  x% ?. q1 a; Z$ @1 U3 C; i6 h) h7 w) Q
(3)Syntax and semantic Errors全部6 @3 ~) c$ ~4 C2 s$ ^% Z

$ z: y" k) m1 c- Q( A. U3 {(4)Securirty Vulnerabilities 全部) z. _% q- \5 M$ x
) I+ ~  q9 t- p4 t0 D; y
以上内容全部勾去,如下图所示
, U8 i; h( I0 d1 g+ F# o
0 t! y* d$ p! H1 ~1 E  _7 \# X% v
20200518114341413.png

2 D! C7 U+ m% ?9 G( t$ K8 v, V+ @8 i) v4 f7 r7 l5 X0 _, I( r
* f# u& v/ W; I5 b
) a2 c8 p- E5 I6 w6 }" K( i! o
4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,, T! ?* q5 M# `8 D6 R  R3 Z
context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode

4 l0 D- W  }. [3 @7 s5 q网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb/ _! b0 L1 C* s. O5 c: B9 A
3 I( ~7 v8 N7 [% X+ w7 S
20200518114419879.png

5 Q" s6 }+ \! r
8 B; m4 q. l) }- ^# x4 r编译错误可以解决,不知道会不会导致运行时出错。+ t6 u6 _3 o& t0 ~+ V! F  t

9 V3 V9 K. u5 ?0 \. G另外选择用硬浮点的设置方法:: f/ K* |6 {: R' S

* m0 [9 l8 c9 |, |" W4 c
20200518114439766.png

3 Q4 Y9 U. v) N0 W# I
8 x4 z5 f8 @% y$ O3 S
20200518114447984.png

5 c5 w+ H# x! q: k  i) d# F# N; k5 \; u, r
# U0 w9 c8 x: `  U5 ^8 D
5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误8 U% y. `5 @/ J" F
divsi3.S:330: Error: Thumb does not support conditional execution
1 L% b) p! V2 ]: z/ a+ Y2 l/ I# h
看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。
0 L# K& @$ ~5 _: d5 [- c4 ?4 D
+ I1 S2 D$ L4 R$ m- {9 Y6 u6、HAL库中的接口未定义报错
8 b- `+ b' C8 e$ X! q% \& t! V( XDescription    Resource Path Location Type3 K5 v: _, h+ z; k2 t$ c

( G. K6 B5 C0 ^; Z6 f4 z' sundefined reference to `HAL_UART_Init'    main.c    /mkwsf7/src/app   line 305   C/C++ Problem2 [/ e( b# T6 Q2 k+ A$ q$ }/ u" M
. T: m0 X$ e( |9 Q) |9 M
创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:
2 \" A! O: b3 r* D( B; Y+ m  o9 n" |" d! l1 N" Y$ y- g7 ~7 Y
2020051811450640.png
' {" L/ o9 V( U. P, r' O+ o
8 N8 z6 M; @* |$ \
4 D7 N0 {$ e2 w% C, _2 c  a

3 Y5 l; V9 P/ i, q$ X1 z解决方法:* ~! t% X' [* z- O6 J

5 P1 i3 r# }6 ?8 E& h- `properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。" h% C1 p4 `" v4 e: ~. C7 W+ P( l
) a" Y/ V2 B/ I: ^9 d
7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。
; g( h5 x# P+ P: t8 I0 E' p
' `0 E- G) G8 K
20200518114516419.png
3 r, c- N! L7 E& d  }+ u
6 g1 a9 g; S' D: y2 f
* i& m, ~/ N4 Y! r- y) n, N8 D
8、出现一堆系统调用接口链接失败
/ U& {1 K. l( c9 f类似这样的报错:8 s* A2 f$ l( e* b, }
  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':3 s% f. E- f% F! v

  2. & V9 q! n8 w) S  X4 t
  3. writer.c:(.text._write_r+0x10): undefined reference to `_write'0 ^4 j! V2 V4 o% X  O3 P3 D
  4. 0 N, Q2 b! g. M, P& f8 ~) O
  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-closer.o): In function `_close_r':& y% X/ p, L. |/ f* @

  6. , S7 U7 E2 Q* s& _1 H
  7. closer.c:(.text._close_r+0xc): undefined reference to `_close'
    4 {1 \5 U& _3 V+ j

  8. 1 m$ ^1 l6 U9 w! l
  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-fstatr.o): In function `_fstat_r':
    / o' X. |7 ^2 L

  10. & |, f, ~5 X; D  i; x2 X
  11. fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat') E5 I; C. n3 b6 Q- I, v
  12. ; c3 N2 R& g! G. C* u' U
  13. 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':$ G2 U/ }5 f% P0 F, y2 O3 i/ K4 _% l
  14. ; w- J; x* _& S- [- p9 ?# C' O
  15. isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'% ]9 @7 ?& n& y& I; c: a3 R. O

  16. 0 N( ?4 H- r( o! `) p9 S
  17. 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':
    3 l* z1 x( \4 i5 \: g9 u! H

  18. ( w) F( ?( ^2 D3 W1 Y
  19. lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'( V- E4 Q, n; _( N4 @
  20. 4 u' i; S. ~- Y, a- N8 y0 ]3 n! Z" |5 ]
  21. 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':1 M& q* l' C6 c3 A

  22. ; \# H) M) T8 j0 b$ j7 U6 d* T6 h
  23. readr.c:(.text._read_r+0x10): undefined reference to `_read'# L* g3 a; Q( e
复制代码
, \% }7 j4 B+ |0 }+ l7 u
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。0 A: C" d9 X# Q6 ~
独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。5 ?. x; w1 T: K9 |+ M: |4 P
3 z6 l9 C# F; K1 s8 B, e$ r8 r
默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。" M# K* A/ d8 m
! ~0 f+ u& u- P5 D: f
除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。
& }% _1 I" j# _; i  f  D' W+ x! }7 G. x5 H
9、编译出现如下错误:  o, A8 j# @. n) V, S7 [* j3 f
In file included from ../system/include/cmsis/arm_nnfunctions.h:163,' e5 R4 r5 z5 F! ~; \2 C9 z" g

5 B2 L0 Y$ X+ b. ]                 from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:  |7 |# D' r7 e9 e; o

  S  d8 Z+ C( u! W3 ^../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type
: c. t+ Z7 ^2 b' ^4 W* Z* j5 y* _) B! F, H6 W& l1 C
  452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)
; H  W& Z% [: t4 z+ V% @% V% ]6 q8 U3 C3 Q0 C  y
      | ^~~~~~~~~~~~~~~~~~~~
1 X' G4 A1 F) A/ \) m; [) a% t& t- e
../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type
6 Z& a2 k; j' c2 O0 g
6 t, j! x7 p0 {! _7 V, F* `/ l  467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)/ v7 Q) t3 d+ n# ?2 V

: t( c" l* p( O1 a7 G      | ^~~~~~~~~~~~~~~~~~~~
5 \) P) ]( c3 W9 z- [7 i$ j1 ~* ~* J
../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type( v. a0 N* I4 d9 A: G: u0 d  S* O8 F' u
( j5 n9 z" F% @) ?; t
  481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)
. \/ {$ m) E! p2 W* T7 J- ]( B1 m+ p/ d% Y$ e# s  @8 w& d* i
      | ^~~~~~~~~~~~~~~~~~~~
- a8 |" B' q, {( T: U3 _
9 n" U( d" K4 c. c, z1 t0 L../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type
( a* g3 D5 N. T) w. y4 C5 E0 p( H9 I# e4 ~  m
  494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)$ C: m* X% l- L4 m  e

4 V4 ~& z- x1 b9 E3 a  c大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。
5 h' S! T0 s% }' q' c
+ O, f5 m0 c" a1 T. c10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory
1 w  a7 Y2 P1 d3 B; }4 B   32 | #include "cmsis_device.h"
+ \+ e& u5 T$ s6 {8 ?5 D4 {! K
+ M  v! A0 H  A      |          ^~~~~~~~~~~~~~~~8 F$ k. g7 {; y3 F% A
6 x& R" w; y& Q: }$ V9 Q
compilation terminated.
2 z9 h0 f# \$ c/ a# a! R# I; z' B/ b' M: L. s* p. i( y
system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed1 X0 W9 b/ O7 Q- B/ U. }& C8 |
; ]2 F) p& E) {6 A1 S1 Q( J
make: *** [system/src/diag/trace_impl.o] Error 1" a; \# K7 L0 F: x! l: }

: q6 ]  z. H0 u新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。( w/ N8 C  R, o% N$ n

# F! v* A+ f+ L/ o; Q( b  `8 u( C6 w' o4 q
收藏 评论0 发布时间:2021-12-13 22:50

举报

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