
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。 " \. `0 `: x# |7 s8 f" x% @9 W* \ Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。 CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。 GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。 Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。0 |7 L" r2 u1 \3 Z/ r7 o GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。/ w, }. _0 |9 \* v s$ Q' [% V 2 T+ Q" [" e# `6 Y 下面介绍下我自己的安装使用过程。 7 W l5 @! L- y& u 1、搭建基于eclipse的开发环境需要安装的软件包: ![]() ![]() 3 k: H3 k$ ^8 A- Q% a. ~0 ~ , T. ~% ^+ ]) o3 o- B 按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。/ z- a: H6 |# f* |, x* ~ ![]() 7 f( q* `/ Y/ r5 N 点14.15.5 LTS 下载4 `+ J1 l$ M6 c# ]# z G ; R: Z/ i( i, o. o+ S n1 w. ^ ![]() 双击安装 ![]() ' L# Q7 g( t6 ]# U* P9 B 安装完毕后用npm命令安装xpm:npm install --global xpm@latest ! k: u8 i8 M( p* V5 j ![]() xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。/ u' j. h' D& i- ~1 E% U ![]() * y1 Z7 Y- U) \ eclipse C/C++版本 # u/ ?9 ^1 j; Z* B" A 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了) ![]() 3 S0 W5 M( A0 i) g, s0 h 安装GNU ARM Eclipse插件。) }8 c, x$ d8 p& \1 @, N, x 用xpm工具安装:9 h6 x0 M7 L* \: \( [ arm或者riscv平台的工具链根据工程需要选择。 ![]() . I( f7 i) f6 l. T 打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。 ![]() & ]' m+ u/ i: j+ }* q. @ 选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。 创建一个基于STM32f7x系列的空工程 ![]() + W/ p4 d5 R$ H% ?* w5 P* e$ \+ g 然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。 ![]() / ~! Q; r, Z- H4 ?5 }1 p% b ( p5 U4 R/ Z$ s# }7 z9 F8 n 2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法 ①选择工程-> ![]() ②勾选Enable project specific settings$ ]- c0 q7 u! B# \! [0 k ③勾选Index unused headers as C++ files ③勾选Index unused headers as C files 2 Z. T' E* M* H% E; D& B A0 O, c 3、提示错误“③勾选Index unused headers as C++ files”' U$ J5 E$ k2 J# z3 R5 s4 g6 y; N; F 解决Eclipse semantic error k' C* @2 [6 V/ h 2 Y6 D% m( j! i4 L 项目->properties->c/c++ General ->Code Analysis 1 O2 E& `8 x S (1) Potential Programming Problems No return value $ p5 E* h3 G9 G% d* ?3 s I Unused return value Assignment to iteself8 [2 y. J* Y8 s (2)Coding Style 全部/ K; `; J, \& w! p* V" r (3)Syntax and semantic Errors全部 ! d! O0 U: {, s4 A) E (4)Securirty Vulnerabilities 全部0 w. L r# Y# \6 Q* V/ q2 d! V 以上内容全部勾去,如下图所示 2 E* B3 G, R, E& {6 F ![]() ) b' Q, r* r/ k C0 H# b 4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误, context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode# z" a$ [2 q! J A1 j; B' O2 k; k% k 网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb 1 |, t5 D1 P# \, e- X ![]() & _: A2 _7 D u! B1 A 编译错误可以解决,不知道会不会导致运行时出错。 - [) r- N8 U+ i9 r 另外选择用硬浮点的设置方法: ![]() + Z3 u5 e |4 F7 e6 h5 g ![]() 5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误2 c. W( }' m4 ^& N5 k/ ] divsi3.S:330: Error: Thumb does not support conditional execution1 V* r8 M$ R* P; ` 看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。1 f; q- R# u+ o; Z0 H 6、HAL库中的接口未定义报错 w5 D3 g% R* x" a; f5 f. w! | Description Resource Path Location Type- m' d+ L; |( A0 W undefined reference to `HAL_UART_Init' main.c /mkwsf7/src/app line 305 C/C++ Problem " k) y6 c7 w% N4 L 创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:' ?9 J! |- y+ [& ]% ^/ J3 g3 u ) n3 c1 _0 L1 n' J ![]() 9 j* b+ U( w# ?3 ]) i' e$ h2 Z0 R 解决方法: 4 n# H" g8 ^/ S5 K$ C% q& l- M8 u" }5 ? properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。$ @4 _' v [% U8 n 7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。 ![]() 8、出现一堆系统调用接口链接失败. r, V1 y( B9 D8 Y9 {- a% n 类似这样的报错:
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。 独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。0 t2 i1 Z$ \/ e: O! j1 R1 g, Z8 p * e) }# {; \1 G3 B2 s 默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。 除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。: h' e* N( [# f, @" Z- r0 x 9、编译出现如下错误:2 S& k1 q" G4 e/ m$ i In file included from ../system/include/cmsis/arm_nnfunctions.h:163,0 ^! p! n1 ^- \ 2 p. x3 n2 c- a3 m& r0 y from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:9 L* A2 b S4 \; F* b5 [- {5 a 2 h3 ?3 k! {3 Z* w& Z ../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type 452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)( v9 X; \) C6 n/ K/ J | ^~~~~~~~~~~~~~~~~~~~& ]3 \: d/ R( k+ Q7 |* A( | ../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type, g. N% \% ~9 v9 i% } % A' |, E8 E) A! ]! C, w, x 467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7) $ x+ B6 Y4 |; L | ^~~~~~~~~~~~~~~~~~~~* j+ l$ J" I' W) a - ~8 `8 k% Y, B, A- u9 _7 s ../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type 481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15) | ^~~~~~~~~~~~~~~~~~~~ " e! ^" @0 h X; c+ k: z* h* ^* } ../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type" A4 w3 L8 k* x: Y! v " g/ n0 W( H9 A `/ H* b 494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7). M0 B; A. W2 d& W/ u) H/ A% U 大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。, ?+ K' S" }5 y2 S 10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory 32 | #include "cmsis_device.h"+ k% p$ J; g- O$ S3 E * _! O5 y# C; V' o* S7 V3 }1 b | ^~~~~~~~~~~~~~~~1 X7 M" n& h; ~5 ? compilation terminated.& _$ e/ p- A: ? 5 T/ S6 i7 g4 {5 U5 j* ]* q1 W( A system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed2 z. ]. S+ Y9 w9 j1 V N c+ L5 t, e6 A+ K& l: W) m2 j& r make: *** [system/src/diag/trace_impl.o] Error 1- u3 a# A+ Y8 y9 e, L& `* s 2 P3 _$ V$ T$ E 新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。/ e8 C8 P; ^. D2 F/ e$ A- Z5 o1 d+ R ) c5 {' X Y& ` . o5 l: M* K+ l8 a) l8 p' i. T |
【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
【合集】STM32F7教程、资料大集合
基于STM32F746G-Discover的扩展电路板
F769 Discovery实现播放U盘音乐的播放器