因為最近需要做一些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