由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。 Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。 + ~5 W0 ]) o6 M- y CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。3 n8 G; ]3 x/ d ; W$ ]1 ~& b% @4 o" _ GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。 ( u, m# u5 K. w9 b6 V! ^ Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。+ l7 i ~+ K$ I 8 P4 n* Y& X( ]" d3 N( e- I) I- @; s8 M GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。 4 F2 S' [/ Y7 w) P4 W# |9 g- d( [ 下面介绍下我自己的安装使用过程。 " Q g0 o! {5 d e3 W 1、搭建基于eclipse的开发环境需要安装的软件包:' ~) ?/ @# Y U: @' N ! W) ^5 X0 X- A . x5 `9 b% D4 m+ {# X* g, P / f) M& Q; ?; e1 N& D 按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。! L& d f) ?! W, z( o j# i( s7 ]% K; Y7 C+ ]" l 点14.15.5 LTS 下载* N0 Q7 a& s5 ]" I" a# q ( d% {) Q5 M! p6 u+ A 双击安装 7 x' B6 _; @# @) J, r e 安装完毕后用npm命令安装xpm:npm install --global xpm@latest; _) h% X* i4 |( U ' ^7 K- `- b, e xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。. {( h7 h; L4 H ( Y- Y* Y; [& z @7 q, b + g" @7 u" _% P$ t' B5 T$ m" W3 H eclipse C/C++版本5 Q H5 y; t# T+ b1 H 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)8 x3 S/ ` s& i0 g: k7 q/ @ ! [" x6 [8 ~8 W6 I 3 @3 b. T+ {; x8 a7 H' M- o 安装GNU ARM Eclipse插件。- D( r& G3 ` Q7 `: h 用xpm工具安装: arm或者riscv平台的工具链根据工程需要选择。' |: v) J% v1 t! x* b. g4 i C % ^' O# u' T, m 3 n1 @( E! ?6 L: A4 z6 i 打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。% K7 w. D) Y3 |2 t 9 x' i' n% j5 I# B8 i+ d# h 7 T0 r1 }# _3 i5 N2 I 8 s. _7 g# h0 c7 x- H6 X" W3 ^ 选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。% l4 |4 K% f9 |+ C% g3 k! v 创建一个基于STM32f7x系列的空工程/ d$ E1 D; n% O + s( N4 }, Y2 _ l, N6 @' h: ^' V% k1 y 然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。 ! B5 l6 n. M" G7 R7 b/ C : Y8 |# v* V3 k! d 2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法 ①选择工程->roperties->C/C++ General->Indexer. E6 O: K r- l5 C+ P! r: ]7 N ②勾选Enable project specific settings ③勾选Index unused headers as C++ files3 x% Z$ t; \, j5 S h ③勾选Index unused headers as C files& I) C% I3 \* b! P8 w+ f % @5 m: }8 L% K 3、提示错误“③勾选Index unused headers as C++ files” 解决Eclipse semantic error ! }: k$ N* E9 M/ j: p 项目->properties->c/c++ General ->Code Analysis (1) Potential Programming Problems No return value Unused return value ?+ c2 o: A+ X7 g8 j ( g6 ?! B% s+ G& E- r1 \ Assignment to iteself 8 v! I l. m. O& n (2)Coding Style 全部/ y4 R+ j8 ?. ~ F% C4 G (3)Syntax and semantic Errors全部( v" f i. B9 W; [" f0 I2 z: {% m (4)Securirty Vulnerabilities 全部 以上内容全部勾去,如下图所示 , }* A5 G4 s' v1 B: Y( H/ I B. L& Q0 O1 p4 d8 E7 d) r " U, f! T/ x2 {) R 4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误, context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode. x5 s! W9 Q o9 o4 O 网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb, a' j& J6 N2 r & ^& a4 W* G1 B' S! f* k+ m9 o ) f0 t) r) Y$ D B 编译错误可以解决,不知道会不会导致运行时出错。- m7 t" Y1 w4 H) \! I+ B 另外选择用硬浮点的设置方法: " x% B' e, ^' H! k8 |1 A2 C " I7 y7 X1 H+ i% J( r: U" a + W6 o8 e& s8 u 5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误8 D. L% F5 p* i4 B7 D' R. y: h divsi3.S:330: Error: Thumb does not support conditional execution; `$ M; @3 _% `7 ^% z4 [ 看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。 ) V, ?4 S( m/ ?; W5 ^8 d7 L9 \/ y 6、HAL库中的接口未定义报错2 c8 N& b" b$ h 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文件被斜杠划掉了,如下: 7 c: f) @4 U& V. g# S- t0 t 1 u+ X# G4 v; [* F8 L8 b! W% C 解决方法: properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。/ M# Z2 I& {; _ D2 o6 B4 m' v) s 7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。 ) g, {" [: X6 M) J: h* V- u) [" ? - v7 N a) _0 n; J& O 8、出现一堆系统调用接口链接失败 类似这样的报错:
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。 独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。$ B4 F. {' K. Z# m1 U, i1 M 默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。 # ~: B% q4 Z3 w- r) G 除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。! K/ j$ Q+ f$ h2 Z) @ 9、编译出现如下错误: In file included from ../system/include/cmsis/arm_nnfunctions.h:163,% i9 W8 L& y+ p/ {0 @ f8 c, F; I, h' R+ h) ]" K: H8 @ from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:" z) y- b: J, w+ ^# y( c $ W {/ M# d( b" B2 D. Z1 \/ m ../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type ) }5 z- w0 ^9 ^. @1 R. C. v) o9 Y( m; k 452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15) | ^~~~~~~~~~~~~~~~~~~~ ../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type 467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7) | ^~~~~~~~~~~~~~~~~~~~ ../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) $ b% r( e4 [9 s7 p1 T | ^~~~~~~~~~~~~~~~~~~~, c7 [2 Z' `& P& ?% C# N! ]& Q ../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type# g8 p- r& X- G2 ~: h, _ g7 q 494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7), v$ k7 v! o# _3 {6 w / Y# A- N7 \1 [; z: s 大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。 10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory1 k1 {- |8 n. `; V; {7 R 32 | #include "cmsis_device.h"$ O% U. I) m% l' C& [& q | ^~~~~~~~~~~~~~~~ ( s% q3 L) }1 ^3 h. X6 D( a+ o compilation terminated.1 E- a) b0 i% P, k system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed& A# t( A3 D# I3 A7 y4 g: @ make: *** [system/src/diag/trace_impl.o] Error 1 新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。 e! b; L! E! {1 K # J# Y( J1 F3 Q8 Q: v4 G 5 S6 R5 w# Z5 s8 B6 q |
基于STM32F746G-Discover的扩展电路板
【合集】STM32F7教程、资料大集合
F769 Discovery实现播放U盘音乐的播放器
STM32 VS Code Extension (在Ubuntu上开发STM32,ST官方vscode插件使用指南)
STM32F765@216MHz跑NES模拟器【代码】【视频】
基于STM32F7实现ADC软件触发+轮询采集
基于STM32F7进行ADC采集解决更新问题
基于STM32F7使用定时器经验分享
实现基于STM32F7中周期采集
基于STM32F7中实现采集和中断