STMCU小助手
发布时间:2021-12-13 22:50
|
由于工作需要,用eclipse搭建基于stm32f7xx芯片的工程环境。记录下安装和编译链接工程过程中遇到的问题,今后可以参考。同时也希望能给遇到类似问题的人一些参考。. d# S5 ], K: s. V0 D( l 7 J: y ]8 P$ [. l/ {+ s Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。 CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。: L% p0 n* v4 q/ e% K GNUARM Eclipse: 包含一套Eclipse插件和用于跨平台嵌入式ARM程序开发工具的开源项目。有过stm32库函数开发经历的朋友可能知道,开发前我们都会找一套工程模板,包含了对各个库文件的引用,我们只需要关注核心的应用即可,换一个项目时我们就拷贝一份模板,重新进行开发。Eclipse装了GNU ARM Eclipse工具簇后,新建项目时我们只需要选择对应模板的项目,插件就会自动帮我们配置好工程。 Windowsbuild tools: 程序由代码变为可执行文件需要进过编译和链接的过程。Windows下的IDE无论是VisualStudio还是KEIL,编译工具都集成到IDE中了,且有着自己的一套管理项目文件的方式。Eclipse创建的工程会自带makefile文件,该文件的解析需要make工具。Linux下自带make工具,Windows下需要使用Windows build tools作为make工具使用。 GNUARM Embedded Toolchain: ARM交叉编译链,被编译的程序运行于基于ARM架构的处理器上。 下面介绍下我自己的安装使用过程。 1、搭建基于eclipse的开发环境需要安装的软件包:; v4 B2 l0 D% z# r% b. x, i# P 8 s, t5 g! T5 E9 S A- {
( A% H8 }( U d+ D6 |% \5 d4 S
8 ?, b% n4 K" j8 E5 _ * ]. h( f, T6 B 按照说明上的需要先装xpm工具再用命令安装windows-build-tools包,xpm的安装方式是用npm工具。npm是nodejs下的包管理器,先下载安装node.js。 e% w, C0 H9 A j6 [: K# r7 e
点14.15.5 LTS 下载
1 |' W( X# ?. v9 f 双击安装( j" d0 k( y' ~+ y; V
安装完毕后用npm命令安装xpm:npm install --global xpm@latest, a8 o/ H+ `& ?) Z @3 p5 z
5 a& \. a& w+ \$ g- @ xpm安装完毕后,就可以根据说明书上的安装命令安装windows-build-tools工具。 , u( R7 P3 ` c; k
, V4 k5 F2 }0 g \ eclipse C/C++版本* }# m; _7 p6 q( e* T2 }- K : G5 g! c2 R, q8 N" x- ` 下载 C/C++ 的Eclipse IDE,免安装,解压即可用(前提是JAVA环境配置好了)! X+ f. Q8 p" X7 ]! C1 W/ G P1 D 0 K- M3 Y8 {8 a% c
3 G+ D1 | V/ q. z q2 E7 l 安装GNU ARM Eclipse插件。 用xpm工具安装: arm或者riscv平台的工具链根据工程需要选择。 ' B" U9 B& E2 Q; m# }4 f' R
' R$ I& N3 H+ |2 U# T- \ 打开eclipse,Help->Install New Software...->Add,在Location输入网址,name输入GNU ARM Eclipse Plug-ins。5 [* m" s, m/ w2 I& n: e
% Y' h( s' @ u. K1 v* l 6 {: M0 P- V3 L9 U% _' o: M) L 选中上面的工具,跟着向导一路next,直到finish,这时eclipse需要restart一次。 6 W- i: O) {. h. r+ ]! O 创建一个基于STM32f7x系列的空工程3 ]' A( H; I& B' b( [% Z! `3 g9 Q: z. z * I6 Z0 \- M* v2 c0 ~4 Q' s3 f3 p; r
然后,选择工程参数时有几个选项,需要根据自己的工程需求选择。不知道怎么选就先用默认的。工程运行中发现问题再来看看是否这里有需要改的。) r+ j- @8 |8 f+ b* `. L9 @ ( ]" m0 S7 D3 p+ S( f) w; B# U
5 k4 v" U! H/ b! S& a 2、Eclipse中出现Type 'xxxx' could not be resolved的处理方法) @/ P- \! Q5 w5 ~, a$ { ①选择工程-> roperties->C/C++ General->Indexer1 f4 |) z) R5 q% I8 I- w②勾选Enable project specific settings0 p7 A; k5 w/ ?; u. G/ O ; n$ ^) W2 W- L M. z9 [% O$ t ③勾选Index unused headers as C++ files ( y" @$ x( V' o ③勾选Index unused headers as C files0 U; L( u! `/ E 3、提示错误“③勾选Index unused headers as C++ files”) |, U4 S% g* p* C0 v- Y 解决Eclipse semantic error! B) H& M% [- [5 M( g0 p0 v 4 U/ d4 t3 _' s 项目->properties->c/c++ General ->Code Analysis (1) Potential Programming Problems1 ]( e* u! I1 @ No return value4 U; N2 a6 _+ A, j# j1 t 5 b0 G* E0 ^. m4 Q. j9 N Unused return value Assignment to iteself- i) i& T8 y7 w) x- u. i( A+ F) K (2)Coding Style 全部 (3)Syntax and semantic Errors全部0 Q7 i$ g* \- q6 l9 e8 N- X $ B# {7 y" j9 k& D (4)Securirty Vulnerabilities 全部 以上内容全部勾去,如下图所示 : L! }) j: ]& E% C! {* E
# c }1 E* [$ G/ l 4、编译(工具栏锤子按键)程序,rtthread中用到的.s文件出现下面这样的错误,, [: G D4 x3 [4 d: A& j3 x! i2 B f context_gcc.S:110: Error: selected processor does not support `vstmdbeq r1!,{d8-d15}' in Thumb mode 网上有好多说了一堆硬浮点软浮点的问题,都是建议改成软浮点,但是stm32F7芯片时支持硬浮点的,所以没用尝试改成软浮点。用了有人偶尔提到的方法:增加一个参数,ASFLAGS += -Wa,-mimplicit-it=thumb & E/ h. f Z/ D! Q0 k9 M/ V
编译错误可以解决,不知道会不会导致运行时出错。 另外选择用硬浮点的设置方法:
; J9 e. U% U: Y' y. A' x: ` 5、rtthread下面的libcpu\arm\common\divsi3.S编译时报一堆这样的错误 divsi3.S:330: Error: Thumb does not support conditional execution 看了rrt-nano的移植相关的说明,common文件夹下的大概不是需要加入工程的,于是把common整个文件夹都不放入工程编译。 ! o8 R4 Z& z0 H9 v( f 6、HAL库中的接口未定义报错 Description Resource Path Location Type 5 `- \) v- A- r: K undefined reference to `HAL_UART_Init' main.c /mkwsf7/src/app line 305 C/C++ Problem / @) Y E# d5 m+ z7 Q) [ 创建工程选择F7系列模板工程时,会自动吧stm32f7的hal库加入到工程,但是很多.c文件被斜杠划掉了,如下:# j( b- w" ^4 A0 K ' J; f7 M% i" l" s7 a3 b
解决方法: properties -> c/c++ general -> paths and symbols -> source location ->(找到为加入项目中的文件路径)edit filter 从目录中删除被屏蔽的文件来加入到工程,顺便通过add将不需要的文件屏蔽。# i0 d! y% d! Z! J6 u 7、cmsis的头文件和src文件在创建工程是大多数没用加入,从keil文件中找到使用到的cmsis的头文件和src,替换原有工程的,原有工程已有的也替换,因为工程里的可能版本比较旧。旧版本会出现下面的报错。; o4 i+ j- O4 B5 M# u" Z5 q4 H$ @
" K9 M1 S6 n3 f8 y 8、出现一堆系统调用接口链接失败5 y. m9 O7 o! m3 Z/ a4 i 类似这样的报错:
在_syscall.c中是有实现的,只是宏定义屏蔽了,因为工程里勾选了-ffreestanding。1 T4 x8 m" J1 k3 { 独立的环境是标准库可能不存在,程序启动不一定在main的环境。选项 -ffreestanding 指示编译器不是假设标准函数有其通常的定义。 ; W: u/ d& J9 `0 l 默认情况下,GCC将作为托管实现的编译器,将 __ STDC_HOSTED __ 定义为1,并假设当使用ISO C函数的名称时,语义在标准中定义。要使其成为独立式环境的合适独立实现,请使用选项 -ffreestanding 。然后它将 __ STDC_HOSTED __ 定义为0,而不是假设标准库中的函数名的含义。 p7 @$ S b4 h% y 除去勾选后可以解决编译错误,但不知道执行时printf功能是否正常。 9、编译出现如下错误:0 f$ e; G0 j: o' A0 M7 ^ In file included from ../system/include/cmsis/arm_nnfunctions.h:163, ! W2 _8 p8 Z7 B4 `) }1 { from ../src/tensorflow/lite/micro/kernels/cmsis-nn/add.cc:18:! S% z n/ g( |% z ../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); u0 v, \( N! V3 t; D, ^3 ^% X | ^~~~~~~~~~~~~~~~~~~~ ../system/include/cmsis/arm_nnsupportfunctions.h:467:1: error: '__STATIC_FORCEINLINE' does not name a type1 [; s# a( M' U, g6 c 467 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7) | ^~~~~~~~~~~~~~~~~~~~ - k6 ^' H* F, i( N ../system/include/cmsis/arm_nnsupportfunctions.h:481:1: error: '__STATIC_FORCEINLINE' does not name a type3 {6 t2 y8 G, t8 u . i, |% @3 _5 \4 | 481 | __STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15) 0 w: r& n" ~0 T7 {5 I, a- ~$ C | ^~~~~~~~~~~~~~~~~~~~ 2 }' ^- ?* z+ q' u/ d ../system/include/cmsis/arm_nnsupportfunctions.h:494:1: error: '__STATIC_FORCEINLINE' does not name a type& l2 z1 P/ N) D6 H5 m# D 494 | __STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7)2 }3 p/ W" W! R5 B1 r8 E" Q 大概时工程自动生成的cmsis代码太旧导致。替换成新版本的cmsis的代码。 $ I6 f3 t; I; p7 g. G 10、../system/src/diag/trace_impl.c:32:10: fatal error: cmsis_device.h: No such file or directory 32 | #include "cmsis_device.h" % j7 x& p" t& O# B% m& |" y | ^~~~~~~~~~~~~~~~ K4 I; h% ^+ P4 z compilation terminated.( D1 ~$ R) l+ ]& V& I system/src/diag/subdir.mk:21: recipe for target 'system/src/diag/trace_impl.o' failed0 B& `/ }2 a9 H6 N9 g& | u make: *** [system/src/diag/trace_impl.o] Error 1# F. H7 ^& G8 t- g % u5 c- n a; C4 o- g5 U* C 新版本没用这个头文件了,其本来的定义是包含了#include "stm32f7xx.h",因此直接替换本处代码为#include "stm32f7xx.h"即可。, _. {) i0 b8 D8 O2 b ; r. {/ _3 g5 r& w |
STM32F746G-DISCO移植lvgl9.0性能基准测试
STM32F745 USART1 Bootloader启动失败排查与解决的流程分析
STM32芯片命名规则
STM32 引脚到底有多少?为什么一个引脚能当好几个用?
入门嵌入式,为什么STM32是“优选起步”?
嵌入式-单片机-STM32 EXTI中断
STM32单片机进行除零运算,为何程序不崩溃?
STM32 LL为什么比HAL高效?
STM32时钟详解
2025国庆中秋活动体验报告2——TouchGFX的UI设计
微信公众号
手机版