
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。 Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。 CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。& i8 M: N2 R% J GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。* |5 {) f7 ~1 q$ J . L; S7 }2 X4 I$ e Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。8 f; W4 l5 @/ k8 ~. W ) U" M4 Z% A3 t8 o! J2 m A8 I GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。 ' O \, Y/ P- J$ J/ c8 h 下面介绍下我自己的安装使用过程。4 T- w6 d0 H/ x5 ?3 N9 j5 W. H4 | 1、搭建基于eclipse的开发环境需要安装的软件包:# L, ?& x9 H! u4 @6 E ![]() / X" L9 M5 c, j ![]() 按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。 ![]() 7 z( y2 h+ o) o: T+ i) r4 \ 点14.15.5 LTS 下载/ L" F" b: V0 S ![]() - W5 z( Q) n% U1 Y* S% ^& ? 双击安装 , p4 ?& Y* i3 X- V: @& _. i' `) | ![]() 安装完毕后用npm命令安装xpm:npm install --global xpm@latest $ U( T6 C# q' M2 P$ [* ^9 R2 F ![]() xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。 $ ?# O+ @1 i1 C- V( | ![]() 0 B1 [) |3 A4 q8 k3 z8 H 8 G* W- J( S+ H$ K. p, a eclipse C/C++版本 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了) 8 y( w. Z- W# V, x# y% F& i ![]() ! E) F, A; w$ u3 u " X' t, e+ T. u' t3 ^ 安装GNU ARM Eclipse插件。 + M, h }8 o2 P6 i* R 用xpm工具安装: * a. C0 y! E+ h; m$ p7 q% A1 L& N. j arm或者riscv平台的工具链根据工程需要选择。 ![]() ( ~0 t+ k, }. N2 v, P A$ l% { ) y$ ^/ {9 j) L0 ~) T9 O* E+ B 打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。) U4 Z5 X7 y3 C$ ? * O4 i+ V0 S5 c( l& C ![]() 选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。 创建一个基于STM32f7x系列的空工程 & G: F* }1 N$ x, y ![]() % u, D2 P! o+ f# Y( O: a 然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。! A) x. z* J% S/ e, U7 h f; L. ?1 t% n s ![]() ! L3 E1 C+ [" R1 W 2 v; D' W( c. \. J6 K 2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法 ①选择工程-> ![]() ②勾选Enable project specific settings & r9 c& d3 T5 D! O ③勾选Index unused headers as C++ files * p: }9 D, E. d7 D8 W ③勾选Index unused headers as C files - C, y5 c# m0 r7 A 3、提示错误“③勾选Index unused headers as C++ files”+ t+ b2 g* Q z$ y8 g 解决Eclipse semantic error 项目->properties->c/c++ General ->Code Analysis9 u" c7 G( P: B$ S; C% q1 D* s (1) Potential Programming Problems No return value 7 T& }- c. h$ K: j0 z' H- M Unused return value Assignment to iteself 7 H3 ]5 j8 u7 A2 ^ i" p! T" @% G (2)Coding Style 全部 1 U3 C; i6 h) h7 w) Q (3)Syntax and semantic Errors全部6 @3 ~) c$ ~4 C2 s$ ^% Z (4)Securirty Vulnerabilities 全部) z. _% q- \5 M$ x ) I+ ~ q9 t- p4 t0 D; y 以上内容全部勾去,如下图所示 ![]() ) v4 f7 r7 l5 X0 _, I( r * f# u& v/ W; I5 b ) a2 c8 p- E5 I6 w6 }" K( i! o 4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,, T! ?* q5 M# `8 D6 R R3 Z context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode 网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb/ _! b0 L1 C* s. O5 c: B9 A 3 I( ~7 v8 N7 [% X+ w7 S ![]() 编译错误可以解决,不知道会不会导致运行时出错。+ t6 u6 _3 o& t0 ~+ V! F t 另外选择用硬浮点的设置方法:: f/ K* |6 {: R' S ![]() ![]() ) d# F# N; k5 \; u, r # U0 w9 c8 x: ` U5 ^8 D 5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误8 U% y. `5 @/ J" F divsi3.S:330: Error: Thumb does not support conditional execution1 L% b) p! V2 ]: z/ a+ Y2 l/ I# h 看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。 6、HAL库中的接口未定义报错 Description Resource Path Location Type3 K5 v: _, h+ z; k2 t$ c undefined reference to `HAL_UART_Init' main.c /mkwsf7/src/app line 305 C/C++ Problem2 [/ e( b# T6 Q2 k+ A$ q$ }/ u" M . T: m0 X$ e( |9 Q) |9 M 创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下: 9 n" |" d! l1 N" Y$ y- g7 ~7 Y ![]() 8 N8 z6 M; @* |$ \ 4 D7 N0 {$ e2 w% C, _2 c a 解决方法:* ~! t% X' [* z- O6 J properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。" h% C1 p4 `" v4 e: ~. C7 W+ P( l ) a" Y/ V2 B/ I: ^9 d 7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。 ![]() 6 g1 a9 g; S' D: y2 f * i& m, ~/ N4 Y! r- y) n, N8 D 8、出现一堆系统调用接口链接失败 类似这样的报错:8 s* A2 f$ l( e* b, }
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。0 A: C" d9 X# Q6 ~ 独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。5 ?. x; w1 T: K9 |+ M: |4 P 3 z6 l9 C# F; K1 s8 B, e$ r8 r 默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。" M# K* A/ d8 m ! ~0 f+ u& u- P5 D: f 除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。 D' W+ x! }7 G. x5 H 9、编译出现如下错误: o, A8 j# @. n) V, S7 [* j3 f In file included from ../system/include/cmsis/arm_nnfunctions.h:163,' e5 R4 r5 z5 F! ~; \2 C9 z" g from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18: |7 |# D' r7 e9 e; o ../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type * j5 y* _) B! F, H6 W& l1 C 452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15) % ]6 q8 U3 C3 Q0 C y | ^~~~~~~~~~~~~~~~~~~~ / \) m; [) a% t& t- e ../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type 467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)/ v7 Q) t3 d+ n# ?2 V | ^~~~~~~~~~~~~~~~~~~~ - [7 i$ j1 ~* ~* J ../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type( v. a0 N* I4 d9 A: G: u0 d S* O8 F' u ( j5 n9 z" F% @) ?; t 481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15) 7 J- ]( B1 m+ p/ d% Y$ e# s @8 w& d* i | ^~~~~~~~~~~~~~~~~~~~ ../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type . y4 C5 E0 p( H9 I# e4 ~ m 494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)$ C: m* X% l- L4 m e 大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。 10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory 32 | #include "cmsis_device.h" | ^~~~~~~~~~~~~~~~8 F$ k. g7 {; y3 F% A 6 x& R" w; y& Q: }$ V9 Q compilation terminated. # I; z' B/ b' M: L. s* p. i( y system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed1 X0 W9 b/ O7 Q- B/ U. }& C8 | ; ]2 F) p& E) {6 A1 S1 Q( J make: *** [system/src/diag/trace_impl.o] Error 1" a; \# K7 L0 F: x! l: } 新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。( w/ N8 C R, o% N$ n ( b `8 u( C6 w' o4 q |
【实战经验】基于STM32F7的网络时间同步例程
STM32硬件结构学习
STM32中BOOT的作用
【STM32F769I-DISC1】开发板刷入Micropython并完成点灯、读取内部温度测试
【STM32F769I-DISC1】测评01:创建STM32cube IDE 工程,点个灯
【STM32F769】创建deepseek本地服务,并实现http请求
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
coremark移植到STM32F769I-DISCO开发板的两种方法
【GUI板免费申请活动】【圣诞GUI】使用F746-DISO基于TouchGFX的圣诞树
刘氓兔的杂谈【001】-片上USB 高速PHY