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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:50
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。9 l$ `4 _  K1 y" b7 r# {$ d

# e/ D; Q& k. N* |Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。; d% F6 k8 _' f2 M! Y5 W
  n' m& x- j, h2 g. _: d
CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。
; r1 i) k. z( G. K7 \3 B# ^$ `% B# Y6 ]2 g% e
GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。
; j) Z7 @0 N6 n9 f7 a2 V1 {' j7 m3 z4 e. Z; s0 _6 Z2 a3 y/ c
Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。
; u& T; c8 `# d0 ]4 _% X: e& o7 c# D  x- D
GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。  T' y  Y/ |; L$ W7 }; f
' N; {- t7 d' K+ Q1 f
下面介绍下我自己的安装使用过程。
- p: i. ]. @# }) r( c4 v8 T* K4 E1 t; e# I2 ^
1、搭建基于eclipse的开发环境需要安装的软件包:
5 O7 F" n: Z4 p# a5 w# L& A+ D2 S6 ~/ ?  T0 p' \& v1 i
20200518114132563.png
4 b, P9 O. H4 }  Y2 S5 i. |# V

% E# I4 Y4 C0 \& I/ I; L! u1 X. U& a
202102240948015.png
. p4 {" g  w" _9 A5 c1 C- s
  `7 }7 V0 E/ u- B" I- _

3 h6 ~$ N% o; I. Z9 O+ t按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。
) k: _& z! S! x2 B$ w  N: L- z: v6 ]
20210224095516888.png
# ?2 u1 n( E% w" g  }+ O

, K6 B# S8 ^- y点14.15.5 LTS 下载* d' o; m+ [3 D2 P  s5 ?+ f+ M5 Q

9 g) n* q: W- b! J. y: H) W
20210224095643120.png

4 C+ R* E$ A* N
& i0 ^4 c2 A+ B双击安装
1 [$ n3 p/ |4 S" O+ J0 I
+ h% \3 f% t- n0 e1 o; i
20210224095732314.png

7 q$ ~3 F1 D  d/ W, E( p1 b2 x# o. R; `
安装完毕后用npm命令安装xpm:npm install --global xpm@latest
, t8 X, M/ W; S3 U8 t4 u5 e, q, `9 ^
, ^0 D6 l: \# q4 h
20210224095848166.png

7 \9 u4 z, m# R
( f( t, b0 l, F; Gxpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。
2 Y4 P- |- Z* \5 I6 `+ |% |
) K! A( z5 a* t! F1 n$ k) S
20210224094649121.png

, A- z5 o1 h# E  S( W, ]4 n
# ^" h6 U- P. P
7 z: x5 p5 i6 F8 ~eclipse C/C++版本
7 g" |8 Z+ W, K) y3 `# b& b( t
) T% P  C* |' k+ u# Z 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)
* y' e( q! B4 x, e- v
; |0 R0 Q6 M! ^6 t; G! H- L( p7 v" @
20200518114203468.png
7 @0 U/ P+ k  v+ B# `$ t

; |0 V3 z9 K* `8 m2 ]% a8 z6 H
0 }- |$ L4 V! b安装GNU ARM Eclipse插件。9 G9 l4 C( |. q8 I# b8 B
- ^& N7 K7 f/ O' D: i3 ^
用xpm工具安装:
* A5 D, D* j' Y5 l1 d
+ \- B) R# a* @: o" Garm或者riscv平台的工具链根据工程需要选择。
/ w$ L' i' v( N* u2 x
4 z9 d( a! I# A. X# [# n3 m. N" r
2021022410433298.png

: A0 c* \/ T) t: q. C. f
6 _# {1 I+ D- [3 s9 I, q0 H$ C) C$ o% v7 ^( E$ a' b1 v

1 R" b  U6 C3 x打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。
9 T% r4 @" H1 x7 [& a; Y8 x
8 l' H6 b6 r2 c9 c% x
20200518114221864.png
4 `  U, y4 |% k' B; a1 g5 u
/ r9 f- u0 Z. ]; x3 E. l

" g* }8 ^+ f! \9 D选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。
) X- ?0 i! v7 N/ _8 ]& L$ U/ L6 k: h2 c! F1 ]9 |( H
创建一个基于STM32f7x系列的空工程
0 p- f8 Q7 G& F6 D, B% H8 n, c+ C: I9 }8 \+ ~
20200518114234290.png
% |% b* G% i4 L& }0 E% B: I5 t
" E# U& E- R$ Q4 j0 D' h
然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。1 a9 x. j3 }2 ^
/ \! S( @5 o  T3 f. B9 _+ Z( J
20200518114311876.png

' x, V! o' y8 x+ C- a1 L: }1 x* O
- e0 ]6 Y2 f6 O3 ^8 p0 N
  ?3 I/ V: I4 E' o$ A8 R4 y  q: C6 Z; F  D* ]
2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法
4 q$ ~' q, ~( R! v①选择工程->roperties->C/C++ General->Indexer& i; _7 }% ^$ _1 V

3 L( s" H4 z* d# {7 \- S②勾选Enable project specific settings
: r, r2 g5 J/ m& U9 Q# F9 _/ z0 P% K; Y8 l* u1 _4 z, T. o
③勾选Index unused headers as C++ files
; Q9 l5 D& I% K  ]/ e: F, Q
+ l4 [+ N- t( R& m③勾选Index unused headers as C files
" P8 g% ^8 x% C& U
3 D5 q, B: g7 [% U. m* u
) _3 R" q* L/ j* [7 r! V3、提示错误“③勾选Index unused headers as C++ files”
0 e  U( q& _+ B( {6 U解决Eclipse semantic error( u6 y% A; x3 l# m
3 v. e- G! b. ]+ Q
项目->properties->c/c++ General ->Code Analysis. ~( H( n) w/ Q# F7 H5 s

* f/ Z- C2 r9 N4 J8 b$ Q/ \(1) Potential Programming Problems
6 \2 K* f) x2 [, F3 l9 ~
* |; ^# x5 v$ s! L  INo return value" v* O  u7 k4 I3 w6 V8 D

6 @& j5 P; q  q9 {8 d) kUnused return value
; @+ }6 R5 _. P9 _
' B' a/ h/ u; b5 ~% U4 i8 g6 HAssignment to iteself6 p$ t( y/ M7 J! E! _$ X

; n- E* w- k. |; N/ `0 }(2)Coding Style 全部1 |! W& Q! O. C; e; {  {

. ?7 ?  @* X" \2 S  L(3)Syntax and semantic Errors全部! _; m! K- Z. A( c6 s% `9 s  n9 {! U

, F2 s$ n- J* g2 R9 ?- s6 A! M' l(4)Securirty Vulnerabilities 全部
0 K' _/ S) A3 x, y) ^9 \. r9 y! t' H" f4 h$ _0 h( U+ m
以上内容全部勾去,如下图所示
& Z7 O' ~' H- D. z+ K9 [; E- q: O! I4 |( |5 h( o/ k3 R' e% R
20200518114341413.png

! C7 a* B" e% y/ [& H
! x) k* }, G4 a3 [! w; a3 a  ^+ W% @9 }* V5 n1 {0 c
0 X" Y1 n- V8 C  U$ @0 z
4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,9 l* e8 C& h4 @% j. n
context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode
4 n' j1 }1 W) K: u* j; g
网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb( b, G3 h+ q3 J+ h

* G  a3 [% P1 F4 h" n* C: p) `6 x! O
20200518114419879.png
: X4 G% c& @7 V. {$ W) P
' f- K1 s5 Q) O* f, D2 G0 X
编译错误可以解决,不知道会不会导致运行时出错。9 ^0 J1 }9 S3 O4 p4 j7 J4 b

& `: W, |8 s2 I另外选择用硬浮点的设置方法:
9 t& J0 p' P  N" s/ {- l. N' K# e# Q1 |0 K0 z& ^
20200518114439766.png
' W8 x/ |; Y# G; s$ ~  j! P8 G
/ Y6 k1 d& c& @( K& _% u  s
20200518114447984.png
: T, l: ~( |6 c' D% F
9 t  z4 S/ _& _
. [1 w' T( N0 u" B. K
5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误
; l1 ?+ w  z" _divsi3.S:330: Error: Thumb does not support conditional execution
0 j0 g7 W1 {9 r2 M; O: [1 `
看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。5 {5 J( Z; n. W" @3 S: u4 E& C7 |0 c' j7 @

2 b: C! h, _8 n7 d) ?6、HAL库中的接口未定义报错
& _2 Y# I5 A: wDescription    Resource Path Location Type* x7 o' i* e  q7 _; c& ^" _# V

' l7 [  Z0 T0 G% xundefined reference to `HAL_UART_Init'    main.c    /mkwsf7/src/app   line 305   C/C++ Problem' }! M: R* I3 y, |( {2 D- @% t  q

! R" O$ P. O' _) w2 d5 s创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:5 X6 f3 R1 t0 m8 g. F  l* L
2 z; F# J3 J) y. t8 ]
2020051811450640.png
: s* k5 W" Q, H- d/ R4 Y
+ `3 I2 C. V' G: r) K

) |  P5 i. n: u6 F- f' _: J" w+ \6 p" D/ M) S4 T; X& R
解决方法:9 D0 ~) o/ w1 v4 n5 p" U2 T

, {/ `0 i6 i. g4 C4 ^; Hproperties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。
9 Z+ L. [" Y, x5 q- N& K
& E5 V9 t  ?( z+ d) Q1 g3 t+ |; n7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。
9 @+ m% H6 K$ N+ ~- c; q' v
( P( b# ^. ?) b& y+ v5 y! H
20200518114516419.png
  l# i6 Z/ m; E2 Y) l/ H7 N
* o+ N8 R4 O0 t
6 L' K5 x4 P  [% g+ A% m
8、出现一堆系统调用接口链接失败- W: h# Z4 c/ p! {$ `
类似这样的报错:
3 z- h" Z, h$ ?7 s0 t0 s- I
  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':
    ( G# o  Q' u8 K( k" g* f
  2.   c5 K* G, B* }  `8 E! I: ?
  3. writer.c:(.text._write_r+0x10): undefined reference to `_write': U. u* ]! K" U" T, t6 v

  4. 4 k7 d3 [! I& V3 D
  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':" J- X+ ^3 f: b! @% M* W4 a
  6. * X9 U. J2 L" c
  7. closer.c:(.text._close_r+0xc): undefined reference to `_close'6 e! j. D1 y1 m, Z. F" ~

  8. ) T) F& c0 `7 i4 T
  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':1 S7 D9 l( s8 j7 T) s

  10. ; o: @0 `" s7 {3 m- k
  11. fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'0 _5 V& S0 J; t/ h6 n
  12.   v5 W" r/ }$ b3 w( ]
  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':( r  p; l( m4 P

  14. % H1 {# [6 P# W6 G  W  V9 @  m5 I
  15. isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
    ( A4 P& Z$ l; ^: b
  16. ' K4 R9 H: I, E( `5 w
  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':
    . T% k) ?4 U! c' A3 H4 w. E

  18. + @5 z7 j, @5 b1 @9 n. c- \
  19. lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
    3 ^0 B! P6 G* D0 Y+ d3 T5 b! _  [
  20. 4 x1 L, i8 l( w. w, M+ @& g9 G" i1 }7 C) t# B
  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':8 z" @6 `- \" r8 O: o* n& `
  22. . }. g3 Y# B5 H0 L1 K3 ?
  23. readr.c:(.text._read_r+0x10): undefined reference to `_read'/ E, K% H- J6 [& y# P8 c; e/ Z
复制代码

3 v5 z$ N0 _9 Y" \% ~在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。) N! }) I" M, l
独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。  y/ V& s! j) o  u4 Z
; n: T3 S; J) l1 }( e/ {
默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。
3 g$ \/ A$ L" c* C$ r3 J8 J" t  `1 X- v2 |* c6 l( c
除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。
) q. B" S7 h1 v1 _4 h. |. G2 K. D- T% Y# n
9、编译出现如下错误:
8 Q: T1 I1 k( O5 I$ n: c) JIn file included from ../system/include/cmsis/arm_nnfunctions.h:163,& D; }6 f- `# q$ t5 G. n' _
6 D0 r6 N1 D- m# }8 k
                 from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:
) S! K0 Z+ V: Y2 d1 m! i  R( v2 |' p( ?8 T# b' B
../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type& Z! L+ v' Q! ~$ Q
9 U/ `& y; ^* L" E! X/ ]
  452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)  T. n, A% d/ ~! i  m6 o3 s/ T

/ x& G0 F8 Q6 Q) }) D' ^      | ^~~~~~~~~~~~~~~~~~~~
8 a* ^7 v( w9 |  I4 W3 f7 ~( i# O9 ]# g+ x; i9 w
../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type% m, `! ^3 ]2 B& X+ M
0 e( i$ M" m4 D0 u4 m$ q
  467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)8 S& `( g0 L2 ~- u' C9 r

( T( p; J3 t! r; V9 z( T' t! w- n      | ^~~~~~~~~~~~~~~~~~~~* {5 u- y0 U+ k' ?4 n0 x5 T

" m9 F# B2 o* X+ D- q../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type
/ a' \: L" _% G) `
, |/ O* Z5 ?/ u# d  481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)
& N: H* x# f9 t  |+ y! A$ ]- r
2 L3 n. w  a5 Y" L1 a" H( K      | ^~~~~~~~~~~~~~~~~~~~
9 m5 Q8 U! m  X% \  H3 F5 [/ y! j' [  y. n( d$ l8 c$ Y
../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type
% i, ^# v! K0 M% j$ g+ C' ^) A, i% f2 f) Y2 B) y& b
  494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)
& M2 s; o# |% y
) `2 @+ X- e3 v; Q, u% j大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。7 G, p9 I+ S: ?! v3 n& d% ^' }+ J3 j

; _8 X/ N, M" @" M3 ]/ k10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory
, o. l: k! H5 i8 B7 G   32 | #include "cmsis_device.h"" E/ ]4 A' L. v5 {

; s( v/ t( m8 y% W8 f      |          ^~~~~~~~~~~~~~~~: S. q1 G' m0 {5 T3 P) c: j

2 l' T# {1 I4 K; y4 O; jcompilation terminated.4 |1 B$ |/ _* {( l3 W, R
' t, [2 r8 R0 i/ F6 l& z
system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed
+ I9 ^( Z: P. c' F7 A( J5 \
3 d! O6 S* s; U; Tmake: *** [system/src/diag/trace_impl.o] Error 10 g; x3 Z; j7 q9 J9 Q( E
  ]& O7 i$ M) D/ ?8 Z- f& Q  c3 Y
新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。
& z# H1 \0 g7 c
3 Y  }% G9 C$ @6 x3 g
6 l! B/ P, c4 F
收藏 评论0 发布时间:2021-12-13 22:50

举报

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