STMCU小助手
发布时间:2021-12-13 22:50
|
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。 Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。 CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。. T, x+ Z+ R+ |3 S7 t & r* z) Q5 u6 f8 ?$ {0 G! r GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。; F) ?! { F" o6 t) M- b4 O 4 ]+ i; E1 p' A( x m Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。9 m b/ n/ w9 y - h. c5 D- x) w) i# l! I( o GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。 / N3 x# f7 [% h. q 下面介绍下我自己的安装使用过程。 , q7 K' f* c" s2 m& J6 l% r 1、搭建基于eclipse的开发环境需要安装的软件包:" d4 M' I1 x+ y& U8 s0 f: x0 S 3 F' v* W2 h/ L4 r; K8 o
, h- \& a: E/ Z; k( O- n$ s 按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。, a& T {" H; b4 f
0 r% H# O( N/ o- s3 d! o7 k 点14.15.5 LTS 下载
双击安装 ; X0 ^4 A3 e6 T5 l# B
2 l& U9 W* c( g1 M 安装完毕后用npm命令安装xpm:npm install --global xpm@latest$ ] a8 b/ |8 O. ^8 a3 S
0 M! K1 S" ?# }) h( } xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。
eclipse C/C++版本) e m* r, _! H: x$ ?9 C4 p 9 d4 y1 O. c* c1 r 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了) a3 t1 n, E' P ( u* g. z/ g/ r. }
安装GNU ARM Eclipse插件。 用xpm工具安装:0 u5 i" u* b% o9 l 5 S% C4 k- j1 S4 R7 t! Z( o arm或者riscv平台的工具链根据工程需要选择。7 z7 R6 Q) q: q/ y2 b& }3 Z % P: r* t+ I. l) J
% \; o; G. S. Q0 a' N$ c" o, d# i % J* |" [: I" G. V; y$ j 打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。' T7 m' Y3 V* C& z / ?/ j, _# Y- l: q' ~; n
+ u( o- D3 E+ s* l$ C$ q5 m% i 选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。 创建一个基于STM32f7x系列的空工程& ]. |9 _! A4 H; V, \( b) f: ` 6 ^6 D. Y6 ~% F$ g7 I
* h' P& K: P% G, [1 r; f: R8 w 然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。 # }& z# ]2 H* ?
2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法 ①选择工程-> roperties->C/C++ General->Indexer②勾选Enable project specific settings 5 E- |8 ]9 ^' ~! m$ Q ③勾选Index unused headers as C++ files ③勾选Index unused headers as C files, f3 h" \$ X E 9 Y8 w) d" ]' S " O( }; Y' ~" e2 w T 3、提示错误“③勾选Index unused headers as C++ files”0 Q) Z0 U0 K- V1 Y6 J6 n. o 解决Eclipse semantic error 项目->properties->c/c++ General ->Code Analysis; j. |7 e" ]- Z1 T (1) Potential Programming Problems# d8 T6 \) }, U- c1 M No return value " k; X+ l) R6 C8 B" S1 E t; R' L Unused return value A+ R5 t8 |4 ~0 d7 A- n Assignment to iteself (2)Coding Style 全部 (3)Syntax and semantic Errors全部; w0 g' m6 I! I$ m3 d& N' j8 Y (4)Securirty Vulnerabilities 全部 . M6 |8 L/ V( D7 Q8 f 以上内容全部勾去,如下图所示 ; G( c4 s* E4 `, z7 Y G
4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,# @. q% }) e ` `, D6 } context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode) ]6 G( S) Z! M" G 网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb 3 ]: I. |0 ~+ q1 v! e4 d
! o. D" w8 \5 s! b6 C- c 编译错误可以解决,不知道会不会导致运行时出错。 另外选择用硬浮点的设置方法: 1 `; F9 L3 l5 _7 n+ A, D/ Z
) h& r1 \/ V0 { ( h8 [ I( Q0 j 5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误 a0 @# U, v& {, `9 Q( b( y. [3 } divsi3.S:330: Error: Thumb does not support conditional execution: i0 k/ M7 J5 z! _/ f 看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。 6、HAL库中的接口未定义报错' h) v8 F6 }& L Description Resource Path Location Type9 a8 d/ C" Q3 F+ ]% Y( E, \ undefined reference to `HAL_UART_Init' main.c /mkwsf7/src/app line 305 C/C++ Problem 0 J# j# b$ W2 |6 w& t4 |3 I- [ 创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:
解决方法:& P+ S2 S$ t" P; G, S; Y properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。* a% H- e- e8 a7 R$ W a: u/ h2 \" B/ q2 U" ` 7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。 ; k! M9 W# z2 P3 N6 r, ~
3 K; }. R# A9 Y2 V ( W8 q+ r* P# I6 D7 z! ^ 8、出现一堆系统调用接口链接失败6 N% p* |% X6 T% G& d) n0 I 类似这样的报错:4 z' u* C O! ?
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。 独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。: F2 S/ \- s# B 8 {: X* s+ i6 j: E4 y" V c5 O1 K 默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。* x6 _3 J: M( a/ W 除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。: R6 K$ |* @/ r6 z7 W 9 I1 {6 w2 L) [" L 9、编译出现如下错误:- i f. B4 G. A9 d% M In file included from ../system/include/cmsis/arm_nnfunctions.h:163, S# N; i4 S& P. V from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:5 Z% |7 \2 b7 k G6 l4 Z$ C( m- c, q ../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type 452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15) , E4 d! X" J Y* S6 i# c | ^~~~~~~~~~~~~~~~~~~~ ../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) | ^~~~~~~~~~~~~~~~~~~~ 3 o" b+ d- l1 h( @. G ../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)% h) b, W, n7 l: K | ^~~~~~~~~~~~~~~~~~~~ 3 N# l# N5 B) j4 G- T ../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type* @2 f! h/ a% L7 _: { 494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)) o/ U6 V/ P5 n# A! s ' v9 u1 w% l" e/ \9 B 大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。. D( D) S+ F2 x( g5 U. @ 10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory 32 | #include "cmsis_device.h"6 g* y U: G( v2 r/ D' W7 P- s- y$ ? 4 i# V6 S6 i0 c' O; L( n/ K1 s8 G | ^~~~~~~~~~~~~~~~' S/ U f/ i% i+ @7 I6 ~! d: W* a0 D ' B/ z' w1 N A( N+ e3 w compilation terminated.5 |% ~0 f3 _2 P q5 [" \ * E7 Y; B/ x$ S system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed! w0 I9 s! V } " `" o9 ]8 d6 b3 G: y& z3 d make: *** [system/src/diag/trace_impl.o] Error 1 / b4 }; v- A. y: Q) W 新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。 |
基于STM32F767通过cube配置:QSPI接口读写64M PSRAM+flash参考资料...
STM32F746G-DISCO移植lvgl9.0性能基准测试
STM32F745 USART1 Bootloader启动失败排查与解决的流程分析
STM32芯片命名规则
STM32 引脚到底有多少?为什么一个引脚能当好几个用?
入门嵌入式,为什么STM32是“优选起步”?
嵌入式-单片机-STM32 EXTI中断
STM32单片机进行除零运算,为何程序不崩溃?
STM32 LL为什么比HAL高效?
STM32时钟详解
微信公众号
手机版