
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。/ `1 t |/ j( ]- [# }8 Q0 T $ S2 j) d! w0 O% K( Y Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。- {+ {2 h' e, Q' B" |9 o6 s CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。 0 ~; O! p$ I4 t* t9 F( E GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。# I4 @& K3 J& k# \' ` $ k% L2 _% W1 i5 d% p# J Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。- F8 r8 ~" b. y3 A* K GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。 ; {6 l; m9 l' s! L8 k' { 下面介绍下我自己的安装使用过程。$ n2 G. m( H/ V0 E $ ~; N: y* S7 e1 o `/ g 1、搭建基于eclipse的开发环境需要安装的软件包: ) c$ |0 B/ s2 {5 d- e7 x ![]() ![]() # `* _0 ]( m2 U3 Z5 s U5 T 按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。 $ S! Z/ Q. I/ q: p1 Q ![]() 点14.15.5 LTS 下载 ![]() ; u6 I. K. o( g( ~ 双击安装' a8 a, S- J& w& ?8 g- A R ![]() 安装完毕后用npm命令安装xpm:npm install --global xpm@latest % d# I `9 O q5 x/ X ![]() xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。 ![]() # C4 o6 L# Y) r% \' q eclipse C/C++版本! J5 O, ~% k9 [ 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了) & o0 |5 U; ?7 S3 q c ![]() . K$ {) J3 w1 V: Y( m" [! J 安装GNU ARM Eclipse插件。6 m7 }2 O+ C; ?! T 用xpm工具安装:0 D) Z1 C' z$ {& X 8 M6 Q) h2 V% ?. ] arm或者riscv平台的工具链根据工程需要选择。 & u/ {6 `+ e% H ![]() ! \! n1 H5 Y8 ~# [ 打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。8 p8 i) e# j0 @ H 5 S% R, s5 T) {6 j7 p ![]() 6 ?/ C9 H4 j, ?- G2 K 选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。6 w; m1 K, P0 J ?6 N& Z; S7 J4 F 创建一个基于STM32f7x系列的空工程 $ p9 x* u2 M5 [+ J0 G% m ![]() 然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。 ![]() 2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法5 i3 s- t+ R0 _% ]2 O2 T ①选择工程-> ![]() ②勾选Enable project specific settings ③勾选Index unused headers as C++ files ③勾选Index unused headers as C files / C4 o+ U) L! ~ 3、提示错误“③勾选Index unused headers as C++ files” 解决Eclipse semantic error # [6 ~9 Z! A' i' S2 F4 O# M9 F i 项目->properties->c/c++ General ->Code Analysis$ Q6 k" n! S2 [/ o& f (1) Potential Programming Problems No return value Unused return value6 ^7 F9 n0 v, s& }3 E ( w4 }( V+ J X Assignment to iteself5 |+ D! h Y* B6 f2 U+ B: E5 W! f 5 E! [3 A3 N! f! U. ]# Z (2)Coding Style 全部; p: ^5 ^0 N0 a& P: e5 @, L+ L, d ; _9 A n# T; Z G- a5 P, o (3)Syntax and semantic Errors全部# H+ g2 ]) E5 N0 } 0 \0 Q) ]0 o& k (4)Securirty Vulnerabilities 全部 以上内容全部勾去,如下图所示 ![]() 4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误, context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode 网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb+ j0 [, A/ U( i3 v ) K+ ^& ^; T/ Y) ^' b( g ![]() # ~3 M5 n- l2 v5 H: A 编译错误可以解决,不知道会不会导致运行时出错。+ ^. q; q, Q1 f; B7 e( }: c * |: a7 q& n p, H7 d4 I3 } 另外选择用硬浮点的设置方法:+ f% D9 i) a7 I+ \; k" u3 } ![]() : p4 a% J" K, n: J ![]() 3 ?/ s1 W$ Z% l1 }9 a } 5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误 divsi3.S:330: Error: Thumb does not support conditional execution' u- j8 M) s4 L7 u$ `5 z0 | 看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。 6、HAL库中的接口未定义报错 Description Resource Path Location Type undefined reference to `HAL_UART_Init' main.c /mkwsf7/src/app line 305 C/C++ Problem 创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下: ![]() v8 R/ |7 j2 l* m+ m7 }) ^ * P( H: ]& T, C/ B7 y# \ D4 R2 Z4 o7 m 解决方法: properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。 7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。( X9 ?' k* e7 A; ^ ![]() 7 X$ s' R4 o( }) x 8、出现一堆系统调用接口链接失败/ E W2 k1 n% s3 b: N" ^! Q 类似这样的报错:- @, |2 c2 x( D! b9 E
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。 独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。 默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。 除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。 & c" x0 ]$ W( H* x6 e) j. h 9、编译出现如下错误: In file included from ../system/include/cmsis/arm_nnfunctions.h:163,& `4 J) v+ @( X2 ]* m7 W8 a k from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:5 W# n: m& C$ X! B& _4 r: q0 ] 7 ]3 S7 a: g% M) e+ Z0 Q ../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type# v& d" T: T7 t- J : P- Y. O( w. u+ ]3 Q0 F% p 452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15) | ^~~~~~~~~~~~~~~~~~~~ o0 X! q6 o) T5 Q# q4 R5 ` ../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type6 @9 J+ g& J M& u% s, N# b) m/ d1 n 8 ?: @6 C% ~1 b( }/ U 467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)9 w3 _0 ?& {* `7 v " a( p/ J8 n! K& L# ?' c: o | ^~~~~~~~~~~~~~~~~~~~ * L3 @( L1 T/ C ../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type( E+ \! ]: `5 a6 x% B8 s7 ` - g# ]% F" E5 a 481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15): V/ E) f$ ^, {8 c8 b$ L+ t . c0 ^1 Z) n i/ \9 l | ^~~~~~~~~~~~~~~~~~~~) d: v+ J) ~2 g! J$ b ../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type% I, ^+ L1 P: J" H& ^' l) e % e+ w. ?+ M) V2 H 494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)) N6 [$ Z$ I! }3 f6 g+ z- T 9 E# m! m7 R5 r- f8 c 大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。 10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory0 H0 V/ u$ `+ [ 32 | #include "cmsis_device.h" % P% {) S5 p( T' l# T | ^~~~~~~~~~~~~~~~ # Y& [5 i+ X: S5 t4 M0 G$ p) G" q; g compilation terminated.. G/ l/ p; \: R( j5 b( c( W% j 8 p% A# }: |! T. b! j system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed6 v$ m; a: [! Q make: *** [system/src/diag/trace_impl.o] Error 1* o) {; N7 g* b: g; I0 H 新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。1 \! ?* V" ~& E7 ~, T ~; b" b0 j% j |
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教程、资料大集合