CubeMX+Eclipse+Jlink STM32开发环境搭建
Eclipse还是我用得最多的IDE,不管是CCS还是Xilinx的SDK,都是Eclipse的开发环境。所以最近准备做STM32相关的开发时,也准备用Eclipse。
软件下载与安装
CubeMX是ST的用于生成初始化代码的工具,能大大提升开发的效率。Eclipse是一个开源的IDE,从官网可以下载到这个eclipse installer,然后选择Eclipse IDE for Embedded C/C++ Developers。目前官网的Eclipse版本是2022-03,这也是我目前用的版本。

Eclipse Embedded CDT,Eclipse的C/C++嵌入式开发工具是一个非常大的开源项目。

从项目的官网中可以看到,它还提供了一些额外的工具链接,包括build tools和gcc工具链。build tools用来生成Makefile,gcc工具链负责真正的编译和链接。这些工具包都是通过xPack管理的。
要说xPack得从JavaScript说起,有一个包管理工具叫做npm(Node Package Manager),这里的包都是用JavaScript写的。xpm(xPack Project Manager)是npm管理的一个Module,关于xPack的介绍可以在这里找到更多详细的解释。大概就是说xpm管理的包的格式和npm几乎是一样的,“xPack”中的“x”取自“eXtended”,它管理的包是通用的包,并不局限于JavaScript。
用xpm安装build tools和工具链都非常简单,安装完成后,在Eclipse的“Windows->Preferences”里面可以对build tools和工具链进行设置,只需要点右边的xPack就可以自动地关联上刚刚安装的工具。

CubeMX生成初始化代码
用Eclipse生成初始化代码真的非常方便!选择你所用的处理器型号创建工程后,可以在Help菜单栏中找到帮助文档。主要一个就是关于CubeMX的使用,另一个就是处理器相关的文档,还有各种应用笔记,资料非常丰富。

外设的配置就不详细介绍了,一开始让我比较震惊的是它对FreeRTOS也有很好的支持。

不光是FreeRTOS的一些configuration,heap管理,task、Timer、Semaphore、Queue的初始化都非常方便。
CMSIS(Common Microcontroller Software Interface Standard)是Arm提供的一种标准接口。这里FreeRTOS的接口可以选择CMSIS_V2,对于CortexM4来说,选CMSIS_V1或者CMSIS_V2都行,后者是前者基础上的扩展。这部分介绍可以在CMSIS文档中找到介绍。

基于CMSIS-RTOS接口的开发,用户就不会直接调用FreeRTOS的API,而是Arm提供的RTOS的API,应该是便于在不同的RTOS之间迁移。

因为我们是采用Eclipse开发,所以在输出的形式上选Makefile应该是最合适的。
CMSIS Package下载
其实如果我们已经用CubeMX生成了Makefile文件,这里的CMSIS Package我们基本已经用不上了。因为所有源文件和编译的流程都已经由Makefile管理了。但是这里还是需要下载你所用到的处理器的Package,原因后面再介绍。

第一次打开CMSIS Package的管理界面应该是空的,需要点右上角的刷新才能看到可以下载的Package。
Eclipse建立工程
新建工程的时候选择“Makefile Project with Existing Code”。

选择MakeFile所在的路径,工具链选择Arm Cross GCC。

然后打开某一个源文件,会发现有很多红色的波浪线,这是因为当前的工程并不知道include的路径和一些symbol的定义。

打开Makefile可以看到里面的-D参数和-I参数。去掉“-D”和“-I”才是具体的Define和Include,Makefile中这么些是方便把这些设置直接作为gcc编译的选项。比如“-DSTM32F407xx”实际上是需要定义“STM32F407xx”这个Symbol。

在工程的Properties中添加这些include和symbol就不会有那些红色的波浪线了。


要通过编译还有非常重要的一步,就是选择Device。
因为Makefile是我们自己生成的,所以前面即使不往工程里添加的include和symbol,我们根据这个Makefile进行make,一样能够完成编译。当工程目录下没有Makefile时,Eclipse CDT会帮我们生成一个Makefile,那时候才会用到我们在上面设置的东西。
我发现如果不选择Device,就无法编译,问题好像是找不到make。但只要选了相应的Device就可以正常编译啦。

如果你在上面找不到你的Device,就需要通过CMSIS的Package管理页面下载所需的Package。在这里选择了Device之后,就可以在Documents的页面里看到相关的文档。其中比较常用的应该就是“STM32F4xx HAL Drivers”这个文档,基本就靠查这个写代码了。

LED Blink
我做的第一个demo工程是一个LED Blink的功能。在CubeMX中配置一个task,这个task的函数可以像下面这样写。自己只需要加一行代码“HAL_GPIO_TogglePin”,然后改一下delay的时间即可,这里的500指的是500ms,FreeRTOS的tick默认是1ms。
1 | /* USER CODE END Header_BlinkTskFxn */ |
Jlink
jlink驱动可以直接在官网下载。

正版的jlink特别贵,最新的jlink驱动可以检测出你用的jlink是不是盗版的。但我觉得大部分人应该都是在某宝上买的盗版的jlik,这样在每次连jlink的时候就会有类似上面这样的提示。网上也有各路大神给出解决方案,但我为了省事就直接装了最低版本的jlink驱动V5.00,也能用。
Jlink调试
在前面配置Eclipse的工具链的界面,还有下面这个设置Jlink路径的地方。需要设置成jlink的安装目录。

点绿色的小虫子旁边的下拉按键,选择“Debug Configuration”,

新建一个J-Link Debug的配置。只需要做一些必要的配置就行,比如elf文件和处理器型号,其余大部分都可以保持默认。然后基本上就可以调试了。

Jlink下载并运行
用过MDK的都知道,除了jlink调试,MDK也可以直接往flash里烧写。
Eclipse也能做到这一点。通过下面的方式添加一个External Tool。

在进行配置之前,有必要先了解一下Jlink的使用。Jlink也是一个终端,在Jlink的终端里输入command来实现连接设备、调试、flash烧写等功能。Jlink本身是一个exe可执行文件,它也可以通过windows的终端来运行,通过命令行运行Jlink有一些command line option。
上面提到的command可以写到一个CommandFile里,然后作为command line option中的一个选项,实现jlink的批处理运行。详细的信息可以查看官网的文档:Jlink命令(PS:官网给出的命令是针对最新的Jlink驱动的,所以如果用比较老的驱动可能会遇到某些命令不支持的情况)

经过我的一些尝试后,我确认下面这样的参数配置是完全可行的。另外需要在工程目录下新建一个“JlinkCommandFile.jlink”,用来写Jlink的command。
1 | -device STM32F407VE -if SWD -speed 4000 -CommanderScript ${project_loc}\JlinkCommandFile.jlink |
JlinkCommandFile.jlink:
1 | r |
JlinkCommandFile.jlink中每一行就是一个command。r表示复位;h表示停止(这里有没有好像都可以);loadfile后面跟一个要烧写进flash 的文件。烧写完成之后再用“r”复位,可以让程序马上开始执行,而不需要让板子重新上电。最后Exit Jlink。