
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。9 l$ `4 _ K1 y" b7 r# {$ d 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)插件。 # ^$ `% B# Y6 ]2 g% e GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。 3 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工具使用。 % X: e& o7 c# D x- D GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。 T' y Y/ |; L$ W7 }; f ' N; {- t7 d' K+ Q1 f 下面介绍下我自己的安装使用过程。 4 v8 T* K4 E1 t; e# I2 ^ 1、搭建基于eclipse的开发环境需要安装的软件包: # L& A+ D2 S6 ~/ ? T0 p' \& v1 i ![]() ![]() `7 }7 V0 E/ u- B" I- _ 按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。 $ w N: L- z: v6 ] ![]() 点14.15.5 LTS 下载* d' o; m+ [3 D2 P s5 ?+ f+ M5 Q ![]() 双击安装 ![]() , E( p1 b2 x# o. R; ` 安装完毕后用npm命令安装xpm:npm install --global xpm@latest ![]() xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。 ![]() eclipse C/C++版本 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了) ![]() 安装GNU ARM Eclipse插件。9 G9 l4 C( |. q8 I# b8 B - ^& N7 K7 f/ O' D: i3 ^ 用xpm工具安装: arm或者riscv平台的工具链根据工程需要选择。 ![]() % v7 ^( E$ a' b1 v 打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。 ![]() / r9 f- u0 Z. ]; x3 E. l 选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。 $ U/ L6 k: h2 c! F1 ]9 |( H 创建一个基于STM32f7x系列的空工程 % H8 n, c+ C: I9 }8 \+ ~ ![]() " E# U& E- R$ Q4 j0 D' h 然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。1 a9 x. j3 }2 ^ / \! S( @5 o T3 f. B9 _+ Z( J ![]() ' o$ A8 R4 y q: C6 Z; F D* ] 2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法 ①选择工程-> ![]() ②勾选Enable project specific settings / z0 P% K; Y8 l* u1 _4 z, T. o ③勾选Index unused headers as C++ files ③勾选Index unused headers as C files 3、提示错误“③勾选Index unused headers as C++ files” 解决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 (1) Potential Programming Problems No return value" v* O u7 k4 I3 w6 V8 D Unused return value Assignment to iteself6 p$ t( y/ M7 J! E! _$ X (2)Coding Style 全部1 |! W& Q! O. C; e; { { (3)Syntax and semantic Errors全部! _; m! K- Z. A( c6 s% `9 s n9 {! U (4)Securirty Vulnerabilities 全部 ! t' H" f4 h$ _0 h( U+ m 以上内容全部勾去,如下图所示 ; E- q: O! I4 |( |5 h( o/ k3 R' e% R ![]() 3 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 mode4 n' j1 }1 W) K: u* j; g 网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb( b, G3 h+ q3 J+ h ![]() ' f- K1 s5 Q) O* f, D2 G0 X 编译错误可以解决,不知道会不会导致运行时出错。9 ^0 J1 }9 S3 O4 p4 j7 J4 b 另外选择用硬浮点的设置方法: / {- l. N' K# e# Q1 |0 K0 z& ^ ![]() / Y6 k1 d& c& @( K& _% u s ![]() 9 t z4 S/ _& _ . [1 w' T( N0 u" B. K 5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误 divsi3.S:330: Error: Thumb does not support conditional execution0 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 @ 6、HAL库中的接口未定义报错 Description Resource Path Location Type* x7 o' i* e q7 _; c& ^" _# V undefined reference to `HAL_UART_Init' main.c /mkwsf7/src/app line 305 C/C++ Problem' }! M: R* I3 y, |( {2 D- @% t q 创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:5 X6 f3 R1 t0 m8 g. F l* L 2 z; F# J3 J) y. t8 ] ![]() + `3 I2 C. V' G: r) K ' _: J" w+ \6 p" D/ M) S4 T; X& R 解决方法:9 D0 ~) o/ w1 v4 n5 p" U2 T properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。 7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。 ![]() * o+ N8 R4 O0 t 6 L' K5 x4 P [% g+ A% m 8、出现一堆系统调用接口链接失败- W: h# Z4 c/ p! {$ ` 类似这样的报错:
在_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 J8 J" t `1 X- v2 |* c6 l( c 除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。 4 h. |. G2 K. D- T% Y# n 9、编译出现如下错误: In 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: ! 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 | ^~~~~~~~~~~~~~~~~~~~ 7 ~( 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 | ^~~~~~~~~~~~~~~~~~~~* {5 u- y0 U+ k' ?4 n0 x5 T ../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) | ^~~~~~~~~~~~~~~~~~~~ / y! j' [ y. n( d$ l8 c$ Y ../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type ' ^) A, i% f2 f) Y2 B) y& b 494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7) 大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。7 G, p9 I+ S: ?! v3 n& d% ^' }+ J3 j 10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory 32 | #include "cmsis_device.h"" E/ ]4 A' L. v5 { | ^~~~~~~~~~~~~~~~: S. q1 G' m0 {5 T3 P) c: j compilation 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 make: *** [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"即可。 |
【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盘音乐的播放器