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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:50
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。
$ B# F; O' H' I: {0 _6 Q! `: e3 v1 N( |- D" z
Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。" o4 U2 E' I  ^+ {. D* w$ D$ w  s

0 O* V( O: ?- F0 P8 o% ZCDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。
/ _3 M; h0 ^. c6 _
+ C# A5 K5 n( i' o& uGNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。: Q, }$ `% S( r& _1 R6 D! U$ v

3 r/ `+ F* F) R' P. G5 w  U" f% S' qWindowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。2 W2 S# k+ a- y3 _  d

8 K" ~' X. `0 P  S, MGNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。5 _- }$ c" ~) E% C; c

7 t' {7 n% m' F! f' c6 t( ^下面介绍下我自己的安装使用过程。4 U. j0 ]# ~6 ^2 v
; c5 Z7 b$ S. e7 t  q% a% j, g5 g
1、搭建基于eclipse的开发环境需要安装的软件包:0 F: Z$ O3 b6 x6 c; X6 g% e; Q
+ X& |1 [: V! [+ a8 [; L5 G& d
20200518114132563.png

9 m5 i4 T& G, t. x" y* b' [
. p( K, q8 e. z' l$ k
202102240948015.png

4 D! I0 q8 o0 g6 w' R1 C5 w0 a
  V7 T0 R4 a/ H/ G) k5 K5 j& G0 X, b* V1 s1 {
按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。/ F# V1 i! ?; I7 h
, T- P, @. ~# [  }
20210224095516888.png

, z8 z7 z7 v: F; H: z5 I
- p2 b# C& n( u! d点14.15.5 LTS 下载
) q" W& G) a4 w* j/ |; r! L' E1 |# L
20210224095643120.png

7 w3 V  d9 I" W+ M, s6 q$ S% h, U0 c% g
双击安装/ F4 x7 t+ n3 h' s% l9 U% n

$ ~1 @8 S. Z5 S) u) B9 k
20210224095732314.png

4 N' ~! `% f9 X1 x5 a8 D+ [& K% L1 k. F: A* D
安装完毕后用npm命令安装xpm:npm install --global xpm@latest
' s8 Z- W2 k- J) \4 G' \; t' p4 ^( u5 A4 W  U2 |/ P2 L7 w; B
20210224095848166.png
! Z$ `: P  e6 D& _3 z& Z

. L# ?0 L2 x  u, z1 v8 E- lxpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。  I5 `) O& e3 w9 y9 e2 R+ q& u, x
$ |3 r. d& }1 i& }
20210224094649121.png

0 ?9 r4 _: N  D7 B
* P/ G7 V  g. s# k6 C- p/ W- }& A
; s, {3 s# ~% Q3 r6 Keclipse C/C++版本
' l( w2 j: q/ n1 P( q4 `! [- g8 T: a0 C; G" y+ m
 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)
" P$ x, j. T  D
; S: u3 W) s! u' [
20200518114203468.png

" }) l5 f8 r  Q. h6 k8 _
/ m0 w* \+ W! Y! g6 T5 ?6 Q9 {1 e
$ m/ T1 `2 N0 U% [- P安装GNU ARM Eclipse插件。
# F/ K! K! |. [0 u4 j6 X) D+ r; e- Z' w; S7 I7 I
用xpm工具安装:) \; O3 x4 W+ f* u* y3 N2 a
3 l" D% E  ^! s) O  [4 x" h2 @
arm或者riscv平台的工具链根据工程需要选择。0 a( K$ O+ ?4 q$ G& U$ x) b+ k
3 Z$ S2 v& i/ a+ p. R
2021022410433298.png
) w. S: p0 ~4 @* x! ^" M5 r7 I) }, T
& w" E+ c6 ]( M  ]' m2 r

! b; t) E9 J% t1 `$ J1 W9 _) ]# ]. v7 S9 Q6 X# H- d6 `
打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。
. e6 u# H5 u1 B- Y  {" ^* x$ E" f2 P6 o$ A8 H
20200518114221864.png
. y- d  m2 ~0 y* E9 a+ V+ l
& ~9 m9 P, T* N" X
% U; N$ \7 m. e- Q4 M% b. e
选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。) s$ o& v4 ~) Y" T( e
' n# [" ~( v% j+ E. y
创建一个基于STM32f7x系列的空工程* k+ l" n  J/ n& H
2 H, p# f; m& y, B: j  x& j
20200518114234290.png

; q/ n+ I- z% l6 b! `0 b
4 Y3 F, n1 ^2 L) }然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。1 k. ^/ C6 e2 [2 `0 ~- I- J
7 e2 w' H, d- [) A1 B& @
20200518114311876.png
+ q3 ~& U6 S) [. s) e$ C' o# @" P1 g

0 I% ^3 E. [; V% G8 W' r" ?
1 ]# n9 m" X) S4 @% E# @- \
6 I7 }$ ]& n) e6 g$ X2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法: y$ e- O4 r% v9 r7 f% A) A
①选择工程->roperties->C/C++ General->Indexer) N  ^' H! O. t$ h2 E
. ~2 V$ n/ x7 v9 x- W8 k/ z- J7 \
②勾选Enable project specific settings
; A& P5 x! Y' @" M) K& M$ V2 O3 l# v* A% Q+ n6 X
③勾选Index unused headers as C++ files( t- F5 u& `9 C) ?3 N% [: {
* B- B  ?# a3 l( z( y6 s
③勾选Index unused headers as C files3 A4 X" K5 _  A& H

' s  `- {' `9 B& w+ G/ J2 G3 X, M- M& o  m" U* X# F6 G
3、提示错误“③勾选Index unused headers as C++ files”
- q8 B6 {1 t( q& y& p, B1 r0 e解决Eclipse semantic error
* ?& h$ T0 J7 a( W$ C5 w! a8 r) P& L( M- q
项目->properties->c/c++ General ->Code Analysis, g3 @; K! i3 S
4 ~9 k# k: e  Y1 p; Y( B3 Y: A
(1) Potential Programming Problems
$ W% @7 K% |. L( `* F9 r+ r) \% H( ?+ w5 N& v$ D
No return value
9 I; p# p) f: |$ Z0 [+ u8 E
6 r: [: X- t9 lUnused return value! x$ J' u) K) ]  l: N
5 K' a0 P5 A0 i$ }# R$ L% O0 M
Assignment to iteself+ K% l7 N0 a" k" B- ?" p8 G, H4 ^3 z
% E  {0 R: D+ d$ W# Z7 d- u
(2)Coding Style 全部
+ y. ?  c* X* Z! T' F& ]  l
# w2 |( t+ d1 Y/ F) M" Q(3)Syntax and semantic Errors全部9 P! n9 @8 u) J9 t& P, q
" z) [4 J+ ~8 Z- A% D6 N. ~
(4)Securirty Vulnerabilities 全部
3 [% e7 v" Z: f; q
/ C: i' c$ E- R  ^' u! C# d以上内容全部勾去,如下图所示- j% D( Z- F' I$ }0 ]' Q5 S

- h* g# B6 b- ?/ [$ a9 V. V
20200518114341413.png

  m: @# `$ t' a/ p# u: p# a/ Y' H5 ?! J4 Q! E/ S

: @5 B8 Y) J3 n3 D- I  s/ h
. W2 E- ^" c$ O  b& W) q: n4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,* p0 W; P1 S+ O9 A9 o; E
context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode
" {0 b3 S: V. V' Z* l" O- g
网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb) ^7 G& s! K) T

; B$ V1 L% F+ b8 k/ I; Y
20200518114419879.png

" a* \: |, K+ Z0 y- q
) u# P2 J. m2 h  \, K4 K: g编译错误可以解决,不知道会不会导致运行时出错。( w% C3 u( ]3 e, b& y3 R# C7 O
# F. Z7 F3 ]- K1 ~7 i  K
另外选择用硬浮点的设置方法:4 }1 o/ a: A* S0 X: ~3 b

3 Y" y2 \' ]5 b
20200518114439766.png
8 F8 C" p1 X& C9 \- P

) ~# U5 I# D  s
20200518114447984.png
, F" }+ q: Z% L$ S$ _3 s. _

+ M2 x9 X6 i0 M/ T' @; _+ W: p+ n8 X9 h% z7 C9 y1 }$ K
5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误
" U& |' ]( u/ m; m8 P1 Ydivsi3.S:330: Error: Thumb does not support conditional execution
8 d6 I" K  f8 Z9 M+ `- E
看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。4 b' ^: {4 ^1 X. ?3 o
3 \6 p$ m. {- l+ i9 s: i$ Y
6、HAL库中的接口未定义报错
' N  k. x+ ]5 [9 u' oDescription    Resource Path Location Type' z. z3 V4 ?( X7 `

) Y: @  N& {& t! sundefined reference to `HAL_UART_Init'    main.c    /mkwsf7/src/app   line 305   C/C++ Problem; R. I$ h4 {; T$ ~4 ~

9 t* d" g+ a/ @( `创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:1 r9 a* [- [# {+ I$ q3 ]7 H
( h1 ~( B% u/ K# M2 z! ~
2020051811450640.png

$ ]+ n% n7 ^8 ~/ y3 a( d
- r- ?% g7 a% p4 a) J) }0 Q7 X  w/ `4 t: _9 X4 X6 d

5 r" Z1 ^$ H/ P" r解决方法:1 A$ p5 p+ F% ~: I  z( x, M
/ V# J% d7 _2 z9 W1 h: X6 ~+ i7 W1 X
properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。. v; \. a2 e6 W7 y; O8 w" p

9 ^! Z- T. e' `- V7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。
. W& K% n7 P) u) x* C3 v: o, Q- k  W9 _6 W  Q9 o
20200518114516419.png

1 X4 z: N$ ?4 X4 E/ U) U+ x- t- P; H3 b/ h
, r  c  R* h$ |
8、出现一堆系统调用接口链接失败
2 t6 a- Q/ s4 s类似这样的报错:0 `# \% P3 E8 n
  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':6 J, J) A8 y3 @4 I& @# V

  2. . T' S$ _! ~" W
  3. writer.c:(.text._write_r+0x10): undefined reference to `_write'9 Q9 S9 K) R5 x; G; y
  4. 8 D+ G! w; s5 T! S
  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':
    9 o6 Z4 w* }* p' M

  6. 4 h- S3 c8 f4 k
  7. closer.c:(.text._close_r+0xc): undefined reference to `_close'% @# T1 W4 H) f+ k

  8. 2 {6 [7 a0 ^5 g; j0 d' H+ A' n
  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':- w, E& X8 ^/ x6 c( A* I. F* j% X
  10. - P! L! Z( |; x# j" u8 u) ]& R! C
  11. fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
    : f( n: ~5 V% @  z- Q5 f2 M8 M

  12. " ]8 f. H/ |; E9 J- N: i2 V
  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':
    0 Y$ \* E0 ?6 i2 l
  14. $ g0 c% G3 V- p. a$ @/ b
  15. isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'1 T, c  t/ P+ L) Y+ _1 [( ?' \

  16. 3 a( h8 u; u: q" D$ Y
  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':
    8 H8 A$ h5 C0 c7 c* v
  18.   `; C; x; z" }, U+ D/ M
  19. lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'0 ^1 o9 @6 i% u8 z

  20. / ~9 I7 d9 Y: L0 J
  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':# T2 J1 K' o$ g) _8 F: O
  22. & v. m7 g/ C% W$ Y7 O9 p5 o
  23. readr.c:(.text._read_r+0x10): undefined reference to `_read'
    9 ~' N. U6 r6 D4 e; Z
复制代码

3 @3 P3 s/ V2 H4 f4 d在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。- p3 v2 s# _. T9 a' [) ?8 J
独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。6 i9 J3 n8 s7 y

' P  R( S# e% w/ B8 K  q默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。% R! l9 d! Z; W
' r& l! M& T7 O
除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。  T' v) n1 Y3 k* u

+ U3 q+ j! N& H! S% f9、编译出现如下错误:
% O1 L- K/ V1 y+ MIn file included from ../system/include/cmsis/arm_nnfunctions.h:163,3 d) @3 A) C% P1 z

; j4 N8 q; x' w- N                 from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:: @3 X7 N) C+ x' Z# `5 h5 O# B
6 ]) A# G1 t1 j0 W! \* Q. Q& W5 F
../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type
2 S1 k% }8 d5 ^3 U& e; v5 F' g2 n. A- h
  452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)9 _9 j, K2 @! x" w" C

5 p: `9 g2 c4 d9 u, w      | ^~~~~~~~~~~~~~~~~~~~
% I/ ^6 b! x0 X' a6 u
( Q# B4 L, P; n$ M0 ~. j! O../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type* V; R6 ^0 W& b) p
: m0 @% v. e, A8 ~) @$ S
  467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)+ N2 l. j, v4 P+ j
0 {4 T+ D9 U7 l: V, I
      | ^~~~~~~~~~~~~~~~~~~~
. f7 K; |$ g# w/ P6 k. ?1 U' C; M1 ]( T$ f3 m% r
../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type* }3 s; @1 E# }8 ?0 h
- J0 z! a( _, n
  481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)8 A# ~! S7 G8 V1 d/ L7 j! m
4 J7 f2 W" k9 c6 P6 V
      | ^~~~~~~~~~~~~~~~~~~~# V: ~3 B6 t- J0 K
1 N  b2 ^% n! G( [, j. a7 T( J
../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type4 T' u$ J' m: h' |* d

, V; R6 O' Y( e, R+ x4 H  494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)# b+ }& s) |" F2 I& ~  P
2 ~5 ^4 k7 N, r
大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。& |( a8 ?8 E, I+ r5 U

. R9 t. `9 {( V10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory- z( d5 e; C) ~# ~$ f8 x
   32 | #include "cmsis_device.h"
9 d, y: a% x, E5 K/ a5 i' P9 {" t
      |          ^~~~~~~~~~~~~~~~
2 \1 y5 I6 E  i+ A& }8 F* F* t
: a) D2 a7 K( w  \% Jcompilation terminated.# m0 I! P5 V5 n5 D3 }6 \/ a
. Q+ n9 M5 [2 h
system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed
3 ]- X8 d( \8 g& j3 e' |) [6 C0 {" U
) _3 w: s1 l0 imake: *** [system/src/diag/trace_impl.o] Error 1! A8 N* M6 e9 R& q
0 ]" \  g% C: e1 P# k6 E2 {
新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。
6 q: t7 S2 [: Q+ z3 r
2 v2 y4 W( s8 ?: i# U3 R; C; G
( }0 z2 k, D% X% x# @. m" B, s
收藏 评论0 发布时间:2021-12-13 22:50

举报

0个回答

所属标签

相似技术帖

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