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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:50
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。
( |& \2 p! w& p: R, _3 J" \. `0 `: x# |7 s8 f" x% @9 W* \
Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。
% W/ \4 r# \7 k; G4 J5 I9 G& f
* }; N; E1 ~0 rCDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。
4 U  j  M' O. M5 A: S' }
' J8 c' q: m+ @. @1 ]( JGNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。
; z& E/ O* y: x4 j7 d  b
1 `' d# _' V- q  tWindowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。0 |7 L" r2 u1 \3 Z/ r7 o

+ C2 W7 ~/ M; ]6 K" eGNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。/ w, }. _0 |9 \* v  s$ Q' [% V
2 T+ Q" [" e# `6 Y
下面介绍下我自己的安装使用过程。
6 O1 L1 k0 s  l5 a4 V7 W  l5 @! L- y& u
1、搭建基于eclipse的开发环境需要安装的软件包:
0 e6 f* Y# b6 q
" v' j/ v% v3 M7 M( Y1 J/ y- X/ P
20200518114132563.png
1 }! H) B: F1 O+ x: p; Z

5 e: d) `" S; q* u* _5 K
202102240948015.png

5 ^$ [( s$ o; k( P! s$ `3 k: H3 k$ ^8 A- Q% a. ~0 ~
, T. ~% ^+ ]) o3 o- B
按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。/ z- a: H6 |# f* |, x* ~

: k/ a8 B( I( L- G7 `" f
20210224095516888.png
7 H2 z; w) K8 {- J8 x
7 f( q* `/ Y/ r5 N
点14.15.5 LTS 下载4 `+ J1 l$ M6 c# ]# z  G
; R: Z/ i( i, o. o+ S  n1 w. ^
20210224095643120.png

- X6 f6 r5 d: [5 l; ]0 F
# M( c5 ~5 s# R. F$ h双击安装
; f5 h! `0 c- s5 q
/ z- c! W( \$ \# J0 x( l
20210224095732314.png
: l5 d5 h% k- s& H
' L# Q7 g( t6 ]# U* P9 B
安装完毕后用npm命令安装xpm:npm install --global xpm@latest
$ l' Q. }3 V$ L2 v' e! k: u8 i8 M( p* V5 j
20210224095848166.png

  c4 |7 A3 L+ N( S7 i3 M
5 I8 X# E7 r, c+ @& ?, R6 d8 sxpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。/ u' j. h' D& i- ~1 E% U

1 k5 K% }* |  q4 ?# ?% ^
20210224094649121.png
- _" F* a, A: e8 z5 K7 X2 G$ L7 _
* y1 Z7 Y- U) \

0 ^! x$ d/ n5 t9 yeclipse C/C++版本
4 y+ `- K/ F+ z; t1 L( r& K# u/ ?9 ^1 j; Z* B" A
 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)
$ B0 G# D: S7 i+ B, d" o8 ^
: q0 D: u2 x' m3 S1 w
20200518114203468.png
3 s& _+ L" i: F# U0 N2 H
3 S0 W5 M( A0 i) g, s0 h

, R; r& x- o2 `) x3 Y安装GNU ARM Eclipse插件。) }8 c, x$ d8 p& \1 @, N, x

/ L) q+ {4 u7 v; ?用xpm工具安装:9 h6 x0 M7 L* \: \( [

8 F4 t  K8 v. a& j; r$ K! earm或者riscv平台的工具链根据工程需要选择。
% b" J  ^9 ?4 P' }1 M
3 ?1 K6 S( k9 t" X# P3 U
2021022410433298.png

* w. j* G( @. @! ]) e& M* y
  p/ ~7 j7 Z  K  @# o$ e( q# J' E. I( f7 i) f6 l. T

! \( _7 g. }1 o7 H7 x+ d打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。
' Y6 T( ^8 L1 D0 Z3 \
5 T6 Q. D$ I: f9 _4 S- p/ ~2 G+ K
20200518114221864.png

: k1 h6 p% \' I6 `7 K
( O( J- l3 w, Y4 s0 v; ~  x2 m& ]' m+ u/ i: j+ }* q. @
选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。
  r) c  z( o' y+ {$ }! K' t
% S7 e7 H/ Z; b5 k+ P% k创建一个基于STM32f7x系列的空工程
2 w5 h: s  R0 y- }- }
. [+ A8 l# M' @! d# F
20200518114234290.png
% w- Z5 x4 {& u1 _, B
+ W/ p4 d5 R$ H% ?* w5 P* e$ \+ g
然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。
( S6 }0 Q: r* K* X, r- e
3 c. S8 N! O  P* W5 O; _9 W
20200518114311876.png

: @% L( |- m. u. R/ ~! Q; r, Z- H4 ?5 }1 p% b
( p5 U4 R/ Z$ s# }7 z9 F8 n

8 q& h4 Z7 V4 R* W+ w2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法
) D( I( e& R6 }" ~) p: P- [①选择工程->roperties->C/C++ General->Indexer/ a$ }: Y9 F% G( f

5 y' k/ |" N1 ]②勾选Enable project specific settings$ ]- c0 q7 u! B# \! [0 k

+ v9 M8 H, J# Y+ l6 w( a9 E③勾选Index unused headers as C++ files
& d. ]7 X( p* X. H9 ^
+ _% D& k$ ~' @  z③勾选Index unused headers as C files
- ]8 k" A8 z( q1 C2 Z. T' E* M* H% E; D& B  A0 O, c

, N, t) T7 r- D* U3、提示错误“③勾选Index unused headers as C++ files”' U$ J5 E$ k2 J# z3 R5 s4 g6 y; N; F
解决Eclipse semantic error  k' C* @2 [6 V/ h
2 Y6 D% m( j! i4 L
项目->properties->c/c++ General ->Code Analysis
$ M2 S/ _' W2 I' U$ j) x9 t1 O2 E& `8 x  S
(1) Potential Programming Problems
$ h3 {4 q9 u; ~, n% H9 o& f
* p+ A6 J7 p  l/ D% vNo return value
3 f- l( v, i' ^( Y$ J" ]$ p5 E* h3 G9 G% d* ?3 s  I
Unused return value
, }0 P( {6 ^% m0 r4 y2 |- z5 l
  y& ^9 y! u5 ?" R+ I9 r  p6 PAssignment to iteself8 [2 y. J* Y8 s

. T: O! w2 y8 [" i6 k: K8 c7 |$ `4 _(2)Coding Style 全部/ K; `; J, \& w! p* V" r

# U' \% U& G- s* d, F* a(3)Syntax and semantic Errors全部
% l) ~6 b% `% a. C1 N0 T& g# P8 R! d! O0 U: {, s4 A) E
(4)Securirty Vulnerabilities 全部0 w. L  r# Y# \6 Q* V/ q2 d! V

2 b) j) z& E; ~' v, o% o以上内容全部勾去,如下图所示
7 _0 n; w! u# |  n7 J1 k2 E* B3 G, R, E& {6 F
20200518114341413.png

" h5 [1 [# C) c' b0 D. j6 l% J' W
$ T) K% x0 N/ m7 r: D# L& R- Y) b' Q, r* r/ k  C0 H# b

1 x* r5 o/ ?0 H, b1 C) G4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,
. Q8 m' c" f2 K5 D: v' p3 ccontext_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode
# z" a$ [2 q! J  A1 j; B' O2 k; k% k
网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb
/ Z' Y4 Y+ d8 A# G; D/ y1 |, t5 D1 P# \, e- X
20200518114419879.png

. c1 r# i9 c& P& _: A2 _7 D  u! B1 A
编译错误可以解决,不知道会不会导致运行时出错。
' ^4 r" A5 U4 B9 F- [) r- N8 U+ i9 r
另外选择用硬浮点的设置方法:
( M9 H# l1 a2 N4 C
9 }. Y4 E% S9 E" @# j
20200518114439766.png
& [0 n2 v0 }' t% q3 J3 L$ W
+ Z3 u5 e  |4 F7 e6 h5 g
20200518114447984.png

1 a* |  @  e" h8 X
, l# \$ c. }+ k  @/ p) d  w
7 S6 s* F" n5 j, V' b# M5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误2 c. W( }' m4 ^& N5 k/ ]
divsi3.S:330: Error: Thumb does not support conditional execution
1 V* r8 M$ R* P; `
看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。1 f; q- R# u+ o; Z0 H

9 J! T* p7 `. R# I  W3 c4 p6、HAL库中的接口未定义报错  w5 D3 g% R* x" a; f5 f. w! |
Description    Resource Path Location Type- m' d+ L; |( A0 W

8 j9 o+ M( W# y7 b! B+ s- j% }undefined reference to `HAL_UART_Init'    main.c    /mkwsf7/src/app   line 305   C/C++ Problem
9 o( w1 B! X- I" k) y6 c7 w% N4 L
创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:' ?9 J! |- y+ [& ]% ^/ J3 g3 u
) n3 c1 _0 L1 n' J
2020051811450640.png

# S0 ^+ L$ f, I1 g0 H
8 Z: c5 P( ~9 H& x: a) W3 i9 j* b+ U( w# ?3 ]) i' e$ h2 Z0 R

3 {, L! z1 t. k6 V( E# o4 c% e# K解决方法:
  ?  H, q: ]% f7 A2 T5 {4 n# H" g8 ^/ S5 K$ C% q& l- M8 u" }5 ?
properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。$ @4 _' v  [% U8 n

' r! D8 g; \$ G( w7 F7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。
5 N- Z; J1 ]2 y) C
, d% a9 b. [$ s- J, |
20200518114516419.png
; G$ t; @$ i/ E' ^+ `* b% m

9 O4 g4 _2 x4 z3 Y: G  {
5 O/ _( J5 N$ n/ h1 t8、出现一堆系统调用接口链接失败. r, V1 y( B9 D8 Y9 {- a% n
类似这样的报错:
, ?- {! g0 ?4 |- J* y
  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':
    - Y/ r# f' H1 k) `
  2. " s5 p: ~9 _/ m' p0 P
  3. writer.c:(.text._write_r+0x10): undefined reference to `_write'
    6 L+ q8 x! R3 c% X( @7 i

  4. : R3 A% ]! e& z: Z4 @2 e
  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':
    & [4 V% D. u6 n! l8 X0 R
  6. & A' x+ J1 p% g  Q
  7. closer.c:(.text._close_r+0xc): undefined reference to `_close'
    6 D' a4 x" F3 q3 R+ J
  8. 6 L! r5 F. R0 `) U! _
  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':, K8 m8 B- N/ s& o* J+ ?5 m
  10. 2 i2 A. S) o- D
  11. fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'% E- ?" \+ c4 s' N
  12. / }% O0 d6 `/ t. G2 q5 J
  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':- x) o5 v; r8 ^+ y- C

  14. $ a# P/ \! n/ ]. [- c' l
  15. isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'3 q& p7 O6 t  B. D
  16. # p$ N( n" i) c- O
  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':/ H. x( [/ _: V' b

  18. 4 e; c8 P' x5 R
  19. lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'* A) e* y# Z6 \9 y1 R0 ]& @

  20. $ Q& X. O/ s1 F, E5 d' z. X
  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':: L' t4 E' ~5 x! H1 d8 D  s+ c  K
  22. $ \: z- F. v# y+ ^' {) S# d$ a
  23. readr.c:(.text._read_r+0x10): undefined reference to `_read'0 u/ z( B% _% r
复制代码

1 B8 G: f8 `3 F# G# `& A3 O) f在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。
# c0 O% B) g' z6 Q( ~+ j独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。0 t2 i1 Z$ \/ e: O! j1 R1 g, Z8 p
* e) }# {; \1 G3 B2 s
默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。
' ^; }/ ~/ n& j$ W/ F0 Q' P
- [. U4 W  N; ~# c  A+ o除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。: h' e* N( [# f, @" Z- r0 x

: K; C! ~' P$ W' U9、编译出现如下错误:2 S& k1 q" G4 e/ m$ i
In file included from ../system/include/cmsis/arm_nnfunctions.h:163,0 ^! p! n1 ^- \
2 p. x3 n2 c- a3 m& r0 y
                 from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:9 L* A2 b  S4 \; F* b5 [- {5 a
2 h3 ?3 k! {3 Z* w& Z
../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type
! M# _$ k. w3 @- g+ [
5 H: h; N4 n" t! N  452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)( v9 X; \) C6 n/ K/ J

8 J; G7 X3 {7 L- `      | ^~~~~~~~~~~~~~~~~~~~& ]3 \: d/ R( k+ Q7 |* A( |

7 o, }+ ]$ a2 h* J../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type, g. N% \% ~9 v9 i% }
% A' |, E8 E) A! ]! C, w, x
  467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)
8 e9 C! l+ B, c$ r! d$ x+ B6 Y4 |; L
      | ^~~~~~~~~~~~~~~~~~~~* j+ l$ J" I' W) a
- ~8 `8 k% Y, B, A- u9 _7 s
../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type
# H: k: p- ^- w( O4 g. X/ ]  P
+ o$ L/ @. E% N0 n2 \  481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)
) D! Q, r9 d% D! {( K
! Z- Z5 a3 B- k. u0 D% V      | ^~~~~~~~~~~~~~~~~~~~
% N" e$ u+ V  R5 o" e! ^" @0 h  X; c+ k: z* h* ^* }
../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type" A4 w3 L8 k* x: Y! v
" g/ n0 W( H9 A  `/ H* b
  494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7). M0 B; A. W2 d& W/ u) H/ A% U

( ]7 t: u0 y  w: n大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。, ?+ K' S" }5 y2 S

6 m! B4 E2 {& R- l: q7 W+ M10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory
7 G/ V& I. h4 A# o# y4 c5 l   32 | #include "cmsis_device.h"+ k% p$ J; g- O$ S3 E
* _! O5 y# C; V' o* S7 V3 }1 b
      |          ^~~~~~~~~~~~~~~~1 X7 M" n& h; ~5 ?

9 c& u; g! r& T: w/ t: w3 ~compilation terminated.& _$ e/ p- A: ?
5 T/ S6 i7 g4 {5 U5 j* ]* q1 W( A
system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed2 z. ]. S+ Y9 w9 j1 V  N
  c+ L5 t, e6 A+ K& l: W) m2 j& r
make: *** [system/src/diag/trace_impl.o] Error 1- u3 a# A+ Y8 y9 e, L& `* s
2 P3 _$ V$ T$ E
新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。/ e8 C8 P; ^. D2 F/ e$ A- Z5 o1 d+ R
) c5 {' X  Y& `
. o5 l: M* K+ l8 a) l8 p' i. T
收藏 评论0 发布时间:2021-12-13 22:50

举报

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