STMCU小助手
发布时间:2021-12-13 22:50
|
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。0 f0 C! ]$ ?5 R8 x ~ Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。 5 }2 d. j- G, Z( t5 g CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。 ( I E; s; M# Q6 R' I, r) r% B GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。 9 i* P( |3 _) A) b Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。7 H- O9 G& r& Z4 d # z- ?0 o- }* k3 i GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。: x! |! ]3 t8 S7 c @9 w 4 F" E4 K4 T l) f- g8 k# x. I 下面介绍下我自己的安装使用过程。* Z" B5 N8 O' H' [- O 1、搭建基于eclipse的开发环境需要安装的软件包:8 t+ N. F) U0 s. X+ X 0 P7 X9 q% m( C, n
& v6 F* H1 T6 X8 t. i T, ]! f
按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。
点14.15.5 LTS 下载
双击安装5 `2 w `9 K( T3 T
安装完毕后用npm命令安装xpm:npm install --global xpm@latest $ D% |$ }+ m" \" a: S& _
, C s0 e* n# b" C( [! k, h xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。 4 B) ~0 l. e5 D! \! S1 C
eclipse C/C++版本 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了) 0 z( @# L0 o# G. w% i) A* y
安装GNU ARM Eclipse插件。 用xpm工具安装: arm或者riscv平台的工具链根据工程需要选择。 2 O" ^1 F' W8 y* S2 l
* `: x6 v5 i9 r. x' }, p 打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。
E$ d! \1 P* `& L 选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。9 z$ R7 N- b: g 创建一个基于STM32f7x系列的空工程
" C9 u6 m% r$ Q( Z3 `" y5 V1 S 然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。 : C* L4 c' w2 a& a5 O# |( D; Z
% l) |0 c6 A Q( y: O- D+ S9 f. | 9 R. Q% Q! i8 D" V1 x+ R! V7 p- m 2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法+ N9 L$ l& K9 z: J) ` ①选择工程-> roperties->C/C++ General->Indexer+ n! [- @! a6 J3 D- v# @5 a+ P②勾选Enable project specific settings 3 X: q* m$ \3 E a! a2 r ③勾选Index unused headers as C++ files" M: F# S4 K' H* Q3 Y ③勾选Index unused headers as C files1 T* B4 z0 b5 q$ i$ E " R; i. D# y1 T/ `# p/ x# P) d , f& T: l; ~. Q 3、提示错误“③勾选Index unused headers as C++ files”3 H+ f6 U' a- f l, B7 E 解决Eclipse semantic error; ^8 Y0 Z0 d. m, F% U. ^1 F 3 m. {& X8 T% L* [! U. d( O/ g 项目->properties->c/c++ General ->Code Analysis- t v5 g* z5 X8 i7 n6 r 3 h8 j* I# q. [, q0 ~/ Z; W (1) Potential Programming Problems0 v" g7 D% _8 y w, c" F No return value Unused return value Assignment to iteself# s* M- B! s7 {- d7 V+ h / ?9 [& w0 T% a% i2 R3 S (2)Coding Style 全部 (3)Syntax and semantic Errors全部! G7 B- w5 s' R9 o- E (4)Securirty Vulnerabilities 全部! E! Q) A9 v( D/ z% T) Y4 d z# X9 q) ^, p" P* J6 e5 [. D 以上内容全部勾去,如下图所示
3 i, K, h, Y7 E. K: b 2 b. \8 [0 _! g3 k1 Y 4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,$ K$ g* T" V: O" x! X' ^3 O context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode* c# c# { t% A$ e4 |7 x 网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb {* R5 c1 `. }2 Z! J
编译错误可以解决,不知道会不会导致运行时出错。# l, |) E# W& q4 T1 r 另外选择用硬浮点的设置方法: 7 w. V) _% i6 t+ Z1 S6 V
; z% j8 |( b" ]4 ~
5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误 divsi3.S:330: Error: Thumb does not support conditional execution$ Q4 i# }+ m" S% } 看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。 : O: i( E0 w5 I) V# _$ i 6、HAL库中的接口未定义报错 Description Resource Path Location Type( d: z. d- I% M, c# C7 A# D undefined reference to `HAL_UART_Init' main.c /mkwsf7/src/app line 305 C/C++ Problem 6 F: m$ |& U& I4 V5 g3 B 创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下: ' V: o8 m8 b2 ?8 O2 S8 }
b) M/ R: P Y" k4 Z0 I 解决方法: 6 ]; G# V o: W; ?. D, _1 _ r properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。 7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。+ a7 h- u" n0 K ) R( H u* e# m/ r4 f3 F6 G" B
- e+ r& ?) `3 U# c% S9 n+ Z1 J ( M3 z* s+ n+ _8 Z' J 8、出现一堆系统调用接口链接失败 类似这样的报错:+ s6 A1 t" \6 `+ y
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。( O$ ~5 n: l- L! U3 o% R 独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。 默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。& s. y* C+ H4 M v: w/ P% W 除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。 & `0 L0 Y) i* l6 b- @4 b 9、编译出现如下错误: In file included from ../system/include/cmsis/arm_nnfunctions.h:163, from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18: ../system/include/cmsis/arm_nnsupportfunctions.h:452:1: error: '__STATIC_FORCEINLINE' does not name a type, k' f; q+ O' Y+ i. o, M0 @" z& q 452 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15) 3 {0 ]; @# q. y1 F9 h | ^~~~~~~~~~~~~~~~~~~~3 g) Q& u% D8 Z5 b" [3 ^ + T" x! {, R9 a, S ../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type% d+ E8 d1 k9 B: l2 p1 t2 v 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)# Z- e3 H, n- C: e; x l, U3 S- n | ^~~~~~~~~~~~~~~~~~~~0 f9 X* @! ], V: r* e$ V; [ ../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type" f R) p7 `6 A1 q$ [ ( B h5 S& h4 C# {1 g$ t, y: ^ 494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7), P7 o" k1 }, C- e+ N& I; l) p : o! H3 q# ?! ?$ H 大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。 10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory 32 | #include "cmsis_device.h" | ^~~~~~~~~~~~~~~~ * u4 Q) j/ E( _0 l: ~ compilation terminated.' S* y/ _9 Q! s# X9 G: F " u. d* a0 a8 [; |, t2 U system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed# `% K1 g, B8 x6 D+ n make: *** [system/src/diag/trace_impl.o] Error 1 0 z% w" U3 t$ q* V, S& U 新版本没用这个头文件了,其本来的定义是包含了#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时钟详解
微信公众号
手机版