由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。 ( ^0 U$ f1 |' R! l Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。 CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。, c' @- }2 v+ ^# q GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。% O, F. n# r, K9 | Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。4 u5 x; _! C' u( X" j. A, c9 y1 S* d& H ' q1 Y; d" ]) `. F& D3 S z d GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。 6 ?- j6 l$ j2 e3 A4 i 下面介绍下我自己的安装使用过程。) W3 U1 x: @. D. `- R2 Z8 T6 M 1、搭建基于eclipse的开发环境需要安装的软件包:0 F+ F( `: N9 A+ _9 u$ n- V+ J 4 F D6 H9 X/ y 2 M# _1 i6 `% W/ h! g ! K. M- H! w. Z2 c8 O 6 ?1 D4 w, j; \! Q9 {, ~! e5 P 按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。, c! v! ^, W! z% Y! n! e; u4 J; _ 9 ^9 W- H5 L3 X. A$ Z 点14.15.5 LTS 下载 * x- _+ O6 y8 l2 i% ^ 双击安装 1 Y/ ` `) \! S 安装完毕后用npm命令安装xpm:npm install --global xpm@latest / N4 E' P7 B* y& O3 h' j; q! m* _: a - L0 Y0 [ V( `8 d& A5 Z8 q xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。 3 \6 }" q2 {* F! w. ~' Z eclipse C/C++版本+ h) K7 B* B- E" ]* {1 ?& D& H 8 W. Z) d' i5 u 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)8 G2 \% t9 ^& k) D+ C1 G . P( j1 d5 @% ^' _: b1 Q; ^. J & J( A" k% V1 G/ n \/ G% ] P" Q1 K* w# k 安装GNU ARM Eclipse插件。3 e% u# x A$ i6 O; x 4 [" z4 q' u5 g4 [ ? 用xpm工具安装: 4 x+ V# j. I3 p c4 c9 v arm或者riscv平台的工具链根据工程需要选择。 * b& n* D* f! r- h0 p% [" y 打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。 $ q, D) D9 H1 K 5 _& i! H) S; N 7 g" X: Y% g s B6 S 选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。 3 w, Y7 x6 n( @0 W 创建一个基于STM32f7x系列的空工程 然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。$ D: @% j3 Z+ t5 G# u& g4 s: j h$ d: D& ~5 n7 A6 @0 o 2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法$ ~# `. b0 t" R9 `& q/ N ①选择工程->roperties->C/C++ General->Indexer! S/ H* B$ l& E; U . R+ N$ i- Y, D ②勾选Enable project specific settings8 F: f& H' j( Q1 R1 q: D ' C+ ~8 C* }# Y& B' j ③勾选Index unused headers as C++ files ③勾选Index unused headers as C files# K& L( v+ |9 n/ a; o5 c 8 a% t) K% z/ e7 k" G( r 3、提示错误“③勾选Index unused headers as C++ files” 解决Eclipse semantic error ' l1 V! t) ]8 O# H/ h' h 项目->properties->c/c++ General ->Code Analysis ) z5 g( Z3 i+ U% n+ r8 w8 F (1) Potential Programming Problems No return value # u: q9 K! S3 ~ S Unused return value + o" g# I, a, x' R& G Assignment to iteself (2)Coding Style 全部 ( Z& A9 s+ M! y: o (3)Syntax and semantic Errors全部 (4)Securirty Vulnerabilities 全部3 Y: c; j( T) T8 B1 l: M, p 以上内容全部勾去,如下图所示 6 {% q& b1 \% o, {; n9 w0 D 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 0 A$ p! T( H% `# m . J1 P: j$ f9 t2 i7 r 编译错误可以解决,不知道会不会导致运行时出错。2 ^& {' Y i( w' z3 R3 W- o1 t! J 另外选择用硬浮点的设置方法: 7 ^8 J `" ^, @" F2 ^4 P) @+ W" } - O1 p, y% D+ j0 E 7 j. d" ~1 \% G/ Y 5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误3 U; c$ G2 {) g+ S: O" k. `' g7 W divsi3.S:330: Error: Thumb does not support conditional execution' u& g9 P# g% _1 ] 看了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文件被斜杠划掉了,如下: 解决方法:" g: w; J5 H, w8 v7 e$ R : s P8 S. h- x0 K7 S# D9 `' M9 E" ~- c properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。7 [8 _+ O9 r i. J, i, r 7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。 % e3 Y/ V1 j8 E I3 J1 I$ c ; D5 v" i) A# b8 a) ~ 8、出现一堆系统调用接口链接失败 类似这样的报错:& Z, }' p* }( R% A. U
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。 独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。2 d b. C* _- e, t4 ` 默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。 f+ R+ J/ k4 X2 }% U9 C# {& N/ a 除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。4 N e }0 M! n( | - Q t& {- [* C; L ]9 H- { r4 N 9、编译出现如下错误: In file included from ../system/include/cmsis/arm_nnfunctions.h:163, / B$ I5 H- n* t5 N from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:8 i7 }( H/ S. u+ i. d& D ../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type ~) f9 w" }* r' n7 o) ^ 452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15) 1 j8 s! D- T! N5 e$ T | ^~~~~~~~~~~~~~~~~~~~" I& J. z" K0 ~1 Z; E ( D0 C8 q: \9 H# `3 G/ L+ J ../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type! b1 m) T$ C$ E! D 467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)9 W* A6 J; x4 m( ^ | ^~~~~~~~~~~~~~~~~~~~ ../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type2 B" R/ @5 I( G2 ]: [ 481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15) | ^~~~~~~~~~~~~~~~~~~~% a9 r% {$ a% l; {& C3 F6 B ../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type e' A0 K% \5 @+ r( s1 { 494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)* P) ?7 L. i) s+ f5 j/ T4 G 大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。 10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory H1 g L1 I+ c! T 32 | #include "cmsis_device.h"+ H& n/ b# U8 e) @' I$ n3 H ; i, u, a# Y+ K1 s+ j5 ^+ K6 O+ y | ^~~~~~~~~~~~~~~~8 k4 @& I U" ?0 D0 m1 B5 T compilation terminated. system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed make: *** [system/src/diag/trace_impl.o] Error 1$ V9 C4 l0 C$ ]8 M4 U7 h \) y: f. f 新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。 - S- g) ^3 @. l' } 8 o* d6 m9 Y: D* K* N1 x9 } |
基于STM32F746G-Discover的扩展电路板
【合集】STM32F7教程、资料大集合
F769 Discovery实现播放U盘音乐的播放器
STM32 VS Code Extension (在Ubuntu上开发STM32,ST官方vscode插件使用指南)
STM32F765@216MHz跑NES模拟器【代码】【视频】
基于STM32F7实现ADC软件触发+轮询采集
基于STM32F7进行ADC采集解决更新问题
基于STM32F7使用定时器经验分享
实现基于STM32F7中周期采集
基于STM32F7中实现采集和中断