
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。% |5 i7 q* D! Z+ W Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。 CDT:开发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工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。 % 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 GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。 下面介绍下我自己的安装使用过程。9 l1 G9 }1 f. U( j4 g* N- Y8 G# S 1、搭建基于eclipse的开发环境需要安装的软件包:, x/ X. U: b) T+ x ![]() 6 K% Y' v! A0 a' u4 |7 r ![]() 8 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* ` ![]() , V6 h/ I" S+ f; W& c/ C% j 点14.15.5 LTS 下载 ![]() 双击安装7 Q& v7 y( |+ n; z( g * A$ l- x* H1 |1 e ![]() 安装完毕后用npm命令安装xpm:npm install --global xpm@latest ![]() xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。 ![]() eclipse C/C++版本 m' Z% H7 Q, L: W6 b, X _2 J % d" ~, a9 b+ R4 Y9 l 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了) ![]() 3 B: Y4 e& T' t: V 安装GNU ARM Eclipse插件。 9 }6 f z& Q. [% P/ r% [* k! e 用xpm工具安装: ! Y. Q9 E* L) D2 K arm或者riscv平台的工具链根据工程需要选择。: v3 l4 o* P0 x5 @* P ![]() $ ^8 T6 A* x3 j# L6 F0 y3 n 打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。 , J" H, z6 p; w ![]() 选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。 创建一个基于STM32f7x系列的空工程! W3 v3 L/ Y) J 1 N& R, R7 q: A3 b ![]() 然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。: F7 R# y6 {2 ?- T3 Y; x. @7 A+ l6 Y: I; i: u - s0 u4 S: f Q' Z: e) y( ^ ![]() ' h+ r2 S; ~/ ?6 z- m9 y6 V& G( z3 t5 \ 2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法 ①选择工程-> ![]() 3 C3 w+ p5 z8 e ②勾选Enable project specific settings 6 }0 o8 f' T7 ?: p% c' { ③勾选Index unused headers as C++ files ③勾选Index unused headers as C files2 N1 [$ ~+ b! c5 t( X( W4 n# ` 2 M) m5 o* m% l$ N* w 3、提示错误“③勾选Index unused headers as C++ files”; E% _& k* N7 B4 A6 e 解决Eclipse semantic error 项目->properties->c/c++ General ->Code Analysis (1) Potential Programming Problems No return value0 u* |& p& I0 p& U( g* C Unused return value Assignment to iteself (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 (4)Securirty Vulnerabilities 全部: Q* a9 l5 r0 B6 s& C! ? 以上内容全部勾去,如下图所示& h: W; L+ s0 g4 i' E ![]() 1 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 mode6 k. Q M" T$ B- q2 C3 c6 \ 网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb3 R3 p, @ r) ^ ![]() ) o. T* a' j# L' e 编译错误可以解决,不知道会不会导致运行时出错。2 j; ]. A. K4 z3 o1 [$ O \ - U' u3 {3 T( U2 z) `9 `. i) u5 G 另外选择用硬浮点的设置方法: ![]() ![]() 2 E& s4 _% c# U: d$ y% _ 5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误( h* f; X# K2 P7 O+ ` divsi3.S:330: Error: Thumb does not support conditional execution 看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。 6、HAL库中的接口未定义报错& S* K3 K4 x$ T" N; e! K$ o9 t Description Resource Path Location Type7 U3 y& Y0 t" I0 R7 q undefined reference to `HAL_UART_Init' main.c /mkwsf7/src/app line 305 C/C++ Problem * W, @& y4 n7 w3 h! ` 创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:; ~. E/ A! J4 k8 @9 E( M ![]() 3 w" b" v. W! M! V8 a 8 }( }8 E3 k2 ~; @% Q 解决方法: properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。 7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。0 `8 l0 b0 ]$ P% w/ x . _/ q: H- u6 p$ [7 J) d7 g3 L ^ ![]() 8 s" Q0 g: v4 H 8、出现一堆系统调用接口链接失败 类似这样的报错:8 u# u4 J/ K/ Z8 w
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。 独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。 默认情况下,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, from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:; d3 n0 f g( y% X( r ../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type1 Q: |+ N9 D+ b 452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15) | ^~~~~~~~~~~~~~~~~~~~: @3 p3 L& |- F% p \2 b ../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type C8 s" Y6 M8 F1 x4 T 467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7) ; W9 v/ F/ c) Y3 \5 F$ Y2 Q, X | ^~~~~~~~~~~~~~~~~~~~ ../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 481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)5 Z' i" k% M& W8 ^0 _- 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) 大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。, I @6 L0 p9 t 10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory 32 | #include "cmsis_device.h". T( m/ {$ u+ l* D 9 o5 g4 P Z6 { | ^~~~~~~~~~~~~~~~ . ]+ 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 & z5 ^ ^8 _$ [6 e2 X. R 新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。$ `; ?: m2 V v- ]7 I |
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
【合集】STM32F7教程、资料大集合