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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:50
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。
( l# |9 M9 T" H' c0 B( ^0 U$ f1 |' R! l
Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。
6 d9 C2 b* |5 O
1 u: n; g3 O; `0 E' yCDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。, c' @- }2 v+ ^# q

& Y1 e; z7 n/ s0 Z' C  E" B- ]GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。% O, F. n# r, K9 |

9 J( G2 w/ ?" x+ ~# W* EWindowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。4 u5 x; _! C' u( X" j. A, c9 y1 S* d& H
' q1 Y; d" ]) `. F& D3 S  z  d
GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。
- H2 o" ]6 D% \0 b- F( U- Z. w4 j6 ?- j6 l$ j2 e3 A4 i
下面介绍下我自己的安装使用过程。) W3 U1 x: @. D. `- R2 Z8 T6 M

7 ?4 g6 H! V! X9 ]  _) f# y. v1、搭建基于eclipse的开发环境需要安装的软件包:0 F+ F( `: N9 A+ _9 u$ n- V+ J
4 F  D6 H9 X/ y
20200518114132563.png
2 P5 @' Q$ b  [& A6 h
2 M# _1 i6 `% W/ h! g
202102240948015.png

+ Q, {5 r9 Y6 |6 R* E+ _) @. V! K. M- H! w. Z2 c8 O
6 ?1 D4 w, j; \! Q9 {, ~! e5 P
按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。, c! v! ^, W! z% Y! n! e; u4 J; _
9 ^9 W- H5 L3 X. A$ Z
20210224095516888.png

9 e# U9 ]& ~3 y9 B$ B
. }0 R8 e9 ~. I3 D$ m% A- x- e点14.15.5 LTS 下载
9 I5 W* K  i7 \* D( H
) {! H/ p! s1 a6 d7 O+ a
20210224095643120.png
! m! r0 t# s2 k+ ?- Y5 Q
* x- _+ O6 y8 l2 i% ^
双击安装
! t% Z; Q* q% U2 H' ^1 Y/ `  `) \! S
20210224095732314.png

3 @- J* C# s3 |' N$ o8 T
+ v0 |% n9 k. H. w( p; c+ I安装完毕后用npm命令安装xpm:npm install --global xpm@latest
# q0 ]  B: @4 Q/ N4 E' P7 B* y& O3 h' j; q! m* _: a
20210224095848166.png
+ O9 E+ t- x- ~" ?' ]* ^
- L0 Y0 [  V( `8 d& A5 Z8 q
xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。
; P* a$ y$ y5 t/ b$ R0 B' V2 r3 \6 }" q2 {* F! w. ~' Z
20210224094649121.png

: B! W7 [+ v& m# q0 k4 B) m; |4 m
$ s; Z+ e  d% l! v" B& |& ?
: Q, q/ p% g0 T: ]! ]$ E6 jeclipse C/C++版本+ h) K7 B* B- E" ]* {1 ?& D& H
8 W. Z) d' i5 u
 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)8 G2 \% t9 ^& k) D+ C1 G
. P( j1 d5 @% ^' _: b1 Q; ^. J
20200518114203468.png

2 O. P! p0 ?1 |3 M& e3 E& J( A" k% V1 G/ n
  \/ G% ]  P" Q1 K* w# k
安装GNU ARM Eclipse插件。3 e% u# x  A$ i6 O; x
4 [" z4 q' u5 g4 [  ?
用xpm工具安装:
3 I, `! x1 O+ W( |4 x+ V# j. I3 p  c4 c9 v
arm或者riscv平台的工具链根据工程需要选择。
7 a  x* V' G* A& e* ~. m* x
8 J  O' ^$ i4 B
2021022410433298.png
& E& r$ e- m) R3 Z
* b& n* D* f! r- h0 p% [" y

4 T9 r! N3 V/ p+ s. g8 q3 K
$ E" A/ Z3 a1 X/ {/ l打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。
0 u! @) {- d2 O3 h$ q, D) D9 H1 K
20200518114221864.png

: f$ f4 Y3 L- \" A3 Y/ q" U' P7 x5 _& i! H) S; N
7 g" X: Y% g  s  B6 S
选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。
4 g  \6 a( z* d$ C$ p; h3 w, Y7 x6 n( @0 W
创建一个基于STM32f7x系列的空工程
! Q: Q0 w! ]8 p& F
1 d3 E1 p1 l+ p9 O4 Q
20200518114234290.png
6 l; c* g6 w& k# `( @2 r

( ?) h# _9 U/ O) G7 V然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。$ D: @% j3 Z+ t5 G# u& g4 s: j

$ j. K7 M) K8 k, Z/ l/ W* J
20200518114311876.png

' h9 s9 p2 S0 d3 x4 N% M
3 R0 q: V: u6 I& M( t0 J
% G0 v7 R1 e: @  h$ d: D& ~5 n7 A6 @0 o
2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法$ ~# `. b0 t" R9 `& q/ N
①选择工程->roperties->C/C++ General->Indexer! S/ H* B$ l& E; U
. R+ N$ i- Y, D
②勾选Enable project specific settings8 F: f& H' j( Q1 R1 q: D
' C+ ~8 C* }# Y& B' j
③勾选Index unused headers as C++ files
! @/ \8 U% j! B9 s+ ?. I* {
6 k( q0 F. p( }) T2 b$ L, R8 Q& |! ~③勾选Index unused headers as C files# K& L( v+ |9 n/ a; o5 c
8 a% t) K% z/ e7 k" G( r

6 S( [1 k$ G2 t0 d# y; C3、提示错误“③勾选Index unused headers as C++ files”
  t0 K: Q: x4 R; w0 g* `解决Eclipse semantic error
3 d3 T% v9 `2 n/ v5 |' l1 V! t) ]8 O# H/ h' h
项目->properties->c/c++ General ->Code Analysis
% p" U/ w) q7 }3 a% Z) z5 g( Z3 i+ U% n+ r8 w8 F
(1) Potential Programming Problems
/ s, f0 G9 D$ {0 C+ z; z% A
* _! |2 y: s2 R# [$ tNo return value
7 ?+ A6 o7 b5 m0 s) t# u: q9 K! S3 ~  S
Unused return value
/ U0 k+ {+ w! A- F2 C) H7 a, s2 H% _+ o" g# I, a, x' R& G
Assignment to iteself
& m! ~# j$ O9 p. R0 d4 r
6 L+ k# c0 d$ _7 U; j(2)Coding Style 全部
# l6 T& ~3 n8 B4 U8 r( Z& A9 s+ M! y: o
(3)Syntax and semantic Errors全部
+ h& \7 w* V: Z9 ~- k% M
) \! o. x0 _2 ]; ^/ x(4)Securirty Vulnerabilities 全部3 Y: c; j( T) T8 B1 l: M, p

- e; e. a% V- J. ^' c6 o* T5 ]0 `$ Z- g以上内容全部勾去,如下图所示
# B4 `- p+ F0 v
% B9 i* o4 W0 _) V4 t' L6 k5 M
20200518114341413.png

9 k1 q- f+ w1 }1 q
' p2 X& z3 ]/ i9 I6 {% q& b1 \% o, {; n9 w0 D

+ l, X$ ^! P$ W: W, r9 C, t4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,
: t3 {/ v8 [/ ]3 \! Vcontext_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode

8 \5 `8 u8 q- b; v9 `& P! H9 P4 }网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb
- v! ]  q, q6 N+ B/ c9 O  v" k0 A$ p! T( H% `# m
20200518114419879.png

2 q& g3 V" A7 Q7 G' r. J1 P: j$ f9 t2 i7 r
编译错误可以解决,不知道会不会导致运行时出错。2 ^& {' Y  i( w' z3 R3 W- o1 t! J

/ Z, o! k* d' D7 K( ~/ j另外选择用硬浮点的设置方法:
% j7 c% g! ]0 s7 ^8 J  `" ^, @" F2 ^4 P) @+ W" }
20200518114439766.png
: U8 A8 v3 u/ R. h7 l( s! N" e( W

% t+ k6 }/ Q* C4 Q8 E; c$ f
20200518114447984.png

# E+ u+ g7 G! l* q3 b- O1 p, y% D+ j0 E
7 j. d" ~1 \% G/ Y
5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误3 U; c$ G2 {) g+ S: O" k. `' g7 W
divsi3.S:330: Error: Thumb does not support conditional execution
' u& g9 P# g% _1 ]
看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。
$ P1 J$ l: U/ m, a9 ~; I$ O9 d1 ^
, p) F( S2 E& d% x0 [2 p6、HAL库中的接口未定义报错
: @5 |: p5 O4 S# m* Y: t3 ^! v- |* ODescription    Resource Path Location Type
' O8 D2 U9 z# f" y9 y: I; \  G
( i& m3 H! C: K# a8 pundefined reference to `HAL_UART_Init'    main.c    /mkwsf7/src/app   line 305   C/C++ Problem
" O& b7 u2 Y# ~
. g0 e' `# x3 S$ _创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:
9 G, G" z1 u; M
4 |2 S; Y) f& [0 H& ?  R
2020051811450640.png

" l  k- Y! ]/ d4 Q
0 ~7 V- P2 i- K
( H/ @3 K7 T. P1 Y2 k! C
) I; |& k2 b, r* n8 I( D4 m8 `解决方法:" g: w; J5 H, w8 v7 e$ R
: s  P8 S. h- x0 K7 S# D9 `' M9 E" ~- c
properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。7 [8 _+ O9 r  i. J, i, r

7 _( o  j$ ?+ b9 i7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。
5 ]; I) c$ O0 w. h* o* i
" E! a' ]+ p- p9 U
20200518114516419.png

5 b7 D. D* y  {3 @" e; s% e3 Y/ V1 j8 E  I3 J1 I$ c
; D5 v" i) A# b8 a) ~
8、出现一堆系统调用接口链接失败
1 O8 w% @. [' s) Y) ?* {类似这样的报错:& Z, }' p* }( R% A. U
  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':8 o5 c3 m# }- \7 u5 u, x
  2. ! I$ m' c7 N. O
  3. writer.c:(.text._write_r+0x10): undefined reference to `_write'
      {* o2 {4 b& ^3 Q8 v! v. p: z
  4. 0 n9 J: Y, V% M: I- H
  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':
    ) |. Y1 c- N8 u5 r$ J% b
  6. ) H/ a+ e5 s* f8 y4 v
  7. closer.c:(.text._close_r+0xc): undefined reference to `_close'# K0 R- g7 t/ F4 c6 Y- d$ J
  8. 5 D* ?5 o$ l( H1 ~
  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':9 k/ B3 u9 i7 B

  10. 7 S+ w5 [* z  d' W, `: _! x
  11. fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
    / g* Z, o- h4 H: K6 [, Z

  12. : {$ \! s' y2 X
  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':" z  ?& k# i& a6 v

  14. % E. i  i7 N5 ]: J5 a# {
  15. isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'8 A; T0 k( k6 v% i: S# s8 L3 {

  16. 5 L& _, x8 ^7 _3 U
  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':
    + Y& u( c, a: ^- L- d" ~  K( _

  18. % B3 V& y9 V# ]& r, h, V6 J* D
  19. lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'0 r1 x/ E$ _4 @( e: L& N

  20. ( @4 s" N, n0 r4 Y# B; F1 C, h  Q' y
  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':
    ( [* D/ V7 l: ~8 D
  22.   S7 U' \) U5 ?5 D1 E1 K
  23. readr.c:(.text._read_r+0x10): undefined reference to `_read'
    * Q8 R  H* G/ r0 v% H; \. Q( E
复制代码

: d1 r, \4 m+ c, a在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。
) c. d+ Q% w! P+ ?% u; V9 u独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。2 d  b. C* _- e, t4 `

/ ]0 S, Z# e$ O) j默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。
5 i0 ]$ q. |$ Y6 p5 {1 R7 @. u8 P  f+ R+ J/ k4 X2 }% U9 C# {& N/ a
除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。4 N  e  }0 M! n( |
- Q  t& {- [* C; L  ]9 H- {  r4 N
9、编译出现如下错误:
# ?0 v+ o4 _* Z3 e" Y# S- L! lIn file included from ../system/include/cmsis/arm_nnfunctions.h:163,
, G* E0 Q1 _4 g9 _; g0 |/ B$ I5 H- n* t5 N
                 from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:8 i7 }( H/ S. u+ i. d& D

9 a6 q- l; M8 f' {../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type
& n- h; f( r$ v2 |1 d  ~) f9 w" }* r' n7 o) ^
  452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)
/ O/ Z4 M- h7 ?$ }1 j8 s! D- T! N5 e$ T
      | ^~~~~~~~~~~~~~~~~~~~" I& J. z" K0 ~1 Z; E
( D0 C8 q: \9 H# `3 G/ L+ J
../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type! b1 m) T$ C$ E! D

  J. _9 m2 n) d3 E( Z  467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)9 W* A6 J; x4 m( ^

; O- W5 e2 Y& A      | ^~~~~~~~~~~~~~~~~~~~
: u$ t- z: z5 @
" c* A5 D0 a$ m, r$ p/ H( U) h../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type2 B" R/ @5 I( G2 ]: [

/ b# J/ |- Z; f9 O" N% O  481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)
5 u8 ~$ c3 C0 ]: E6 L" V
7 z$ z% H4 t9 r  [* h      | ^~~~~~~~~~~~~~~~~~~~% a9 r% {$ a% l; {& C3 F6 B

2 l% x$ h+ a1 t2 x, S$ `$ I../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type
! m  O$ `  \, z: X. A+ d2 Q  e' A0 K% \5 @+ r( s1 {
  494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)* P) ?7 L. i) s+ f5 j/ T4 G

' f. I: ^4 q( T8 P& N大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。
- H, N, F& d0 L/ M" e
9 N2 z  N, B5 @4 ?* F* i% [10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory  H1 g  L1 I+ c! T
   32 | #include "cmsis_device.h"+ H& n/ b# U8 e) @' I$ n3 H
; i, u, a# Y+ K1 s+ j5 ^+ K6 O+ y
      |          ^~~~~~~~~~~~~~~~8 k4 @& I  U" ?0 D0 m1 B5 T

  g7 @5 F. o$ r! \7 Scompilation terminated.
9 w) @0 v* l4 v3 F
( v, g& r' f9 n* p  U1 qsystem/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed
! Y  F% i( \- Q( `! u) C
; h; {: [5 C) T: w, t  E9 N9 Smake: *** [system/src/diag/trace_impl.o] Error 1$ V9 C4 l0 C$ ]8 M4 U7 h  \) y: f. f

! P/ v4 y3 A! {( k5 b- m1 _新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。
! A- [. g8 a8 g8 V5 ]- S- g) ^3 @. l' }
8 o* d6 m9 Y: D* K* N1 x9 }
收藏 评论0 发布时间:2021-12-13 22:50

举报

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