因为最近需要做一些STM32的开发,而我大部分的其他开发都在Linux上,经常在Windows和Linux下切换感觉比较不方便,于是就研究了一下Linux下开发STM32的工具,顺便在这边做下记录。
使用的开发工具
软件平台:
Eclipse Luna
下载:https://eclipse.org/downloads/packages/release/luna/sr2
用于安装System Workbench for STM32插件,建议下载Eclipse IDE for C/C++ Developers版本。
System Workbench for STM32 (Eclipse插件)
下载:http://www.openstm32.org/Installing+System+Workbench+for+STM32+from+Eclipse?structure=Documentation
选择它是因为这个插件装上之后就将STM32的开发环境配置好了,使用起来很方便,而且STM32CubeMX直接可以生成适用于它的工程。该插件与Eclipse Luna兼容较好,与Eclipse Mars兼容性有点问题,其他Eclipse版本未测。
STM32CubeMX
下载:http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF259242?sc=microxplorer
这个是ST公司官方开发的用于初始化STM32外设驱动的软件。这款软件可以非常方便地生成高质量的硬件配置代码,使得STM32的开发可以专注于功能的实现。该软件目前只有Windows版,不过因为其实它是用Java编的,所以在Linux下可以正常运行。不过因为是用于Windows环境的,所以生成的工程需要做一些改动才能在Linux下正常使用,这个留待下文再讲。
另外,STM32CubeMX虽然有Eclipse插件,但那个插件只能在Windows下运行
调试器:
ST-Link V2
这个是System Workbench官方支持的调试器。价格也比较便宜(盗版的非常便宜,正版的也不贵)。
开发板:
STM32F407ZET6
应该大部分STM32的芯片的开发板都可以支持的。
操作系统:
Ubuntu 12.04 64位
软件安装
System Workbench for STM32的安装与正常的Eclipse插件安装一样,就不讲了。值得注意的是Eclipse Luna需要OpenJDK 7的运行环境,我用的是Ubuntu 12.04,系统自带的是OpenJDK 6,需要安装一下,然后改一下Eclipse的启动参数(如果你没有修改系统的默认Java运行环境的话),即在eclipse安装目录下的eclipse.ini文件中加上:
-vm
/usr/lib/jvm/java-1.7.0-openjdk-amd64/bin
如果你是Ubuntu 14.04及以上版本,就没必要加这一条了。
下面主要讲一下STM32CubeMX的安装。首先将STM32CubeMX下载下来(下载地址在前面给出的链接的最下面),解压缩之后应该能获得一个exe文件,不过这个文件不需要安装wine就可以运行。如果系统默认java版本是OpenJDK 6的话,运行以下语句:
sudo /usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -jar /path/to/your/SetupSTM32CubeMX.exe
如果是OpenJDK 7及以上的话,直接运行:
sudo java -jar /path/to/your/SetupSTM32CubeMX.exe
后文将/usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/省略,如果默认是OpenJDK 6的,请手动加上这个绝对路径。另外,请将/path/to/your/替换成你实际文件的路径。
然后就会出来一个安装界面,选择安装路径,然后安装。
安装完之后,在安装目录下,应该会有一个STM32CubeMX.exe的文件。运行:
java -jar /path/to/your/STM32CubeMX.exe
然后选择Help->Install New Libraries,安装需要的支持库等内容,就可以用于开发了。在Updater Settings里面可以选择支持库的下载路径。
开发设置
STM32CubeMX
新建一个工程,选择自己的芯片类型,配置好相应的管脚、时钟和外设。
在Project Settings中,将Toolchain/IDE选成SW4STM32。然后使用STM32CubeMX生成代码。将生成的代码拷到Eclipse的工作空间中。
关于STM32CubeMX的具体使用方法请参考其他资料。
System Workbench for STM32
接着,我们打开安装好System Workbench的Eclipse。选择File->Import->Existing Projects into Workspace,选择你的代码所在的路径,注意请不要勾选Copy Projects into Workspace。
接下来对工程进行一些配置。
选中当前工程,选择Projects->Properities,在左侧列表选择C/C++ Build->Settings,打开这个设置界面可能需要一些时间,请耐心等待。
在Tool Settings->MCU GCC Complier->Symboles下,将
__weak=__attribute__((weak)) 改成 '__weak=__attribute__((weak))'
__packed=__attribute__((__packed__)) 改成 '__packed=__attribute__((__packed__))'
也就是说将这两个参数加上单引号
在Tool Settings->MCU GCC Complier->Includes下,将
Inc 改成 ../../../Inc
Drivers/STM32F4xx_HAL_Driver/Inc 改成 ../../../Drivers/STM32F4xx_HAL_Driver/Inc
Drivers/STM32F4xx_HAL_Driver/Inc/Legacy 改成 ../../../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy
Drivers/CMSIS/Include 改成 ../../../Drivers/CMSIS/Include
Drivers/CMSIS/Device/ST/STM32F4xx/Include 改成 ../../../Drivers/CMSIS/Device/ST/STM32F4xx/Include
即路径前面都加上../../../,另外,如果路径中有反斜杠"\"的话也一律要替换为正斜杠"/"。
在Tool Settings->MCU GCC Linker->General下,将
..\STM32F407ZETx_FLASH.ld 改成 ../STM32F407ZETx_FLASH.ld
即将反斜杠替换为正斜杠。
然后在Build Artifact下的Artifact Name中的空格去掉。
通过以上设置,应该就可以编译通过了。
此时,在工程管理窗格,在Applications文件夹上右击,选择Index->Freshen All Files,就可以消除错误提示了。
然后继续,在Projects->Properities的设置下,选择Run/Debug Settings,选择New->Ac6 STM32 Debugging
此时会弹出定义新开发板的对话框,选择你的调试工具和接口以及开发板的名字。点击确定之后会自动生成一个调试配置文件。然后会弹出一个新的对话框。
在弹出的对话框中,在Debugger选项卡中,选择Use Local Script,然后选择刚刚弹出的对话框生成的cfg文件,选择确定(这一步通常不用做,已经默认配置好了)。
然后选择Run->Debug as->Ac6 STM32 C/C++ Application,就可以正常启动调试了。这个软件调试的一个不足之处在于没有类似于Keil的Live Watch功能,也就是说变量的值必须要等你手动将程序暂停或设置断点之后才能看到,而不能实时更新,虽然官方说这项功能他们在开发中了。
附记
如果使用J-Link该怎么办?
事实上,System Workbench for STM32也支持使用J-Link进行调试,使用方法也很简单。
工程配置之类的和前面一样做就可以了,将工程配置完后关闭Eclipse,然后用文本编辑器打开软件自动生成的调试配置文件,它是位于<工程名>/SW4STM32/<工程名 Configuration>文件夹下的一个.cfg文件,它的内容通常类似于以下内容:
1 # This is an Example board with a single STM32F407ZETx chip. 2 # Generated by System Workbench for STM32 3 4 source [find interface/stlink-v2.cfg] 5 6 set WORKAREASIZE 0x20000 7 transport select "hla_jtag" 8 set CPUTAPID 0x4ba00477 9 10 source [find target/stm32f4x_stlink.cfg] 11 12 # use hardware reset, connect under reset 13 reset_config srst_only srst_nogate
将其改成类似下面的内容:
1 # This is an Example board with a single STM32F407ZETx chip. 2 # Generated by System Workbench for STM32 3 4 source [find interface/jlink.cfg] 5 6 set WORKAREASIZE 0x20000 7 # transport select "hla_jtag" 8 set CPUTAPID 0x4ba00477 9 10 source [find target/stm32f4x.cfg] 11 12 # use hardware reset, connect under reset 13 reset_config srst_only srst_nogate
即将第4行的stlink-v2改成jlink;
将第7行注释掉;
将第10行的_stlink删掉。
这样就可以了。另外,如果要使用J-Link调试的话,注意先要到Segger官网下载安装J-Link的Linux驱动。
参考资料
STe2eCommunities,主题“STM32CubeMX as Eclipse plugin on Linux 64 machine”,hochreutiner.olivier的回答:https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32Java/STM32CubeMX%20as%20Eclipse%20plugin%20on%20Linux%2064%20machine
OpenSTM32 Community,“Importing a STCubeMX generated project”:http://www.openstm32.org/Importing+a+STCubeMX+generated+project?structure=Documentation
OpenSTM32 Community,主题“Error 258 on CubeMX imported project”,riuson的回答:http://www.openstm32.org/tiki-view_forum_thread.php?comments_parentId=700
STe2eCommunities,主题“how to use J-Link in Ac6 System Workbench for STM32 environment?”,shahrzad的回答:https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32Java/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2FSTM32Java%2Fhow%20to%20use%20J-Link%20in%20Ac6%20System%20Workbench%20for%20STM32%20environment&FolderCTID=0x01200200770978C69A1141439FE559EB459D758000F9A0E3A95BA69146A17C2E80209ADC21