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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:50
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。0 f0 C! ]$ ?5 R8 x  ~

* f& Z, ~: A8 M% fEclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。
1 K5 I/ V+ m/ z7 R5 }2 d. j- G, Z( t5 g
CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。
9 r4 J0 Q& v6 e: @# T6 F( I  E; s; M# Q6 R' I, r) r% B
GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。
( i& `: m  w  c4 {2 Z0 g9 z  D0 R9 i* P( |3 _) A) b
Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。7 H- O9 G& r& Z4 d
# z- ?0 o- }* k3 i
GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。: x! |! ]3 t8 S7 c  @9 w
4 F" E4 K4 T  l) f- g8 k# x. I
下面介绍下我自己的安装使用过程。* Z" B5 N8 O' H' [- O

& J3 l& M& t: T- S7 }$ N# I' I1、搭建基于eclipse的开发环境需要安装的软件包:8 t+ N. F) U0 s. X+ X
0 P7 X9 q% m( C, n
20200518114132563.png

' b# e' ?6 i3 \( N% @9 D& v6 F* H1 T6 X8 t. i  T, ]! f
202102240948015.png

; Z* e5 r( j  h* O
- K# m; V$ Z4 d# V
  E' X( M8 _+ s* x6 ^按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。
: `: z; t5 \: `/ B% k
: k/ I, Z" k, E! O" S# y2 e
20210224095516888.png
4 N6 g' d' \' p; r) ^# J) v6 g

2 i7 H  T; Z4 U) n$ t点14.15.5 LTS 下载
, N9 N( T6 @, i2 `
. Z4 F  v( D' `9 [7 p% r
20210224095643120.png

, I4 y5 r2 ^- f  |( |
; |. a! S0 r8 C双击安装5 `2 w  `9 K( T3 T

; W# z7 T& }! R: _& U
20210224095732314.png

  p6 Z  V% a1 C- d6 X, R
& L1 i! ^6 v; |6 M- m8 ?0 O安装完毕后用npm命令安装xpm:npm install --global xpm@latest
5 ]9 m# G' j0 u& s3 e( P) c$ D% |$ }+ m" \" a: S& _
20210224095848166.png
8 x; m6 J1 P2 R- i) i% q
, C  s0 e* n# b" C( [! k, h
xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。
0 [5 v; F( t; [0 E6 F5 z4 B) ~0 l. e5 D! \! S1 C
20210224094649121.png
! g: s' \& @$ x6 h4 B) `2 E

: r' L% U8 P5 u0 K( t, Q, M
  }+ ^. S7 S$ Z0 F1 K# zeclipse C/C++版本
, N- @0 X3 {. l+ A- x- S% G6 t
+ C7 r8 @" G; [7 v3 |! ]! N+ `* V3 W+ K 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)
$ u4 m) e# g1 H  ?; c0 z( @# L0 o# G. w% i) A* y
20200518114203468.png

/ P8 ^) J6 @/ W1 m4 o8 s
6 C+ A1 j- C  b3 w. g
3 i5 D5 N' ^' L6 C5 E安装GNU ARM Eclipse插件。
: F1 h6 D4 u: |( M7 V+ V
" U8 J9 c  n! [9 T用xpm工具安装:
. U+ X/ {9 y( j# s
, s8 x# s2 \% warm或者riscv平台的工具链根据工程需要选择。
, w' D- u6 c+ n( i+ t/ d2 O" ^1 F' W8 y* S2 l
2021022410433298.png

! j  L# O8 U& H# i  I; Z
! e& Q, |! v; t' U1 P* `: x6 v5 i9 r. x' }, p

& o5 V7 [' x. h打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。
* c* k$ l# u( L; T) n( c
" C4 c& i" g( A' l
20200518114221864.png
1 s7 b/ U% ~" z% \$ S. x& _/ \

! f1 A5 r3 {& I/ `4 }3 p  E$ d! \1 P* `& L
选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。9 z$ R7 N- b: g

# Z/ W' [# e; u' ?4 U创建一个基于STM32f7x系列的空工程
" g5 m" T$ A% f* A" T
* V6 i" d, w9 j' r$ \, H
20200518114234290.png

9 U! G4 o' c* A; }% G" C9 u6 m% r$ Q( Z3 `" y5 V1 S
然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。
7 D% G, ^3 m7 H7 s: {% x2 A- W: C* L4 c' w2 a& a5 O# |( D; Z
20200518114311876.png

3 O, `% U& \8 r, @# U+ r% l) |0 c6 A  Q( y: O- D+ S9 f. |

4 A' b/ W0 I! b2 G( [) G0 x) x9 R. Q% Q! i8 D" V1 x+ R! V7 p- m
2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法+ N9 L$ l& K9 z: J) `
①选择工程->roperties->C/C++ General->Indexer+ n! [- @! a6 J3 D- v# @5 a+ P

" `! z, t$ m: o/ Y$ T2 e" `9 ~②勾选Enable project specific settings
! y) z) g3 h9 |! K$ c$ }, O3 X: q* m$ \3 E  a! a2 r
③勾选Index unused headers as C++ files" M: F# S4 K' H* Q3 Y

4 h- c3 c8 Y: W$ `* g/ h0 z③勾选Index unused headers as C files1 T* B4 z0 b5 q$ i$ E
" R; i. D# y1 T/ `# p/ x# P) d
, f& T: l; ~. Q
3、提示错误“③勾选Index unused headers as C++ files”3 H+ f6 U' a- f  l, B7 E
解决Eclipse semantic error; ^8 Y0 Z0 d. m, F% U. ^1 F
3 m. {& X8 T% L* [! U. d( O/ g
项目->properties->c/c++ General ->Code Analysis- t  v5 g* z5 X8 i7 n6 r
3 h8 j* I# q. [, q0 ~/ Z; W
(1) Potential Programming Problems0 v" g7 D% _8 y  w, c" F

$ h3 e, V- _0 iNo return value
# e% D( m/ c: [  P" T9 J. `- O
2 X+ J' _8 ]& T% ?* cUnused return value
+ W" u( s9 `3 ]; u! d8 e& F
, `/ e! y% E7 C9 n: {* ^# @/ \" FAssignment to iteself# s* M- B! s7 {- d7 V+ h
/ ?9 [& w0 T% a% i2 R3 S
(2)Coding Style 全部
. K: }7 u6 w* s2 m6 |
7 r- A- w- d/ y2 x( D(3)Syntax and semantic Errors全部! G7 B- w5 s' R9 o- E

" M3 S9 c  v" z$ z# V9 A# ?(4)Securirty Vulnerabilities 全部! E! Q) A9 v( D/ z% T) Y4 d
  z# X9 q) ^, p" P* J6 e5 [. D
以上内容全部勾去,如下图所示
) d, o" D2 X- S. X) R( l
5 F. e$ B( ]* }1 [  D
20200518114341413.png
/ Z- U4 E2 I4 O- k4 ~

$ L2 M& _0 ^7 J3 i, K, h, Y7 E. K: b
2 b. \8 [0 _! g3 k1 Y
4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,$ K$ g* T" V: O" x! X' ^3 O
context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode
* c# c# {  t% A$ e4 |7 x
网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb
% N  q9 y6 n6 R! Z& v  {* R5 c1 `. }2 Z! J
20200518114419879.png

$ y* j# F& \4 h$ I8 N4 [
! H/ l! V" F& v! x! d- g' d& G编译错误可以解决,不知道会不会导致运行时出错。# l, |) E# W& q4 T1 r

  y/ ~+ w5 H3 x2 w; q1 k另外选择用硬浮点的设置方法:
7 \: j. ~4 y/ V: ?" I5 U0 ^7 w. V) _% i6 t+ Z1 S6 V
20200518114439766.png
5 y, }' S6 D) ^# H
; z% j8 |( b" ]4 ~
20200518114447984.png

; v% z! s: z. f# |- y* l+ r
1 P, O8 R* u; P: N3 }! T) v3 C
! b' P% d5 S' P+ n" V8 C) Q5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误
" h% I9 j) @" U8 h8 Ddivsi3.S:330: Error: Thumb does not support conditional execution
$ Q4 i# }+ m" S% }
看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。
- }& F8 N* E( X, k9 Y, }: O: i( E0 w5 I) V# _$ i
6、HAL库中的接口未定义报错
% h' O0 H7 n( [1 B0 A' NDescription    Resource Path Location Type( d: z. d- I% M, c# C7 A# D

" C/ s0 D6 x( F- a) V9 X" qundefined reference to `HAL_UART_Init'    main.c    /mkwsf7/src/app   line 305   C/C++ Problem
3 S1 s+ ?* K5 M- [! b' }6 F: m$ |& U& I4 V5 g3 B
创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:
& G1 ?/ A$ p) G) D% N6 k5 t' V: o8 m8 b2 ?8 O2 S8 }
2020051811450640.png
, ^, C! p% c; X1 X
  b) M/ R: P  Y" k4 Z0 I

% h( A, j+ ~- ]  f% w# R' W; k
9 j3 e: a  X4 Y8 x解决方法:
/ I7 d- y; ^/ l8 n) T; m% d8 T' s6 ]; G# V  o: W; ?. D, _1 _  r
properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。
+ P5 L" [$ G6 f; j6 k. Y. F
7 Y: L" y" W& F7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。+ a7 h- u" n0 K
) R( H  u* e# m/ r4 f3 F6 G" B
20200518114516419.png
) G) ]" Q% n- f& ~' k8 h7 B
- e+ r& ?) `3 U# c% S9 n+ Z1 J
( M3 z* s+ n+ _8 Z' J
8、出现一堆系统调用接口链接失败
# t) n# @: b8 J类似这样的报错:+ s6 A1 t" \6 `+ 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':; D: h6 J5 u% ?$ i$ p9 U
  2. $ F4 z6 u/ T; B
  3. writer.c:(.text._write_r+0x10): undefined reference to `_write'
    7 o3 K1 `1 Q% |- R& m

  4.   _* Z/ r" L6 z8 N
  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':- A, I# l- D/ c  S7 X* B8 B1 N7 C% Z
  6. 0 `- d( V2 S+ j" C$ F
  7. closer.c:(.text._close_r+0xc): undefined reference to `_close'+ D, ^* T" @( Y
  8. + _( [4 G: n% Q5 \$ b4 t6 b
  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':( e$ t% R; R; _
  10. 8 {6 o9 ?! Q- j' U0 W) r( a
  11. fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
    1 ~# F, E3 R4 K2 O
  12. % F! I5 j  G* Z: g, |: S
  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':8 b/ W% c- C$ e4 M

  14. - [8 L' \3 e4 p  B4 |+ \, T- ^
  15. isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'" e) k( N4 g4 ?/ |
  16. . c$ a9 d# T0 M; q- F7 x
  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':' ]" `1 c+ M) |$ s8 Z2 S

  18. & O1 ]6 |5 E8 s$ [% B  G
  19. lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
    * c5 V2 G& S* s

  20. 1 v& L- E( c$ Q" l- q( ?* M
  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':' w- f# C1 h  D' p7 g. m& \

  22. / \, M$ X1 f7 b5 A) T- q
  23. readr.c:(.text._read_r+0x10): undefined reference to `_read'2 |! y0 o/ w, m
复制代码

" c. ?# M. M$ E# O0 l在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。( O$ ~5 n: l- L! U3 o% R
独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。
7 d$ \" z, w" P4 Y5 k( m3 N
9 s9 t6 B7 k$ z6 y/ W6 l3 {! _' F$ x默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。& s. y* C+ H4 M  v: w/ P% W

( y) i* P" W. R; S5 W; u除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。
1 A2 I+ o4 R8 e# Y, R/ y6 S5 Y2 U& `0 L0 Y) i* l6 b- @4 b
9、编译出现如下错误:
' r; S; W" j3 U* w/ LIn file included from ../system/include/cmsis/arm_nnfunctions.h:163,
+ g2 S. l  g  M; L8 T1 U
$ z$ E5 f0 ]( ^5 l1 S8 t) S                 from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:
& Q. u) X0 @* x8 ~  w
( I5 Z: u4 @2 m! Z, Q# u) [2 `../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type, k' f; q+ O' Y+ i. o, M0 @" z& q

4 \) o; e7 ^+ l2 B( v! \" K9 t8 i  452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)
. q9 ~$ _- ~9 ~, I( f3 {0 ]; @# q. y1 F9 h
      | ^~~~~~~~~~~~~~~~~~~~3 g) Q& u% D8 Z5 b" [3 ^
+ T" x! {, R9 a, S
../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type% d+ E8 d1 k9 B: l2 p1 t2 v

0 v- M& q7 D2 r+ q$ M# ?5 F- B  467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)
* z: C  z- H+ i* ]/ j; B
; M, x7 }9 Y. T5 O; I# W$ u      | ^~~~~~~~~~~~~~~~~~~~
/ [# n: s7 w8 z. f
  M2 k. D% d4 u& C0 U../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type
9 p8 K% [2 ^0 d. o" ~. v7 t2 R6 ]
* Y4 R) I' W; F/ C5 N& }4 o  481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)# Z- e3 H, n- C: e; x  l, U3 S- n

# C4 Q, b) r  ?. A      | ^~~~~~~~~~~~~~~~~~~~0 f9 X* @! ], V: r* e$ V; [

$ v) i1 J0 ]/ `4 j! Y../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type" f  R) p7 `6 A1 q$ [
( B  h5 S& h4 C# {1 g$ t, y: ^
  494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7), P7 o" k1 }, C- e+ N& I; l) p
: o! H3 q# ?! ?$ H
大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。
! ~' h* B; \! P2 T0 J8 z
& B3 S* }% A3 Y10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory
$ ^- g0 J* }8 a4 K& z   32 | #include "cmsis_device.h"
" k! ]+ b% a$ Z& k- K
% M- L- H9 r1 j, ^* b' C      |          ^~~~~~~~~~~~~~~~
5 {" Q6 b$ L3 H( R* u4 Q) j/ E( _0 l: ~
compilation terminated.' S* y/ _9 Q! s# X9 G: F
" u. d* a0 a8 [; |, t2 U
system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed# `% K1 g, B8 x6 D+ n

3 }  W& _$ i5 a- M9 S5 M& _/ ~8 imake: *** [system/src/diag/trace_impl.o] Error 1
1 \, k0 Y8 |- y/ G# J$ \0 z% w" U3 t$ q* V, S& U
新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。
" E6 F6 ^/ w6 K+ Z5 P  Z' A4 w1 J
9 D" e1 Z' T' D2 ]7 p* a0 Q
9 x; w: N2 f% T+ x! ~4 e# F
赞 收藏 评论0 发布时间:2021-12-13 22:50

举报

0个回答

所属标签

相似技术帖

官网相关资源

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