STMCU小助手
发布时间:2021-12-13 22:50
|
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。 6 Q! `: e3 v1 N( |- D" z Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。" o4 U2 E' I ^+ {. D* w$ D$ w s CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。 GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。: Q, }$ `% S( r& _1 R6 D! U$ v Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。2 W2 S# k+ a- y3 _ d GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。5 _- }$ c" ~) E% C; c 下面介绍下我自己的安装使用过程。4 U. j0 ]# ~6 ^2 v ; c5 Z7 b$ S. e7 t q% a% j, g5 g 1、搭建基于eclipse的开发环境需要安装的软件包:0 F: Z$ O3 b6 x6 c; X6 g% e; Q + X& |1 [: V! [+ a8 [; L5 G& d
) k5 K5 j& G0 X, b* V1 s1 { 按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。/ F# V1 i! ?; I7 h , T- P, @. ~# [ }
点14.15.5 LTS 下载 * j/ |; r! L' E1 |# L
+ M, s6 q$ S% h, U0 c% g 双击安装/ F4 x7 t+ n3 h' s% l9 U% n
8 D+ [& K% L1 k. F: A* D 安装完毕后用npm命令安装xpm:npm install --global xpm@latest ; t' p4 ^( u5 A4 W U2 |/ P2 L7 w; B
xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。 I5 `) O& e3 w9 y9 e2 R+ q& u, x $ |3 r. d& }1 i& }
eclipse C/C++版本 - g8 T: a0 C; G" y+ m 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)
安装GNU ARM Eclipse插件。 + r; e- Z' w; S7 I7 I 用xpm工具安装:) \; O3 x4 W+ f* u* y3 N2 a 3 l" D% E ^! s) O [4 x" h2 @ arm或者riscv平台的工具链根据工程需要选择。0 a( K$ O+ ?4 q$ G& U$ x) b+ k 3 Z$ S2 v& i/ a+ p. R
& w" E+ c6 ]( M ]' m2 r 1 W9 _) ]# ]. v7 S9 Q6 X# H- d6 ` 打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。 - Y {" ^* x$ E" f2 P6 o$ A8 H
& ~9 m9 P, T* N" X % U; N$ \7 m. e- Q4 M% b. e 选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。) s$ o& v4 ~) Y" T( e ' n# [" ~( v% j+ E. y 创建一个基于STM32f7x系列的空工程* k+ l" n J/ n& H 2 H, p# f; m& y, B: j x& j
然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。1 k. ^/ C6 e2 [2 `0 ~- I- J 7 e2 w' H, d- [) A1 B& @
2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法: y$ e- O4 r% v9 r7 f% A) A ①选择工程-> roperties->C/C++ General->Indexer) N ^' H! O. t$ h2 E. ~2 V$ n/ x7 v9 x- W8 k/ z- J7 \ ②勾选Enable project specific settings 2 O3 l# v* A% Q+ n6 X ③勾选Index unused headers as C++ files( t- F5 u& `9 C) ?3 N% [: { * B- B ?# a3 l( z( y6 s ③勾选Index unused headers as C files3 A4 X" K5 _ A& H 2 G3 X, M- M& o m" U* X# F6 G 3、提示错误“③勾选Index unused headers as C++ files” 解决Eclipse semantic error $ C5 w! a8 r) P& L( M- q 项目->properties->c/c++ General ->Code Analysis, g3 @; K! i3 S 4 ~9 k# k: e Y1 p; Y( B3 Y: A (1) Potential Programming Problems ) \% H( ?+ w5 N& v$ D No return value Unused return value! x$ J' u) K) ] l: N 5 K' a0 P5 A0 i$ }# R$ L% O0 M Assignment to iteself+ K% l7 N0 a" k" B- ?" p8 G, H4 ^3 z % E {0 R: D+ d$ W# Z7 d- u (2)Coding Style 全部 (3)Syntax and semantic Errors全部9 P! n9 @8 u) J9 t& P, q " z) [4 J+ ~8 Z- A% D6 N. ~ (4)Securirty Vulnerabilities 全部 以上内容全部勾去,如下图所示- j% D( Z- F' I$ }0 ]' Q5 S
5 ?! J4 Q! E/ S 4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,* p0 W; P1 S+ O9 A9 o; E context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode" {0 b3 S: V. V' Z* l" O- g 网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb) ^7 G& s! K) T
编译错误可以解决,不知道会不会导致运行时出错。( w% C3 u( ]3 e, b& y3 R# C7 O # F. Z7 F3 ]- K1 ~7 i K 另外选择用硬浮点的设置方法:4 }1 o/ a: A* S0 X: ~3 b
+ W: p+ n8 X9 h% z7 C9 y1 }$ K 5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误 divsi3.S:330: Error: Thumb does not support conditional execution8 d6 I" K f8 Z9 M+ `- E 看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。4 b' ^: {4 ^1 X. ?3 o 3 \6 p$ m. {- l+ i9 s: i$ Y 6、HAL库中的接口未定义报错 Description Resource Path Location Type' z. z3 V4 ?( X7 ` undefined reference to `HAL_UART_Init' main.c /mkwsf7/src/app line 305 C/C++ Problem; R. I$ h4 {; T$ ~4 ~ 创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:1 r9 a* [- [# {+ I$ q3 ]7 H ( h1 ~( B% u/ K# M2 z! ~
7 X w/ `4 t: _9 X4 X6 d 解决方法:1 A$ p5 p+ F% ~: I z( x, M / V# J% d7 _2 z9 W1 h: X6 ~+ i7 W1 X properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。. v; \. a2 e6 W7 y; O8 w" p 7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。 3 v: o, Q- k W9 _6 W Q9 o
+ x- t- P; H3 b/ h , r c R* h$ | 8、出现一堆系统调用接口链接失败 类似这样的报错:0 `# \% P3 E8 n
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。- p3 v2 s# _. T9 a' [) ?8 J 独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。6 i9 J3 n8 s7 y 默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。% R! l9 d! Z; W ' r& l! M& T7 O 除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。 T' v) n1 Y3 k* u 9、编译出现如下错误: In file included from ../system/include/cmsis/arm_nnfunctions.h:163,3 d) @3 A) C% P1 z from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:: @3 X7 N) C+ x' Z# `5 h5 O# B 6 ]) A# G1 t1 j0 W! \* Q. Q& W5 F ../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type & e; v5 F' g2 n. A- h 452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15)9 _9 j, K2 @! x" w" C | ^~~~~~~~~~~~~~~~~~~~ ../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type* V; R6 ^0 W& b) p : m0 @% v. e, A8 ~) @$ S 467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7)+ N2 l. j, v4 P+ j 0 {4 T+ D9 U7 l: V, I | ^~~~~~~~~~~~~~~~~~~~ 1 U' C; M1 ]( T$ f3 m% r ../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type* }3 s; @1 E# }8 ?0 h - J0 z! a( _, n 481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15)8 A# ~! S7 G8 V1 d/ L7 j! m 4 J7 f2 W" k9 c6 P6 V | ^~~~~~~~~~~~~~~~~~~~# V: ~3 B6 t- J0 K 1 N b2 ^% n! G( [, j. a7 T( J ../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type4 T' u$ J' m: h' |* d 494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)# b+ }& s) |" F2 I& ~ P 2 ~5 ^4 k7 N, r 大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。& |( a8 ?8 E, I+ r5 U 10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory- z( d5 e; C) ~# ~$ f8 x 32 | #include "cmsis_device.h" / a5 i' P9 {" t | ^~~~~~~~~~~~~~~~ compilation terminated.# m0 I! P5 V5 n5 D3 }6 \/ a . Q+ n9 M5 [2 h 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! A8 N* M6 e9 R& q 0 ]" \ g% C: e1 P# k6 E2 { 新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。 |
STM32F746G-DISCO移植lvgl9.0性能基准测试
STM32F745 USART1 Bootloader启动失败排查与解决的流程分析
STM32芯片命名规则
STM32 引脚到底有多少?为什么一个引脚能当好几个用?
入门嵌入式,为什么STM32是“优选起步”?
嵌入式-单片机-STM32 EXTI中断
STM32单片机进行除零运算,为何程序不崩溃?
STM32 LL为什么比HAL高效?
STM32时钟详解
2025国庆中秋活动体验报告2——TouchGFX的UI设计
微信公众号
手机版