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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:50
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。
2 k) _# w) V9 M2 I6 E% s/ g* O9 A
/ W8 @8 H; D3 Y; g0 k9 BEclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。
7 z2 B' f$ [# x- r# G+ ~5 W0 ]) o6 M- y
CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。3 n8 G; ]3 x/ d
; W$ ]1 ~& b% @4 o" _
GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。
0 L8 \4 N" f! Q( Y( u, m# u5 K. w9 b6 V! ^
Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。+ l7 i  ~+ K$ I
8 P4 n* Y& X( ]" d3 N( e- I) I- @; s8 M
GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。
& N( j: M6 f2 k; W4 F2 S' [/ Y7 w) P4 W# |9 g- d( [
下面介绍下我自己的安装使用过程。
' T/ r- q- S. i$ D* {) p" Q  g0 o! {5 d  e3 W
1、搭建基于eclipse的开发环境需要安装的软件包:' ~) ?/ @# Y  U: @' N
! W) ^5 X0 X- A
20200518114132563.png

2 g# `8 _0 C3 T
( |$ s' ^# T1 Z* B
202102240948015.png
1 p! h4 o3 w: w' ~3 @* M
. x5 `9 b% D4 m+ {# X* g, P
/ f) M& Q; ?; e1 N& D
按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。! L& d  f) ?! W, z( o

# y8 Q& k. S. H% V8 J0 t4 {
20210224095516888.png
1 T8 t0 \+ {* a
  j# i( s7 ]% K; Y7 C+ ]" l
点14.15.5 LTS 下载* N0 Q7 a& s5 ]" I" a# q
( d% {) Q5 M! p6 u+ A
20210224095643120.png
+ G3 m1 N4 T+ E* `6 ?1 a2 m

) ~- q' q" c, x7 ]* `双击安装
+ M: i* {0 t+ e; \8 W6 C
! k# z' m5 q. z" l* h" B6 |. x+ q) z
20210224095732314.png
$ ?2 p1 u5 V0 i% _7 v
7 x' B6 _; @# @) J, r  e
安装完毕后用npm命令安装xpm:npm install --global xpm@latest; _) h% X* i4 |( U

; i* b  c, d: l" A" Q$ e
20210224095848166.png
7 }# W6 d& Q/ N5 O4 D
' ^7 K- `- b, e
xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。. {( h7 h; L4 H

7 J! f2 P2 ?3 s$ ]7 G
20210224094649121.png

; M) m1 m( E5 j" g$ \' D6 O0 t( Y- Y* Y; [& z  @7 q, b
+ g" @7 u" _% P$ t' B5 T$ m" W3 H
eclipse C/C++版本5 Q  H5 y; t# T+ b1 H

, ]& |. A  T; N. {1 j- D 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)8 x3 S/ `  s& i0 g: k7 q/ @
! [" x6 [8 ~8 W6 I
20200518114203468.png
% |& m, t0 X" d
3 @3 b. T+ {; x8 a7 H' M- o

/ J9 x/ O, P0 D, p. M安装GNU ARM Eclipse插件。- D( r& G3 `  Q7 `: h

. {( V8 R! W* N# K% F( p# G5 ?用xpm工具安装:
$ v8 b+ i( Y1 d! ]1 S
) H, b7 z5 F% [7 |$ _9 qarm或者riscv平台的工具链根据工程需要选择。' |: v) J% v1 t! x* b. g4 i  C

; g: b1 U; E% x% n! |+ @
2021022410433298.png
# n$ v; @/ Z7 S0 \6 J3 }2 _
% ^' O# u' T, m

" R" G% ]" ~+ k! Q) a7 V( S5 s8 g1 E: |' R! `3 n1 @( E! ?6 L: A4 z6 i
打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。% K7 w. D) Y3 |2 t
9 x' i' n% j5 I# B8 i+ d# h
20200518114221864.png
- ?. v, N- k5 M( ^7 U5 g$ D
7 T0 r1 }# _3 i5 N2 I
8 s. _7 g# h0 c7 x- H6 X" W3 ^
选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。% l4 |4 K% f9 |+ C% g3 k! v

+ B: q/ a0 O( W% A7 L: A创建一个基于STM32f7x系列的空工程/ d$ E1 D; n% O
+ s( N4 }, Y2 _
20200518114234290.png
3 L' t3 r* i: W7 E7 Q  [0 ]$ q! D
  l, N6 @' h: ^' V% k1 y
然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。
1 q' N) _% Q6 U7 I7 G% _+ z
9 Z3 n# n9 y. a
20200518114311876.png
; C6 u# m; I2 O2 J' k  v
! B5 l6 n. M" G7 R7 b/ C

9 p  H0 Q) Y" G7 `" B9 [: Y8 |# v* V3 k! d
2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法
" e5 c: _+ h& R9 D! ]①选择工程->roperties->C/C++ General->Indexer. E6 O: K  r- l5 C+ P! r: ]7 N

* |2 t* U% }# |4 U②勾选Enable project specific settings
+ @' H2 M2 a# V% W0 x  p
/ {9 ?, j( b9 ^3 T. \' X9 U③勾选Index unused headers as C++ files3 x% Z$ t; \, j5 S  h

0 I& ^# c6 M$ G& P! W1 D③勾选Index unused headers as C files& I) C% I3 \* b! P8 w+ f

9 c# u8 `" A/ n% @5 m: }8 L% K
3、提示错误“③勾选Index unused headers as C++ files”
. e1 `& m8 X0 d7 A3 x% {解决Eclipse semantic error
# V2 J1 B( ]5 ^$ s: X! }: k$ N* E9 M/ j: p
项目->properties->c/c++ General ->Code Analysis
# C( _1 v5 f. a3 \! G* n
% i, Q; H! W4 l(1) Potential Programming Problems
. f- c9 F& H& o* h" j
8 R: f4 j" l5 rNo return value
4 r* P, ~! F: t( h. Y) u
* [) i/ y9 E/ d# D0 [% NUnused return value  ?+ c2 o: A+ X7 g8 j
( g6 ?! B% s+ G& E- r1 \
Assignment to iteself
5 C/ n; {9 W2 G4 h8 v! I  l. m. O& n
(2)Coding Style 全部/ y4 R+ j8 ?. ~  F% C4 G

/ i) N( h, U% A! _$ [" y6 u(3)Syntax and semantic Errors全部( v" f  i. B9 W; [" f0 I2 z: {% m

) k% {- F3 T# v1 f2 f(4)Securirty Vulnerabilities 全部
* P$ V7 {" j2 ?
% u6 {4 H/ {4 Q- |% u0 Q( _以上内容全部勾去,如下图所示
) ~5 S; i% n" H' d' I9 F( g7 c, }* A5 G4 s' v1 B: Y( H/ I
20200518114341413.png

! c* I/ K; p6 U( S' C  B. L& Q0 O1 p4 d8 E7 d) r

- d/ w. p4 Q% I" U, f! T/ x2 {) R
4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,
* |0 N" S; Y% ^' P+ Bcontext_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode
. x5 s! W9 Q  o9 o4 O
网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb, a' j& J6 N2 r
& ^& a4 W* G1 B' S! f* k+ m9 o
20200518114419879.png

8 F7 I) c% ^* Y$ d& x) f0 t) r) Y$ D  B
编译错误可以解决,不知道会不会导致运行时出错。- m7 t" Y1 w4 H) \! I+ B

0 T* N% |3 L, j$ J! z另外选择用硬浮点的设置方法:
; q/ T" R" Q9 \+ D; `" x% B' e, ^' H! k8 |1 A2 C
20200518114439766.png
% g' O6 q4 c! Z( _

5 a& w/ B6 \1 W) K  }) c  L' P
20200518114447984.png
6 u' U3 Q4 \3 z: L6 H1 O4 ~
" I7 y7 X1 H+ i% J( r: U" a
+ W6 o8 e& s8 u
5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误8 D. L% F5 p* i4 B7 D' R. y: h
divsi3.S:330: Error: Thumb does not support conditional execution
; `$ M; @3 _% `7 ^% z4 [
看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。
, [% N* R$ j" z$ y$ K! Q( Q7 ~! {6 I) V, ?4 S( m/ ?; W5 ^8 d7 L9 \/ y
6、HAL库中的接口未定义报错2 c8 N& b" b$ h
Description    Resource Path Location Type
3 _: h% z$ h. o0 A
3 B- Y: K( I' ?" R$ Yundefined reference to `HAL_UART_Init'    main.c    /mkwsf7/src/app   line 305   C/C++ Problem
8 o: i. B2 @1 [+ q. r  W
; K7 Y7 p" B- g# ~4 o& u创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:
5 J, G8 _6 O, `( j, j7 a3 F9 l
. k( e, N! g) w$ i' m6 L
2020051811450640.png
; i% x$ z8 ?) G" h
7 c: f) @4 U& V. g# S- t0 t
1 u+ X# G4 v; [* F8 L8 b! W% C

8 d3 p3 ~/ d9 Z- e# o解决方法:
) A, w0 d/ W, f5 g  z% Y, h3 ^) f
8 K( [" I. B' q( Aproperties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。/ M# Z2 I& {; _  D2 o6 B4 m' v) s

7 u/ `+ a, g- P4 P: k& _7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。
) U, N: d+ {5 g1 C$ `) g, {" [: X6 M) J: h* V- u) [" ?
20200518114516419.png

" t. e% B1 U  R7 @3 J- v7 N  a) _0 n; J& O

  F( R; ]7 \6 P" f; X  f5 x8、出现一堆系统调用接口链接失败
5 I- |7 _5 `7 L9 p8 r! h8 Y类似这样的报错:
( a" \# N! D# u4 }. I" ]! L  B0 K
  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':
    7 S! ?% `( a) s3 u" a7 B7 u

  2. : G- ^6 o- j3 n: K
  3. writer.c:(.text._write_r+0x10): undefined reference to `_write'
    5 R* L" R2 t9 v

  4. 2 z8 E$ H4 b' G/ W
  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':
    " v; C) d7 U. j9 C# c

  6. + G2 q& [. v1 x1 `( D  E- C, f
  7. closer.c:(.text._close_r+0xc): undefined reference to `_close'
    ' r$ k3 M6 ]% d/ S7 P) o2 b( y
  8. ' {+ Y8 M' N  Z7 R
  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':: b& w- I0 s& L" |( e3 ~7 C4 Q

  10. 4 S8 _, r# ?: P' g: C! O  o+ F
  11. fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'. l+ C( f+ Q# c4 Y! o6 @( r
  12. 7 l: E1 g3 L( \5 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':* D0 [8 C% u$ g' L+ S  c; y+ z

  14. 2 c9 b1 T3 p6 e0 R6 v- `$ X
  15. isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'6 o7 @" Z5 S4 ?; \

  16. 8 a- F  v4 z% M$ 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':
    7 G# i7 R! o; I7 _9 o, h7 X7 n! u$ d6 q

  18. / y+ T$ t1 g: t) Y! C- c/ X
  19. lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
    ( y3 e, M- [# p5 b

  20. : U  c3 l, @! }( q: c% _& C
  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':
    9 k. c  ^. G7 c9 [7 p$ d

  22. ( p1 @2 s6 W! r# K0 L5 J1 h: `2 ]# \
  23. readr.c:(.text._read_r+0x10): undefined reference to `_read'4 D! i# A& m! l7 Y8 p
复制代码

( v% [  r/ a" V, c  x在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。
# o9 L. W, A+ e, O4 }独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。$ B4 F. {' K. Z# m1 U, i1 M

, A% N  _( c! E9 E4 N2 S默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。
( [% D# Z2 |% O* N# ~: B% q4 Z3 w- r) G
除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。! K/ j$ Q+ f$ h2 Z) @

5 L4 T1 v/ L# j/ o2 V/ J  R9、编译出现如下错误:
$ k2 X4 w  S5 ?2 H) |- ZIn file included from ../system/include/cmsis/arm_nnfunctions.h:163,% i9 W8 L& y+ p/ {0 @
  f8 c, F; I, h' R+ h) ]" K: H8 @
                 from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:" z) y- b: J, w+ ^# y( c
$ W  {/ M# d( b" B2 D. Z1 \/ m
../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type
& e& [- i) r. j) }5 z- w0 ^9 ^. @1 R. C. v) o9 Y( m; k
  452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)
/ X# j5 V5 c7 Z' C0 ]1 L6 X# z
6 Y1 `" h+ y9 q" S. N      | ^~~~~~~~~~~~~~~~~~~~
+ s+ g" e" S7 x9 I1 s; o0 r: ?0 X
% |1 b+ V. n! x2 V../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type
9 ]7 y4 h" A- O$ M
3 o/ r; w# a  z, Z7 @: i( K  467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)
+ T) {" u9 F3 K& R
! N% {$ Q# Z# C- n1 n) v; g      | ^~~~~~~~~~~~~~~~~~~~
& l$ B+ b" n3 D+ w' b+ H, |
# `3 _( v3 E$ F4 `9 R& i2 B' S: J../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type
! I) N+ @( f. `/ \
; p" v9 F: H9 G" I9 s1 L+ q  481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)
. H: s1 }: t, g$ b% r( e4 [9 s7 p1 T
      | ^~~~~~~~~~~~~~~~~~~~, c7 [2 Z' `& P& ?% C# N! ]& Q

/ v: l# }* v, p, e8 ]; i' W1 Q% V../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type# g8 p- r& X- G2 ~: h, _  g7 q

& M( t" q3 o/ H0 g0 J: u! ?( ~  494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7), v$ k7 v! o# _3 {6 w
/ Y# A- N7 \1 [; z: s
大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。
' V0 f8 ^/ E& I3 X
. s1 K0 J4 Q. s; \10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory1 k1 {- |8 n. `; V; {7 R
   32 | #include "cmsis_device.h"$ O% U. I) m% l' C& [& q

, h" J" ^* e9 S/ q2 N$ ]      |          ^~~~~~~~~~~~~~~~
# X/ i8 s8 ]9 T/ C( s% q3 L) }1 ^3 h. X6 D( a+ o
compilation terminated.1 E- a) b0 i% P, k

& l' {+ x1 Z5 M+ t: F: S8 Wsystem/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed& A# t( A3 D# I3 A7 y4 g: @

6 f7 o" s  ^, U6 lmake: *** [system/src/diag/trace_impl.o] Error 1
1 F1 H+ A( T; U0 ?& d' a
, p8 }/ a( u8 q( Q& m新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。  e! b; L! E! {1 K
# J# Y( J1 F3 Q8 Q: v4 G
5 S6 R5 w# Z5 s8 B6 q
收藏 评论0 发布时间:2021-12-13 22:50

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版