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

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

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

1 I0 D& t# T9 g# L( DEclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。
; e7 z% Z0 I) }
0 y3 M$ S0 ?9 a6 F; uCDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。) `1 ]: A; O$ {
& M3 V: a: f9 E1 f: O! m  Z
GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。
  f& p% O2 E* o( n% u2 V: f0 G4 V- u. W
Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。: J* k5 J5 P2 l; i

! t" m" t. r) p( H0 TGNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。
+ d; H, w6 o. y
' R+ q2 L# [7 r8 q( w! O下面介绍下我自己的安装使用过程。9 l1 G9 }1 f. U( j4 g* N- Y8 G# S

2 y7 z9 R% \: ]( M1、搭建基于eclipse的开发环境需要安装的软件包:, x/ X. U: b) T+ x

) E9 s; n8 _2 J1 u' g
20200518114132563.png
% [3 i9 m. _8 a5 I  r4 ^
6 K% Y' v! A0 a' u4 |7 r
202102240948015.png

& }* A5 Z6 ^- _' n7 z1 U9 g8 D/ d$ d/ y0 Z
6 Y/ L( ~/ c4 s; ?7 J6 ^: m( h
按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。$ ?; G* H# @  K  E, S
) |8 B: Y# s  \7 Q* `
20210224095516888.png
- z9 [2 G8 ?/ V' {3 M: S
, V6 h/ I" S+ f; W& c/ C% j
点14.15.5 LTS 下载
5 a" |$ P8 U0 D) A3 J
1 o' ^6 }" H) [* [' X& A* C
20210224095643120.png
2 E+ B3 n- A0 F6 i  d) q

& k7 [  n& @6 R$ |双击安装7 Q& v7 y( |+ n; z( g
* A$ l- x* H1 |1 e
20210224095732314.png

2 i/ J" b5 {* j. s
. c7 m# [& {1 ]5 S$ [! w$ |安装完毕后用npm命令安装xpm:npm install --global xpm@latest
8 J3 x- O, l& |$ q8 J) `
/ ^  K$ I( `) [( ?
20210224095848166.png

7 s5 k1 o9 X! H0 v8 i: A
& M% Z0 D1 M0 bxpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。
% Y( l* k. _. d* H+ d
  q! d+ P5 h0 y  W! [+ ?
20210224094649121.png

% o! m# e& |9 p* `
* q2 Y' D8 F4 z6 F
) W) |6 k9 l- R. H( w: _eclipse C/C++版本  m' Z% H7 Q, L: W6 b, X  _2 J
% d" ~, a9 b+ R4 Y9 l
 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)
" d8 s- C- S, K; D" O
) _( P6 _! g5 t
20200518114203468.png
% n: j/ m  r6 a5 @( n7 m+ p$ z- e/ D
3 B: Y4 e& T' t: V

; c" {( |9 j8 N# E/ X5 }安装GNU ARM Eclipse插件。
5 M0 [6 C/ F+ F# ~9 }6 f  z& Q. [% P/ r% [* k! e
用xpm工具安装:
4 T1 q( Y, ?- ^) k; D! Y. Q9 E* L) D2 K
arm或者riscv平台的工具链根据工程需要选择。: v3 l4 o* P0 x5 @* P

) s' G. O# P9 D. b! k1 Z' ~
2021022410433298.png
9 X1 }% [1 c- A$ k3 K

5 @3 R3 n8 }* D* F
  `, o2 ?# l" g$ ^8 T6 A* x3 j# L6 F0 y3 n
打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。
# }: Z$ T+ b/ d; x, J" H, z6 p; w
20200518114221864.png

* s/ `% S; k  H# |8 p
0 {. r( J. Y& ]8 x
* e" [7 t. `( ^( J选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。
5 \8 }3 V: A! B5 a9 V8 }, }2 V0 \
/ b2 z8 I2 H5 U' m  ~6 I创建一个基于STM32f7x系列的空工程! W3 v3 L/ Y) J
1 N& R, R7 q: A3 b
20200518114234290.png

! m- `* y4 \" }5 y$ J$ R2 x' h$ F
. m. U; P4 H! _9 p  U# ^7 r3 z然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。: F7 R# y6 {2 ?- T3 Y; x. @7 A+ l6 Y: I; i: u
- s0 u4 S: f  Q' Z: e) y( ^
20200518114311876.png

2 I# @! k" R4 a4 _% }' h+ r2 S; ~/ ?6 z- m9 y6 V& G( z3 t5 \

" l  H5 B& i( ~. ?; ^5 {
; N2 `# k! h  m4 n1 o1 K$ a7 V2 }0 u2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法
1 p( N' [7 x7 x, r: u1 m3 q0 V①选择工程->roperties->C/C++ General->Indexer* q  U9 [' J, y; n8 T4 T
3 C3 w+ p5 z8 e
②勾选Enable project specific settings
' K2 O# e# b9 C& w2 L3 k6 _6 }0 o8 f' T7 ?: p% c' {
③勾选Index unused headers as C++ files
; U0 }! z7 H7 {1 b! A. ~4 `& }7 P: x  s
& }+ U/ Q( e' }* D" c' `. M③勾选Index unused headers as C files2 N1 [$ ~+ b! c5 t( X( W4 n# `
2 M) m5 o* m% l$ N* w

& V. D8 f+ ]- T; N0 ~: N3、提示错误“③勾选Index unused headers as C++ files”; E% _& k* N7 B4 A6 e
解决Eclipse semantic error
: f% K1 Y' v" c& M; S
/ z3 d( i, E/ n, Q+ H' F& N' A/ G项目->properties->c/c++ General ->Code Analysis
  y: K' j; Q: t4 }( U
0 Y- l- U& s% U! Z% X& C(1) Potential Programming Problems
; J$ }; h2 m  p2 r9 G; ]1 r
; E% q( v5 L- U: xNo return value0 u* |& p& I0 p& U( g* C

, E. F8 e) Z0 R! |- lUnused return value
& E! ?. L: m: Y: e( V4 Q$ x2 B, j% ^
; V5 J. ?; B% n7 {9 ^: g* {Assignment to iteself
( \5 s7 {5 W, u
1 o" T8 z& W( Q* T( h( {- v; C(2)Coding Style 全部7 v! q4 S) S, t+ W; S5 @$ L
( N# [! ?" P, M+ |! q8 }9 o
(3)Syntax and semantic Errors全部# r2 m" R+ n! V  u& r8 I

; P! _6 M# p4 {; ?% M2 j(4)Securirty Vulnerabilities 全部: Q* a9 l5 r0 B6 s& C! ?

" T; C6 |/ x* x- C6 [' P以上内容全部勾去,如下图所示& h: W; L+ s0 g4 i' E

4 a: g! [3 y# W. F! }
20200518114341413.png
; b* y6 k/ U; H; u  ~0 e

' Y, f' C  n1 E# e! i8 Y
0 m% z2 \4 n0 {! J1 j/ Y! N8 W9 Y: `
4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,* p8 |1 [% ]! b
context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode
6 k. Q  M" T$ B- q2 C3 c6 \
网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb3 R3 p, @  r) ^

: S7 q- d! X+ f, y$ w
20200518114419879.png

! T  k' W, P; r8 J) o. T* a' j# L' e
编译错误可以解决,不知道会不会导致运行时出错。2 j; ]. A. K4 z3 o1 [$ O  \
- U' u3 {3 T( U2 z) `9 `. i) u5 G
另外选择用硬浮点的设置方法:
2 F7 {6 ^- M+ M/ K1 v3 `
1 O5 Q6 ^" h7 t6 C# Y% c  ~
20200518114439766.png
: d) y' H) ~" U- P! a2 E

3 ]% i+ j- v- T% r) T
20200518114447984.png
  Z. K" [6 ?% O% O9 P# y
2 E& s4 _% c# U: d$ y% _

. b6 \- B6 u6 W: F% D  ?8 v5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误( h* f; X# K2 P7 O+ `
divsi3.S:330: Error: Thumb does not support conditional execution

! T9 t0 \% c5 H) ~8 o  y+ i, R看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。
2 O- \- l1 _) O. h" |# }
# I1 L2 b: \; _, ~6、HAL库中的接口未定义报错& S* K3 K4 x$ T" N; e! K$ o9 t
Description    Resource Path Location Type7 U3 y& Y0 t" I0 R7 q

5 f1 F  s: Y' ]- A1 t% Cundefined reference to `HAL_UART_Init'    main.c    /mkwsf7/src/app   line 305   C/C++ Problem
: s4 z, r8 C/ A) E3 |" R5 Z* L* W, @& y4 n7 w3 h! `
创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:; ~. E/ A! J4 k8 @9 E( M

: r$ w1 Z# T# I' e8 h
2020051811450640.png

$ R% N8 V9 V, P* c+ r& i- H7 n7 D+ f# W+ i3 w" b" v. W! M! V8 a
8 }( }8 E3 k2 ~; @% Q

7 M6 {/ t' D- G" d/ v解决方法:
/ R: _- i# C+ A1 z3 v! U/ }. a
/ E0 v% ]( ~  }7 k. @/ H3 Xproperties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。
" X, ]2 k& S) D& J4 e  v9 U% |
( x8 w5 ~2 i$ l! I  i# Y; L7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。0 `8 l0 b0 ]$ P% w/ x
. _/ q: H- u6 p$ [7 J) d7 g3 L  ^
20200518114516419.png

* z& K1 w, o5 y$ l6 C/ B4 J" {: Q8 s" Q0 g: v4 H

6 x" x3 t3 ?# z( s8、出现一堆系统调用接口链接失败
/ R6 k9 v$ p( t, f* s: }0 d: o+ o类似这样的报错:8 u# u4 J/ K/ Z8 w
  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':) `$ k, J6 B+ L
  2. 0 N/ M( ^2 W6 P( e1 z9 q& d
  3. writer.c:(.text._write_r+0x10): undefined reference to `_write'* H1 U2 @9 [9 A# o
  4. 1 b( p( a$ J# ]6 y0 r, K( 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':- e6 d9 Q7 l% E. r* y
  6. 7 S" `9 ^, l6 `+ b  P$ L0 n
  7. closer.c:(.text._close_r+0xc): undefined reference to `_close'
    7 d8 X& N7 V9 j2 O7 _# K
  8. 0 V  n# l5 u0 {; Z6 d
  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':
    6 M9 y7 q; K, L# e* R

  10. - n* H: G3 w/ d! \, u2 ^
  11. fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'5 [! ?' u+ K% J. A8 j& z) @

  12. . O7 ]* k: t/ b; g) V- {
  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 E- l1 ^/ r0 c+ m) |! e  a

  14. & v6 B% \1 ~2 r) _& h
  15. isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'* g4 ~6 n5 U" B3 w' v# g
  16. & O/ o0 O. H- O8 l3 I
  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':
    4 @# g. W$ b" y! `

  18. 3 I  B3 e5 y$ N  a1 F
  19. lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
    1 L$ K. y7 y3 V2 R
  20. $ z9 L! c* F4 f! l" H
  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 T+ }# n! j3 w' |/ K1 Z5 @
  22. 4 V( ~5 s. m+ q: G4 N) V! b2 U1 L
  23. readr.c:(.text._read_r+0x10): undefined reference to `_read'4 r& Y0 B1 m% @2 j4 A+ G6 s( V* Y
复制代码
- E6 H6 h% r; @0 |" W
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。
/ T' p. C0 A3 Q. m/ j! K! U+ i独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。
+ h5 M+ K5 C5 v7 @5 ?* K; ^
- p9 a& p- h; r8 T默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。* D3 s, e+ [: x+ H2 Y& Z2 q4 P. T
6 V. s! g% o, |
除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。; o* w8 E5 c) p  \# w: t
* l  t7 _( P+ \1 ^( ~
9、编译出现如下错误:$ x' H2 J  _) Q" e5 T+ E# j- V% Z
In file included from ../system/include/cmsis/arm_nnfunctions.h:163,
/ z3 ^! B: f- A; X5 i( E
2 z" `' W- B. I) d                 from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:; d3 n0 f  g( y% X( r

8 ^0 _( B' y0 i3 c../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type1 Q: |+ N9 D+ b

9 L) q0 r  O$ Q5 k3 U! z, m! s  y1 P  452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)
- b) K' i+ b" M8 f$ j- m
5 ]! F, D# v1 e; Y. f      | ^~~~~~~~~~~~~~~~~~~~: @3 p3 L& |- F% p  \2 b

" o# r' F) l* b+ f& f% w- V../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type  C8 s" Y6 M8 F1 x4 T

  W! P- e+ `1 z9 [7 W* f$ q, c  467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)
& R) D- K1 u3 {% ^7 b; W9 v/ F/ c) Y3 \5 F$ Y2 Q, X
      | ^~~~~~~~~~~~~~~~~~~~
1 h5 d; C9 R/ u0 |" n
' n* ^4 ]# c5 h3 k, V) K: e../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type. e' g/ P4 s$ u; t6 I! B9 b

+ \9 V% O5 ~3 r/ B  481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)5 Z' i" k% M& W8 ^0 _- f

; Z* [+ T4 H: i) o  p+ _      | ^~~~~~~~~~~~~~~~~~~~
  j3 v( @6 T  m( q; v" f& |4 T8 E3 [4 p3 w1 Z
../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type* i1 S) b( R2 d# S; {
$ G- H% s; A' d
  494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)
# x8 @) L4 s: e0 H, p* B4 l
5 H) w0 g0 k; ^# `/ \% N大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。, I  @6 L0 p9 t

0 R  w+ f7 q3 a% y0 D! ~/ s. Q* [10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory
3 j  t# R( J6 E( p+ O! }3 T   32 | #include "cmsis_device.h". T( m/ {$ u+ l* D
9 o5 g4 P  Z6 {
      |          ^~~~~~~~~~~~~~~~
0 H% K% ^( U; ?$ }/ u3 j0 F  y. ]+ D. t  E+ s8 s& s! C/ n
compilation terminated.) w2 @* }4 S3 {* V$ h# p' F2 O, s
4 K* i7 W9 a+ D) m; H
system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed3 W, I) s  F& O3 I$ s1 l
: j: r5 s( I* `& O
make: *** [system/src/diag/trace_impl.o] Error 1
& ]" b& K9 }5 Z8 Z; _& z5 ^  ^8 _$ [6 e2 X. R
新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。$ `; ?: m2 V  v- ]7 I

" d8 f3 U3 f3 F5 Y, O7 \" m
' I1 b- C8 t; @5 M
收藏 评论0 发布时间:2021-12-13 22:50

举报

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