毫无疑问,KEIL MDK平台下使用库函数进行stm32应用程序开发至少在开发环境的搭建上是较为简单的。KEIL MDK资料齐全,支持的芯片多,调试方便,4.7以上版本还支持智能感知等。但是很多玩惯了eclipse的朋友可能会觉得KEIL的功能还不够强大,比如快捷键不够多,没有git插件,语法颜色不够丰富等。本文提供了一种在windows平台下使用eclipse+gnu arm eclipse+jlink构建stm32应用程序的方式,希望为一些好奇者提供一种新的嵌入式开发工具。
Eclipse: 一款开源的集成开发环境(Integrated Development Environment),配合众多插件,可以用于Java应用程序开发、Android应用程序开发等。最精简的Eclipse只是一个框架,开发不同应用程序时需要安装对应的插件才能进行,不像微软的VS已经集成了众多的编译工具。
CDT:开发stm32应用程序主要使用的是C/C++,所以Eclipse需要安装CDT(C/C++ Development Tooling)插件。
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架构的处理器上。
Eclipse CDT: http://www.eclipse.org/cdt/downloads.php
CDT插件安装:http://download.eclipse.org/tools/cdt/releases/helios。安装方法:打开Eclipse->Help->InstallNew Software->Work With中输入上述网址。在线安装受服务器地址影响,速度可能较慢,建议直接下载Eclipse CDT。插件安装方式适合之前电脑上已装了Eclipse软件的朋友。
GNU ARM Eclipse Plug-ins: http://gnuarmeclipse.sourceforge.net/updates。该工具是Eclipse下的一款插件,安装方式类似CDT插件。
GNU ARM Embedded Toolchain: https://launchpad.net/gcc-arm-embedded/+download。
JLink驱动:https://www.segger.com/downloads/jlink。官网访问速度较慢,建议使用如下需要2个CSDN积分的链接:http://download.csdn.net/detail/u012441819/9791589。
上述插件全部安装完成后,在Eclipse下新建C工程,应该会看到如图1所示界面。其中Toolchans中包含了已安装的工具链。Linux下由于具有gcc编译器,因此还会看到Linux GCC选项。图1中创建的实际是一个基于STM32F10x系列芯片的模板工程,该向导会自动添加让程序顺利编译的所有依赖项,具体配置可在工程创建完成后查看工程属性。
点击“Next”之后,会看到图2所示的目标处理器设置界面。Content中可以选择创建空项目,也可以选择创建LED闪烁项目。此处为了说明配置选择LED项目,其余选择默认。
需要注意的是图3中工具链路径的选择。正常情况下,工具链在安装完成后,Eclipse会识别到工具链安装的路径,如果识别不到就需要手动指定,第二次创建时就无需再指定。如果此处选择的路径不正确,编译时会报相关错误,在Q&A环节会有解释。
项目创建完成后,点击编译按钮(锤子图标),项目会顺利编译,生成.hex、.elf文件,如图4所示。其中,.elf文件中除了可执行指令,还包含了一些额外数据,便于JLink这类工具进行调试。
虽然项目现在能够编译成功,但我们更应该关注的是模板工程自动为我们创建了哪些条目,配置了哪些属性,这样当我们遇到问题时才能发现本质原因。在项目属性下,我们需要关注的是C/C++ Build下的配置,其中Environment配置项如图5所示。可以看到,在PATH变量下包含了我们在图3中指定的交叉编译器的路径。接着查看Settings下的配置信息,如图6所示。
图6的Tool Settings标签页下指定了编译时的相关参数,其中部分内容根据图2中的选项设置。比如如果勾选了图2中的Enable-Werror选择,图6中Warnning目录下的相关配置就会被勾选,所有的警告就会被当作异常来处理。
使用过stm32f10x-3.5固件库的朋友可能知道,要想固件库能够被正确调用,需要在项目属性中指定STM32F10X_MD(或其他如_HD,取决于芯片的FLASH大小)和USE_STDPERIPH_DRIVER这两个宏。当我们打开Preprocessor配置项,发现所有必须的宏都已经被添加进来。这就是GNU ARMEclipse Plug-ins的强大之处,可以让我们更关注于代码的实现,而无需再去考虑项目的配置问题!
另一个需要关注的标签页是Devices页。对于不同的芯片,其RAM/ROM大小的起始地址的位置可能不同,Devices页包含了本机已下载的芯片资料,选中对应的芯片后,其相关的硬件信息也就确定了。芯片资料的下载可以在Packs视图下刷新并下载得到,如图7所示。然而国内的网访问KEIL提供的包仓库时网速较慢,刷新一下少则耗时半小时,正常情况下是因网速问题根本获取不到。笔者这里提供了自己下载的部分芯片资料,将该压缩包放到相应的路径下后重启Eclipse即可获得芯片列表,还需要下载什么芯片资料的话直接点击对应项下载即可。笔者下载该资料也颇不容易,故该链接一共需要2个CSDN积分。Packages包含四个包,第一个包的链接为http://download.csdn.net/detail/u012441819/9791564,其余三个包的链接可以通过笔者的帐号查找到,四个包全了才能解压。
右击项目HelloLed->Binaries->HelloLed.elf,选择Debugas->Debug configuration,在打开的窗体中双击GDB SEGGER J-Link Debugging,出现如图8所示的界面,其中Debugger页采用如图9所示的配置,Startup页配置如图10所示。
Debugger页的几个全局变量需要关注一下:jlink_path、jlink_gdbserver、cross_prefix、cross_suffix。其中jlink_path是指jlink的安装路径,jlink_gdbserver是jlink服务器的exe文件的文件名,这两个值从系统配置中得到,依次展开Windows ->Preferences->Run/Debug ->SEGGER J-Link。该目录下的两个值如果为空,则点击下RestoreDefaults按钮,Eclipse会搜索本机已安装的jlink驱动路径。cross_prefix和cross_suffix是和编译工具链相关的两个变量,其中Prefix的定义为arm-none-eabi-,Suffix未定义,变量的定义见图6中的Toolchains选项卡页。根据这些变量可知,${cross_prefix}gdb${cross_suffix}对应的是arm-none-eabi-gdb程序,该程序在图3所示的路径下。
根据图8、图9、图10中的信息完成JLink的配置后点击Debug按钮,开始JLink调试。JLink是正版的话,程序应该在main函数处停止,如图11所示。
关于Windows+Eclipse+GNU ARM Eclipse+JLink配置嵌入式开发环境,笔者曾反复搞了多次,由于缺少相关理论知识的指导,缺乏操作记录,每次不是失败就是配完一段时间后就忘了。直到1月份使用Cubieboard2在Android下操作底层的GPIO后才对Linux、交叉编译器等知识逐渐熟悉起来,再接着在Windows和Ubuntu下配置交叉开发环境就很容易了。后续在该平台下还会使用单元测试工具,有新的内容会及时分享给大家,希望大家喜欢~对了,如果大家觉得截图中软件的字体还不错,请记住,它叫Source Code Pro。
1. c:/program files/gnu arm eclipse/buildtools/2.6-201507152002/bin/sh: arm-none-eabi-g++: notfound
交叉工具链的路径设置有误,IDE找不到arm-none-eabi-g++编译器。注意此处报错的路径和图3中指定的路径不同,为了示范错误信息才这么做的。
2. 编译时报找不到caddr_t类型的错误
这是一个大坑,初次使用Eclipse碰不到,在Linux下配置嵌入式开发环境也遇不到,只有电脑上曾装了Eclipse CDT并用其写过代码的朋友才有可能遇到。我们知道,Eclipse CDT刚下载下来实际上是不能开发C/C++程序的,因为没有make工具,也没有gcc编译器。一般网上的教程会建议安装MinGW(Minimalist GNU forWindows),同时建议把MinGW的bin目录加入到系统的环境变量中。如果没有修改过Eclipse的系统配置的话,不会每个项目都把MinGW的bin路径都包含到当前项目下。但一旦按照网上的一些教程修改了项目属性中的Pathsand Symbols默认配置项后,以后每个项目都会添加上述路径,且不能删除。目前笔者还没找到恢复默认配置的方法,如哪位大神知道请留言,感激不尽。
3. JLink is a clone
若想在Eclipse下使用JLink,JLinkis a clone问题是无法避免的。国内目前使用的JLink基本上都是山寨的,使用的都是那几个序列号,已被SEGGER公司在JLink驱动中封杀。KEILMDK下可以通过把JLinkARM.dll降级实现JLink能够使用,然后这不是根本的解决办法,在Eclipse下也是行不通的。根本的解决方案就是重烧JLink的固件,参见博文:http://blog.csdn.net/hzt12345hf/article/details/50846447。笔者已通过该方法成功重烧JLink,为便于操作,笔者在JLink的板子上焊了四个插针。
4. 在Eclipse中安装gnu-arm-eclipse插件失败怎么办,提示handshake_error?
错误描述见http://gnuarmeclipse.github.io/blog/2017/01/29/plugins-install-issue/。解决方案就是到文中给出的链接下载一个包,然后替换JRE目录下的两个文件即可。
5. 使用JLink调试时延时不正常怎么办?
如果只是for循环的软件延时,由于其受CPU工作状态的影响,因此是不准的,Debug状态下需要经常和硬件通讯,所以这个延时更加不准。如果只是Run的话,软件延时相对校准,毕竟少了通讯环节。