对于STM32单片机程序开发的IDE环境经常被使用的是keil 和 IAR,这两个IDE确实使用起来确实很方便,不过对于在linux下开发mcu程序就没有如此方便快捷的IDE供开发者使用了,是不是linux下就没有办法使用IDE来开发STM32的程序呢,这也是此贴着重要研究的如何在linux下的开发环境下通过IDE来调试使mcu的程序,本文以笔者手中的STM32 NUCLEO-F446为硬件平台搭建linux下的开发环境。 " G$ Q8 d+ D& L) {, E ) G, w6 u: Z; f V1--开发工具(Eclipse) ! A/ O1 W) [: ^: E6 m5 @3 Q# ~6 G5 |1 t- _4 j ( ^: C5 Y m, m9 y- N5 C( ^ “虽然大多数用户很乐于将 Eclipse 当作 Java 集成开发环境(IDE)来使用,但 Eclipse 的目标却不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。”) U2 Q+ ~" @/ p & V* h( D4 ]8 W) J3 a" d }+ h上述描述截取于百度百科,Eclipse 有很多版本,本文使用的是支持C,C++开发的CDT版本,可以去官网下载最新的版本,如下是下载链接,选择linux下的版本。 ! x- z$ F/ K+ A0 l0 D; ghttps://www.eclipse.org/downloads/packages/ 6 F/ a( u: N$ K j3 E9 [+ s 8 m2 ?' {3 d. L8 f, z. {1 s. i0 X, ^4 A: f0 T7 o 2.--基于Eclipse IDE编译程序# B: e8 q9 J8 K8 Q4 m ①编译器; s7 ?! ^2 c3 ^5 K& k* K5 e m 编译器使用的gnu的gcc 编译器. ~( E- v m, }8 o( M1 } ②编译环境 5 H* d2 p* O0 q# y+ t) Vmakefile2 [5 {' T& y: v4 k! ^2 X 以上两个是Eclipse 编译所依赖的编译环境,本地使用的gcc版本信息如下,版本没有固定的要求只要支持对应的MCU架构即可,大部分的gcc版本是能够支持ARMV7-M架构的mcu开发环境的。# t. j* Q2 n C book@100ask:/opt/sdk/gcc-arm-none-eabi-5_4-2016q3/bin$ ./arm-none-eabi-gcc -v, T* H) z8 a3 M, n2 T. Q8 b/ S8 G Using built-in specs. * w- e! p7 |& ~% J# L9 A8 BCOLLECT_GCC=./arm-none-eabi-gcc P4 ]0 b0 ]! H) n COLLECT_LTO_WRAPPER=/opt/sdk/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/lto-wrapper& D/ i: k2 U6 k; c; l5 r6 Q6 d5 h' w Target: arm-none-eabi 6 r9 G; q0 g4 O# @$ f1 a! eConfigured with: /home/build/work/GCC-5-build/src/gcc/configure --target=arm-none-eabi --prefix=/home/build/work/GCC-5-build/install-native --libexecdir=/home/build/work/GCC-5-build/install-native/lib --infodir=/home/build/work/GCC-5-build/install-native/share/doc/gcc-arm-none-eabi/info --mandir=/home/build/work/GCC-5-build/install-native/share/doc/gcc-arm-none-eabi/man --htmldir=/home/build/work/GCC-5-build/install-native/share/doc/gcc-arm-none-eabi/html --pdfdir=/home/build/work/GCC-5-build/install-native/share/doc/gcc-arm-none-eabi/pdf --enable-languages=c,c++ --enable-plugins --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --with-gnu-as --with-gnu-ld --with-newlib --with-headers=yes --with-python-dir=share/gcc-arm-none-eabi --with-sysroot=/home/build/work/GCC-5-build/install-native/arm-none-eabi --build=i686-linux-gnu --host=i686-linux-gnu --with-gmp=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-mpfr=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-mpc=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-isl=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-cloog=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-libelf=/home/build/work/GCC-5-build/build-native/host-libs/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-pkgversion='GNU Tools for ARM Embedded Processors' --with-multilib-list=armv6-m,armv7-m,armv7e-m,armv7-r,armv8-m.base,armv8-m.main* | ~3 B( X# h2 J; A4 C9 C Thread model: single 2 y. g0 ?, R3 Wgcc version 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496] (GNU Tools for ARM Embedded Processors) - v! @; o& W; Q7 G3 p0 M复制代码本文重点介绍基于Eclipse 搭建开发环境,至于如何基于makefile 编译MCU程序非本文的中重点,论坛内有大神对此方面的介绍,也可以通过强大的cube工具来生成makefile 工程,本文的文末会附上笔者本地makefile 工程,我的makefile工程只是加入了启动依赖的相关文件,不过本文的主要目的是搭建环境,这个简单的工程还是能满足要求的。 6 q5 c* n& j- b0 H8 `& ^& U$ }0 f2 x4 @$ c4 b : Y; j* ? C: R3 I/ K- u7 c2 z 本地的编译器和make工具都已经存在的话对于使用Eclipse 来编译程序是很简单的一件事,只要配置下对应的GCC工具所在的位置的环境变量和将makefile工程导入工程目录即可。9 R$ Q: G% O. r: z5 @ 具体操作如下:1,工程栏点击右键导入工程& o: Q. p0 w4 f0 B9 r1 y (, 下载次数: 2) 上传 点击文件名下载附件 & y- O5 K1 W& M4 e0 ]7 t+ ~5 ^. @ 2.选择导入makefile 工程$ D2 o! i7 K% [" {. A/ _ (, 下载次数: 3) 上传 点击文件名下载附件 / q# y- R1 _% k0 d" S 3.设置工程名称及makefile 路径,则完成导入3 E5 W4 }; D$ _5 |/ V0 Y( k6 m/ |% F# ^ (, 下载次数: 1) 上传 点击文件名下载附件 : s5 y! v5 T' O; k; B5 F3 A6 l4 ?4.配置makefile 依赖gcc工具链 PATH环境变量根据本地的配置添加. f' I, r; z. H% n) Q! \ (, 下载次数: 2) 上传 点击文件名下载附件 5 m* U x4 v/ v( h& X& H8 K # V& d* \! \4 W$ [/ T (, 下载次数: 3) 上传 点击文件名下载附件 # w2 ~- h, o3 S% Y4 E" r6 P5.至此依赖的编译环境已经配置完成,如果makefile文件编写的没有问题的,工程窗口built project/clean project 就会调用makefile的make all 和 make clean 对工程进行编译了,编译效果如下。! c4 \/ \3 J( k2 p# O% s 8 Q T+ U9 j4 J+ d! ^7 M3 T4 K (, 下载次数: 2) 上传 点击文件名下载附件 & o6 r2 H$ h# t4 o: T8 E$ ^ ! s1 O6 ~" q2 C1 b5 r: k. y 4 R/ p+ y. V( I2 D! g3.调试环境的搭建 5 o( p8 @, }0 y" Q: K! f1.stlink 驱动库安装8 T. y$ P& D' A* l 至此已经可以通过Eclipse 对工程进行编译和清除了,一个IDE 不仅仅需要能够编译程序同时也需要能够对程序进行调试。 , k' x" @& W, u- W本次实验是哟使用的NUCLEO F446的板子上已经集成了个STLINK,本实验使用STLINK对程序进行仿真,需要按照STLINK在linux环境下的驱动程序,安装方法可以参照笔者之前的帖子: 2 a, \; x0 W* T7 ~2 \https://www.stmcu.org.cn/module/forum/thread-618905-1-1.html 9 x" D$ ?2 O: Y, u0 A; R' v按照上述帖子完成安装后,接入开发板运行 st-util 命令能够识别出开发板的型号说明已经正确安装并识别到板子,并等待IDE进行链接。 : f+ K& @2 T9 Vst-util1 i! m G; E' h! z 2020-11-15T10:43:38 INFO common.c: F446: 128 KiB SRAM, 512 KiB flash in at least 128 KiB pages.2 W) \5 z& _( W. b8 k 2020-11-15T10:43:38 INFO gdb-server.c: Listening at *:4242...0 P [8 `5 ~% p" J! o. g" n 复制代码2 F8 c/ I0 r8 E8 l; T 2.配置debug选项5 ]) e0 D" t: b+ e6 e4 f; V 3 u+ u- |3 h+ J! t0 l0 F8 `. f 1.debug (小虫子)选项下拉新建debug config,按照如下的配置配置6 x s& m5 Y( e* n; w (, 下载次数: 3) 上传 点击文件名下载附件 ^9 d, Z! U4 H , ]6 L% f H9 ]9 zmain 选项卡的配置:配置要调试的elf文件,选择gdb 调试方式为hardware gdb , Y8 J4 o. v0 }% h3 D) {' p. I5 ?4 {" A (, 下载次数: 2) 上传 点击文件名下载附件 $ R6 ]( G! ?' T* C ~% \4 y9 y2 C) T m debug 选项卡的配置:选择调试器为STLINK并设置端口号为4242,因为之前编译的时候已经设置PATH环境变量,此处的arn-none-eabi-gdb命令是可以正常的执行的不需要加绝对的路径。, X5 D' i, B! f L (, 下载次数: 2) 上传 点击文件名下载附件 - H% s- J% j/ [& T+ x, x M* s7 E0 I3 a2 K6 y2 B" c* v 至此编译环境和调试环境已经配置完成,正常没有问题的话就可以对程序进行调试了,调试前本地终端先运行st-util等待IDE进行链接,IDE上点击对debug 按钮就可以进行仿真调试了,如下仿真已经进入main函数内的断点了。( U% i0 j9 d$ l' O. K 1 R4 t, K4 A8 I4 k$ w- z8 r+ @7 D0 H% f( K$ Y& I: C (, 下载次数: 2) 上传 点击文件名下载附件 w5 M3 y7 e' r4 N 3 y w& ?8 S7 ^/ D4 N如果需要使用JLINK进行调试的话,方法也是一致的只是将STLINK相关的配置修改为JLINK即可。1 p1 |; V' `# F+ m! y, v4 M 1 [6 F* `8 b& j# s% T# C8 ^9 K5 o& n: r( z ' W4 U, F. _3 N. ?& _1 p# p4 B & Q- Z, }% L( N8 {% e* ]* @) q8 c" q7 a . |0 |8 F' N. \ 1 Q9 j6 J7 E" \& c' F- `! B# G5 ^$ B4 q. w