孤星云影 发表于 2015-9-21 20:20:22

STM32CubeMX+SW4STM32:在Linux下开发STM32程序

本帖最后由 孤星云影 于 2015-9-21 21:56 编辑

因为最近需要做一些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官方支持的调试器。价格也比较便宜(盗版的非常便宜,正版的也不贵)。也可以使用J-Link,这个在文章最后讲。

开发板:
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文件,它的内容通常类似于以下内容:
# This is an Example board with a single STM32F407ZETx chip.
# Generated by System Workbench for STM32

source

set WORKAREASIZE 0x20000
transport select "hla_jtag"
set CPUTAPID 0x4ba00477

source

# use hardware reset, connect under reset
reset_config srst_only srst_nogate将其改成类似下面的内容:
# This is an Example board with a single STM32F407ZETx chip.
# Generated by System Workbench for STM32

source

set WORKAREASIZE 0x20000
# transport select "hla_jtag"
set CPUTAPID 0x4ba00477

source

# use hardware reset, connect under reset
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

此文为本人原创,首发于博客园,然后由本人转到阿莫BBS,允许转载,转载请注明出处。

hkchenhao 发表于 2015-9-21 21:01:47

也可以直接下载SW4STM32~现在在用eclipse+gcc编译速度要比sw4stm32快

孤星云影 发表于 2015-9-21 21:15:14

本帖最后由 孤星云影 于 2015-9-21 21:23 编辑

hkchenhao 发表于 2015-9-21 21:01
也可以直接下载SW4STM32~现在在用eclipse+gcc编译速度要比sw4stm32快

SW4STM32的Linux版不是要发邮件成为beta tester才可以吗?感觉挺麻烦的……

其实用SW4STM32就是因为CubeMX能够直接生成它的工程,不过因为其实Linux下并不是完全兼容,所以还是有点小麻烦……

hkchenhao 发表于 2015-9-21 21:34:49

孤星云影 发表于 2015-9-21 21:15
SW4STM32的Linux版不是要发邮件成为beta tester才可以吗?感觉挺麻烦的……

其实用SW4STM32就是因为Cube ...

哦哦,我以为SW4STM32的Linux版可以直接下载。。。Linux下Eclipse+GCC也很不错~GNU ARM Tools的插件做的很赞,可配置选项比SW4STM32要多~

four_zhg 发表于 2015-9-21 21:47:10

hkchenhao 发表于 2015-9-21 21:01
也可以直接下载SW4STM32~现在在用eclipse+gcc编译速度要比sw4stm32快

你的eclipse+gcc编译也能详述一下吗?下载哪些软件,我试了没成功

four_zhg 发表于 2015-9-21 22:01:51

hkchenhao 发表于 2015-9-21 21:01
也可以直接下载SW4STM32~现在在用eclipse+gcc编译速度要比sw4stm32快

你的eclipse+gcc编译也能详述一下吗?下载哪些软件,我试了没成功

hkchenhao 发表于 2015-9-21 22:31:51

four_zhg 发表于 2015-9-21 22:01
你的eclipse+gcc编译也能详述一下吗?下载哪些软件,我试了没成功

可以~原来写过一份简单的配置说明,我上传到百度云了,你可以作参考~链接:http://pan.baidu.com/s/1o6N64YI 密码:34k2

孤星云影 发表于 2015-9-21 22:32:55

hkchenhao 发表于 2015-9-21 21:34
哦哦,我以为SW4STM32的Linux版可以直接下载。。。Linux下Eclipse+GCC也很不错~GNU ARM Tools的插件做的 ...

是GNU ARM Eclipse么?那确实是一个很不错的工具。非常强大,不过配置要比SW4STM32麻烦些。

hkchenhao 发表于 2015-9-21 22:34:08

孤星云影 发表于 2015-9-21 22:32
是GNU ARM Eclipse么?那确实是一个很不错的工具。非常强大,不过配置要比SW4STM32麻烦些。 ...

是的~就是GNU ARM Eclipse Plug-ins{:lol:} {:lol:}

孤星云影 发表于 2015-9-21 22:44:32

本帖最后由 孤星云影 于 2015-9-21 22:46 编辑

hkchenhao 发表于 2015-9-21 22:34
是的~就是GNU ARM Eclipse Plug-ins

对了,话说这个插件将那个实时观测变量的功能加上了吗?
其实开发光STM32的话我感觉SW4STM32也够用了,不过没有实时变量观测功能还是不太方便。

hkchenhao 发表于 2015-9-21 23:08:54

孤星云影 发表于 2015-9-21 22:44
对了,话说这个插件将那个实时观测变量的功能加上了吗?
其实开发光STM32的话我感觉SW4STM32也够用了,不 ...

这个貌似还真没有,国外的不是已经有人向作者反映了,但这个功能好像一直没有加上

孤星云影 发表于 2015-9-21 23:18:37

hkchenhao 发表于 2015-9-21 23:08
这个貌似还真没有,国外的不是已经有人向作者反映了,但这个功能好像一直没有加上 ...

好吧,好像这些开源的ARM IDE基本都没有Live variables功能(貌似有一个Em::Blocks有这功能,不过那公司现在对它停止支持了,转而开发商业软件EmBitz了),而那些商业的基本都有这功能。
不过才发现GNU ARM Eclipse居然连模拟器都有了,加上实时变量观测的话就足以秒杀很多商业开发平台了。

xwkm 发表于 2015-9-22 07:28:18

孤星云影 发表于 2015-9-21 23:18
好吧,好像这些开源的ARM IDE基本都没有Live variables功能(貌似有一个Em::Blocks有这功能,不过那公司 ...

我打算找时间把emblocks并进emide。顺带搞定linux port

xwkm 发表于 2015-9-22 07:29:52

本帖最后由 xwkm 于 2015-9-22 07:31 编辑

孤星云影 发表于 2015-9-21 23:18
好吧,好像这些开源的ARM IDE基本都没有Live variables功能(貌似有一个Em::Blocks有这功能,不过那公司 ...

eclipse有点臃肿,我喜欢比较轻快的环境

fengyunyu 发表于 2015-9-22 08:43:54

JLINK可以用么?

styleno1 发表于 2015-9-22 09:22:07

mbed.com 跨平台可以考虑,单平台还是用顺手的工具,毕竟要生产力最大化。

孤星云影 发表于 2015-9-22 10:02:33

xwkm 发表于 2015-9-22 07:28
我打算找时间把emblocks并进emide。顺带搞定linux port

期待你的大作{:smile:}

孤星云影 发表于 2015-9-22 10:02:56

fengyunyu 发表于 2015-9-22 08:43
JLINK可以用么?

可以的,最后有讲。

redworlf007 发表于 2015-9-22 10:13:06

装个keil不就完了,何必整那么麻烦。

孤星云影 发表于 2015-9-22 10:37:40

本帖最后由 孤星云影 于 2015-9-22 10:40 编辑

redworlf007 发表于 2015-9-22 10:13
装个keil不就完了,何必整那么麻烦。

Linux下没Keil啊
当然,如果你要说用Wine的话当我没说好了
但是用Wine也没法调试啊,而且会有各种不明Bug

johnny412 发表于 2015-9-22 10:54:31

给力,留名备用,多谢楼主分享

apeng2012 发表于 2015-9-22 11:10:02

这个用得上,有机会试试。

windancerhxw 发表于 2015-9-23 22:42:23

{:handshake:}收藏了,会用得着

EngineeringBoy 发表于 2015-12-22 15:36:10

楼主,我用SWD模式一直不成功,板子选的是自己定制的,用的SWD模式,但是我在console窗口下看的还是用的JTAG模式,请问下这个怎么改,知道么?

liang16888 发表于 2015-12-22 19:21:40

Thank you !!

talkingbeast 发表于 2015-12-22 19:45:19

谢谢分享,很详细,谢谢。

mint 发表于 2015-12-22 22:16:15

不折腾会死星人,哈哈哈
页: [1]
查看完整版本: STM32CubeMX+SW4STM32:在Linux下开发STM32程序