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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:50
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。
4 F4 }9 Y- C5 w6 s* q; p
( R# W2 o; u4 }  r" ~, n0 y# kEclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。
% {! {$ |. I1 p! R7 C
/ {7 l: ~' P- H2 p0 S( mCDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。. T, x+ Z+ R+ |3 S7 t
& r* z) Q5 u6 f8 ?$ {0 G! r
GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。; F) ?! {  F" o6 t) M- b4 O
4 ]+ i; E1 p' A( x  m
Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。9 m  b/ n/ w9 y
- h. c5 D- x) w) i# l! I( o
GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。
4 d) Z: u6 Z" x8 s/ N3 x# f7 [% h. q
下面介绍下我自己的安装使用过程。
! M$ k  `- e" G9 y, q7 K' f* c" s2 m& J6 l% r
1、搭建基于eclipse的开发环境需要安装的软件包:" d4 M' I1 x+ y& U8 s0 f: x0 S
3 F' v* W2 h/ L4 r; K8 o
20200518114132563.png

& Q, ^& }; V0 `
( X6 j0 X+ Q* ~: D
202102240948015.png
' o( a, O* }6 S4 j* G
, h- \& a: E/ Z; k( O- n$ s

: k6 j) ^7 r8 \按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。, a& T  {" H; b4 f

  J$ H. S7 o0 x7 B  X( j
20210224095516888.png

" n' L, |( V8 s0 r% H# O( N/ o- s3 d! o7 k
点14.15.5 LTS 下载
2 l) {7 O7 l+ J9 y9 p
; w- [3 v( l# }2 Z) C. k8 J9 }
20210224095643120.png
$ \5 P; @8 b. r1 n# L, c( C

( L. z. F( z$ Y2 g7 Y0 l/ P' {0 |双击安装
$ f+ }  |) Q. V- x& i  ]1 A; X0 ^4 A3 e6 T5 l# B
20210224095732314.png
$ S# q1 W; m% r
2 l& U9 W* c( g1 M
安装完毕后用npm命令安装xpm:npm install --global xpm@latest$ ]  a8 b/ |8 O. ^8 a3 S

. R0 @7 j! v  c$ z, ^& z4 u' q: e
20210224095848166.png
4 H7 [( o4 s$ l! m/ L
0 M! K1 S" ?# }) h( }
xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。
' w; M  {- l/ q# B3 S
& `$ D9 B/ K( ]# Y. N2 `
20210224094649121.png

; H! u* f, k( i
5 y$ k8 z, s* W  W
& b8 f- _4 N3 n; o6 h1 k4 geclipse C/C++版本) e  m* r, _! H: x$ ?9 C4 p
9 d4 y1 O. c* c1 r
 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)  a3 t1 n, E' P
( u* g. z/ g/ r. }
20200518114203468.png
2 V: n% o3 e2 s1 _9 y. d

3 b6 H! s( s1 j1 M; X5 A3 s
5 z3 N1 S; k& _安装GNU ARM Eclipse插件。
& j7 L6 b6 W, ?3 W0 b1 z; }
: X& r( W, K' ^9 J' Y# s5 u5 }  D0 @用xpm工具安装:0 u5 i" u* b% o9 l
5 S% C4 k- j1 S4 R7 t! Z( o
arm或者riscv平台的工具链根据工程需要选择。7 z7 R6 Q) q: q/ y2 b& }3 Z
% P: r* t+ I. l) J
2021022410433298.png

2 y3 f: J' k# }- c3 B% @& h% \; o; G. S. Q0 a' N$ c" o, d# i
% J* |" [: I" G. V; y$ j

& x) s" a2 o; I$ k( E8 I打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。' T7 m' Y3 V* C& z
/ ?/ j, _# Y- l: q' ~; n
20200518114221864.png

9 l. z/ D; \1 }5 j& F, X5 w+ u( o- D3 E+ s* l$ C$ q5 m% i

( x8 B+ o- v! x# ^选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。
4 y7 v/ H/ C0 Y* Y- j) y
! ]) n1 }2 j) [* S, R  ?$ \创建一个基于STM32f7x系列的空工程& ]. |9 _! A4 H; V, \( b) f: `
6 ^6 D. Y6 ~% F$ g7 I
20200518114234290.png
! ?* [5 Q- M7 _$ B+ l; }
* h' P& K: P% G, [1 r; f: R8 w
然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。
# q' a+ M! l. \* O% D! D# }& z# ]2 H* ?
20200518114311876.png
* N% X( k' ?1 G% L& O

9 [) I* y9 F& e$ P  j2 \
' z9 P/ Y6 s" q: J. U
$ S' I' f% P& G) e, g7 f* F) _2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法
6 k  _/ j( u2 n6 h% O/ v①选择工程->roperties->C/C++ General->Indexer
) |: g9 s3 h! E& g, B! y8 C5 o8 p
/ P$ m. W% c) v( V2 ?②勾选Enable project specific settings
, J/ i5 G# c5 X4 g+ e: T) i5 E- |8 ]9 ^' ~! m$ Q
③勾选Index unused headers as C++ files
2 @% W! l) ~' H" g' f- a
" ?  {/ L5 S: r* B3 B③勾选Index unused headers as C files, f3 h" \$ X  E
9 Y8 w) d" ]' S
" O( }; Y' ~" e2 w  T
3、提示错误“③勾选Index unused headers as C++ files”0 Q) Z0 U0 K- V1 Y6 J6 n. o
解决Eclipse semantic error
' K6 R1 E9 T( m6 c, B
& }0 t, u2 a0 o' B* \项目->properties->c/c++ General ->Code Analysis; j. |7 e" ]- Z1 T

$ s3 }. ^% [# n# a(1) Potential Programming Problems# d8 T6 \) }, U- c1 M

% V  i4 \" ]/ B3 D0 RNo return value
5 D+ A. Z6 L: }# e! K" k; X+ l) R6 C8 B" S1 E  t; R' L
Unused return value
6 \0 c# T2 d: w6 t6 T  A+ R5 t8 |4 ~0 d7 A- n
Assignment to iteself
4 l6 b5 {- m1 Z) C6 U* X  a
1 Y5 ?- j' a! t(2)Coding Style 全部
8 G% W/ d& ]" ]6 M
1 X0 m3 D& Y8 I: e3 V. T(3)Syntax and semantic Errors全部; w0 g' m6 I! I$ m3 d& N' j8 Y

( z6 g, |% M7 M, b( D(4)Securirty Vulnerabilities 全部
0 v3 }3 k0 t  c: i, o! r' t) n. M6 |8 L/ V( D7 Q8 f
以上内容全部勾去,如下图所示
" U1 h; ^9 N" J; G( c4 s* E4 `, z7 Y  G
20200518114341413.png
7 M4 _( V. U  N) M1 T3 t

/ v+ c% K2 A! Q" Y- v" C% I  a
( O( W/ f  s6 e" [
2 c5 J7 `6 Y* J. H6 p( j4 A1 i  k4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,# @. q% }) e  `  `, D6 }
context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode
) ]6 G( S) Z! M" G
网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb
  F8 ^+ d. q" E5 `- V, _8 @3 ]: I. |0 ~+ q1 v! e4 d
20200518114419879.png

  ~1 G5 A  T& H9 S# }! o. D" w8 \5 s! b6 C- c
编译错误可以解决,不知道会不会导致运行时出错。
0 l7 G! u7 g, J: ~  ~. ~1 w
' S: |: R. a* L! \0 j( Z另外选择用硬浮点的设置方法:
' I1 w4 _  B$ l# P/ n7 k1 `; F9 L3 l5 _7 n+ A, D/ Z
20200518114439766.png
& A; H' t. b& p: s

* y1 l7 n/ p% b" W
20200518114447984.png
' }# `6 |0 _' q+ s% R9 X4 ]* }: k
) h& r1 \/ V0 {
( h8 [  I( Q0 j
5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误  a0 @# U, v& {, `9 Q( b( y. [3 }
divsi3.S:330: Error: Thumb does not support conditional execution
: i0 k/ M7 J5 z! _/ f
看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。
$ U7 E$ F2 c% W# r1 P2 J
  C$ N2 \1 X* H0 ~: a1 b6、HAL库中的接口未定义报错' h) v8 F6 }& L
Description    Resource Path Location Type9 a8 d/ C" Q3 F+ ]% Y( E, \

* R6 ?$ \) W7 r) F1 v8 H) ?$ B$ @undefined reference to `HAL_UART_Init'    main.c    /mkwsf7/src/app   line 305   C/C++ Problem
% U7 G, @- R/ Z- p, z1 ~0 J# j# b$ W2 |6 w& t4 |3 I- [
创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:
; l0 o7 o' _( t% y' _
# X5 ]9 F/ R: q6 J' }: r
2020051811450640.png
  q% \2 l' W; I. w! L# i/ `

. }8 i, \7 h" l) R! u& D
5 I) x4 F, |+ v
& W$ H/ O) i: a. a3 X  U. z+ [解决方法:& P+ S2 S$ t" P; G, S; Y

2 p9 r' M0 ]1 X7 g+ o& v# z; Q8 xproperties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。* a% H- e- e8 a7 R$ W
  a: u/ h2 \" B/ q2 U" `
7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。
2 m9 Y7 Q. d' D2 A; k! M9 W# z2 P3 N6 r, ~
20200518114516419.png
$ M* m# p8 r: }, S  v
3 K; }. R# A9 Y2 V
( W8 q+ r* P# I6 D7 z! ^
8、出现一堆系统调用接口链接失败6 N% p* |% X6 T% G& d) n0 I
类似这样的报错:4 z' u* C  O! ?
  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':
    1 K' Y$ w2 R! ^' |7 E! i

  2. ( U# V# e) h5 ^0 ~, H& G) t$ m
  3. writer.c:(.text._write_r+0x10): undefined reference to `_write'
    , U/ p# V. z2 [
  4.   J" }' S$ D5 Z3 z( @  ?: R# |9 Y
  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 E/ z9 J" D. |4 V
  6. * @0 z" k0 I5 Y+ Q* i9 a
  7. closer.c:(.text._close_r+0xc): undefined reference to `_close'# I5 z. ]# I9 {" \) ^2 v
  8. % H8 g, ^6 j2 I- P* r: k* |- P
  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':- _5 c* a. O  L9 }/ O2 f6 j8 A
  10. 3 x6 i  n5 E4 z* R4 ~( |
  11. fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'+ L6 c$ z) l% a7 F
  12. 3 s3 ]% E' i. v6 K5 L
  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 h; ^' L9 ~" g0 ^) F
  14. / {5 C8 s, c* t* @$ L
  15. isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'8 C* X" X2 ?3 f- z0 P6 U, ?( z
  16. 4 Q! D% @7 P. o4 x+ {/ j
  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':
    - g% m& }1 s3 E+ e
  18. 8 w. v% J$ o# S! V# x% V' P, B
  19. lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
    2 T4 H1 c3 G' [; ~
  20. 6 L# V: L6 k9 A
  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 ^$ L' F: |- q3 m( |; W
  22. 1 S( m- s" p; @/ ?% c
  23. readr.c:(.text._read_r+0x10): undefined reference to `_read'  L7 M5 j3 U4 ?% v8 u
复制代码
% D/ K; Y" {! l& L* V
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。
3 b$ T5 d" F. V3 p& i6 j独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。: F2 S/ \- s# B
8 {: X* s+ i6 j: E4 y" V  c5 O1 K
默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。* x6 _3 J: M( a/ W

$ q- J) X, z+ ^  L7 O/ j- j除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。: R6 K$ |* @/ r6 z7 W
9 I1 {6 w2 L) [" L
9、编译出现如下错误:- i  f. B4 G. A9 d% M
In file included from ../system/include/cmsis/arm_nnfunctions.h:163,  S# N; i4 S& P. V

8 ^: G% n% [$ l4 M- F                 from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:5 Z% |7 \2 b7 k  G6 l4 Z$ C( m- c, q

" x8 |; z# L3 P../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type
2 ?( V) Q/ m5 Q2 i
; Y- Y: v* r" K3 z  452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)
/ R: X5 }. c- W$ h/ R4 \* Q: _6 z, E4 d! X" J  Y* S6 i# c
      | ^~~~~~~~~~~~~~~~~~~~
5 ?- t/ |8 \! K6 X
; v  W! e' H3 a% c../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type
! P. Y6 x; b3 p
* L1 L, }0 `4 f" v% [  467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)
/ A7 K' }, Z9 r* ]6 B
7 O% S7 h8 d$ o4 M5 v      | ^~~~~~~~~~~~~~~~~~~~
+ P1 p, ^9 u  [2 o" N9 H3 o" b+ d- l1 h( @. G
../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type
7 G1 u2 Y* M% }+ ]3 T3 n
# }: \: D2 z7 [0 i- i: q3 J  481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)% h) b, W, n7 l: K

$ W3 Q4 e4 z1 j; w9 N      | ^~~~~~~~~~~~~~~~~~~~
2 B3 o  Y: l- ^2 [# s: p* f3 N# l# N5 B) j4 G- T
../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type* @2 f! h/ a% L7 _: {

9 F& j! E; C1 G: r# q* e- `7 B" E  494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)) o/ U6 V/ P5 n# A! s
' v9 u1 w% l" e/ \9 B
大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。. D( D) S+ F2 x( g5 U. @

; \( u# a1 f* k; g' T10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory
! I' A& R7 A& e, A8 k, u; {2 t   32 | #include "cmsis_device.h"6 g* y  U: G( v2 r/ D' W7 P- s- y$ ?
4 i# V6 S6 i0 c' O; L( n/ K1 s8 G
      |          ^~~~~~~~~~~~~~~~' S/ U  f/ i% i+ @7 I6 ~! d: W* a0 D
' B/ z' w1 N  A( N+ e3 w
compilation terminated.5 |% ~0 f3 _2 P  q5 [" \
* E7 Y; B/ x$ S
system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed! w0 I9 s! V  }
" `" o9 ]8 d6 b3 G: y& z3 d
make: *** [system/src/diag/trace_impl.o] Error 1
2 S. r8 }! \2 Y/ {/ b4 }; v- A. y: Q) W
新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。
0 q9 R: o. D, q8 d( K
9 v) i7 W: i+ x0 S3 F1 T0 ~
4 r' r/ J2 u+ D8 t0 r& ^
赞 收藏 评论0 发布时间:2021-12-13 22:50

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版