前言:
現在開發stm32已經有很多人性化的ide了,像常用的keil,以及後面ST新推出的跨平臺的STM32cubeide,都可以搭建自己的工程來開發。
但是本猿有時候就喜歡玩點另類的,比如這次我在ubuntu上搭建了stm32的開發環境,用vscode來開發,腳本編譯甚至用來仿真(j-link),雖然整體功能上沒有keil這些配套ide來的強大,但是有vscode的加持與開放的環境,整體用起來還是有一些獨到的好處的。
比如整體會搞清楚很多東西,像工程的編譯過程,生成最後燒寫文件,最後程序執行;以及makefile與shell的使用;編譯的參數是什麼意思(對應到keil ide裏面就是工程的配置)等。
本篇目標:瞭解ubuntu如何開發stm32,以及相關的一些內容。
資料準備:
- 可用的ubuntu(這裏是18.04版本)系統,可以安裝虛擬機,也可以直接安裝ubuntu系統哦。
- 選擇一款趁手的源代碼編輯器,這裏推薦選擇的是vscode哦,如果沒有接觸過vscode,可以看這裏
快速入門哦。 - 我們這裏需要用jlink來燒寫,所以需要安裝jlink驅動(Linux, DEB installer, 64-bit)
哦。 - 搭建完成的工程:stm32f4_linux_prj
工程介紹
1. 工程功能:
- 支持linux下stm32f407一鍵編譯燒寫,支持jlink。
- 支持vscode進行一鍵編譯,jlink燒錄、甚至仿真。
- 硬件方面已支持以太網lan8720、後續將支持rtl8189無線芯片。
- 工程已經或將支持的一些第三方開源庫:freertos、lwip、logger、flash存儲、cjson、http、mqtt、mbedtls等。
- 後續將支持自己編寫的應用組件:智能燈泡、智能插座、智能紅外遙控器等組件。
- 後續將安排在此工程上創建更多的關於物聯網、智能家居相關的工程。
2. 先將工程clone到本地:
git clone https://github.com/jinhaotutu/stm32f4_linux_prj.git
.
├── LICENSE
├── README.md
└── stm32f4_linux_mk
├── doc //相關文檔
├── fwlib //STM32庫函數文件
├── misis //STM32相關配置頭文件
├── obj //編譯相關文件夾
│ ├── makefile //makefile文件
│ ├── objects.mk
│ ├── sources.mk
│ ├── STM32F407ZGTX_FLASH.ld //stm32的flash映射文件
│ ├── subdir.mk //編譯規則
│ └── tools //arm-linux編譯器
├── Startup
│ └── startup_stm32f407zgtx.s //stm32啓動文件
├── sys //stm32外設、接口文件
├── thirdlib //第三方開源庫
└── user
├── build.sh //編譯腳本
├── load.sh //jlink燒寫腳本
├── stm32_lwip_withos //stm32+lwip+freertos工程
├── stm32_rtos_single //stm32+freertos工程
├── stm32_single //stm32示例工程
└── stm32_socket //stm32+lwip+freertos+socket工程
.____ 待更新
3. 編譯燒寫stm32工程:
# 單編譯
# 1. 進入工程根目錄
cd stm32f4_linux_prj/stm32f4_linux_mk/user/
# 2. 調用build.sh腳本進行編譯:第二入參user目錄下工程名(stm32_single)、第三入參固件版本號(1.0.0) -- 生成bin文件在工程output文件夾
sh build.sh stm32_single 1.0.0
# 使用 j-link進行燒寫
# 1. 單燒錄:第二入參,燒錄bin文件相對路徑,使用jlink-swd模式下載,所以保證燒錄前安裝了jlink驅動以及連接了stm32
sh load.sh ./stm32_single/output/1.0.0/stm32_single_app_v1.0.0.bin
# 2. 編譯+燒寫:在單編譯加入第三入參loadbin,進行一鍵編譯+燒寫
sh build.sh stm32_single 1.0.0 loadbin
# 清除
sh build.sh stm32_single 1.0.0 clean #加入第三入參clean進行編譯中間文件清除
4. 編譯過程解析:
- 調用build.sh腳本進行自動編譯,在腳本里會對編譯器環境進行檢測,執行make命令進行編譯,並將生成的產物輸入到指定路徑以供使用,同時如果需要燒錄會調用load.sh腳本進行jlink燒錄。
- 在obj目錄下是有關編譯的文件,主要包括makefile、subdir.mk、STM32F407ZGTX_FLASH.ld以及 tools文件夾下的編譯器。
- makefile借鑑了stm32cubeide生成的makefile結構。首先包含subdir.mk等文件,將所有.c編譯成.o、.d等中間文件保存在output文件夾,並將.h的路徑包含進去。然後調用make all將所有.o文件結合stm32的flash分配表(STM32F407ZGTX_FLASH.ld)生成elf文件。
- 通過elf文件生成.list、.map、.bin文件,.bin文件是最後的二進制燒寫文件,其他文件都是用來方便查找問題的,比如elf可以通過addr2line命令進行地址查找代碼的具體位置。
- 後續會通過將不同的模塊編譯成.lib的形式,最後進行鏈接生成二進制文件,這樣在項目龐大的情況下可以優化整個編譯的效率。
其他可玩功能
你以爲就以上編譯一個demo工程就完了嗎?那就太沒意思了,來點其他好玩的:
1. 使用vscode進行一鍵編譯燒寫(可通過ctrl+shift+b來快速執行任務,具體配置在 tasks.json 中,有興趣的同學可以參照):
2. 使用vscode進行jlink仿真(可通過F5來快速進入仿真,具體配置在 launch.json 中,有興趣的同學可以參照):
後續相關更新
- mqtt客戶端
- http客戶端
- 簡單的web服務器
- 智能家居系列:燈泡、插座、紅外
- 小程序界面
- 等等…
上述的所有以及之前已有的一些功能我也希望通過後續的文章進行仔細介紹,比如移植rtos、移植lwip,mqtt與http等必要的知識點。
物聯網可能在持續爆發,但是知識一直在那裏,要時刻進行學習~
藉此推廣一下自己的公衆號,與博客一樣,推送一些關於物聯網的知識、技術、產品介紹~希望能幫到有需要的人:
Tuu