本文給出兩種方式:
第一種gcc-arm-none-eabi 來編譯
第二種利用插件導入KEIL工程,可以執行編譯調試燒錄
一、使用 VSCode + gcc + openOCD 開發
文章中所用到的工具版本都可以網上搜索一下找到下載。
1、安裝 gcc-arm-none-eabi-xxx
安裝 gcc-arm-none-eabi-5_4-2016q3-20160926-win32(這只是當時我配置時候用的版本,其他版本也是可以的) 記得最后的第3選項打鉤,因為自動添加環境變量(估計是因為自動添加,所以會添加到用戶的環境變量下面去,一樣可以用,如果自己添加,可以添加到系統的環境變量中去) 最后,只要是在你的終端(終端可以使window自帶的cmd,也可以是你配置過的模擬linux的終端),能夠查詢到arm gcc的版本,就算是正常安裝了,如下所示:
2、環境變量添加示意圖
下圖給出環境變量添加的示意圖,下面安裝的工具環境變量配置基本上按照這個圖來就可以:
但是,這個電腦上我的arm-gcc環境變量添加是在用戶變量下面的(gcc-arm-none-eabi安裝時候自自動添加的),應該用戶和系統都是可以的,有待驗證:
3、安裝mingw
安裝mingw-w64-install(根據自己的電腦選擇mingw的版本)
安裝的幾個選項給出說明 Version制定版本號,從4.9.1-8.1.0,按需選擇,沒有特殊要求就用最新版吧;Architecture跟操作系統有關,64位系統選擇x86_64,32位系統選擇i686; Threads設置線程標準可選posix或win32; Exception設置異常處理系統,x86_64可選為seh和sjlj,i686為dwarf和sjlj; Build revision構建版本號,選擇最大即可。
CPU架構 x86_64 64位
CPU架構 i686 32位
操作系統接口協議 win32 開發windows應用程序
操作系統接口協議 posix 開發Linux、Mac應用程序
異常處理模型(32bit CPU) dwarf 版本新,性能較好,不支持64位
異常處理模型(32bit CPU) sjlj 版本低,同時支持32位和64位
異常處理模型(64bit CPU) seh 版本新,性能較好,不支持32位
異常處理模型(64bit CPU) sjlj 版本低,但支持32位和64位
點擊Next ,其實就是自動下載 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z,如圖:
安裝完成以后如圖所示,我覺得路徑比較深,個人不太喜歡,等下我會調整下路徑:
如果自動下載比較慢,也可以直接從mingw的官網找壓縮包,按照自己需要的版本選擇,直接解壓,都是一樣的:
x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z(用這個壓縮包解壓)解壓出來內容如下圖:
最后根據自己的安裝路徑添加環境變量:系統變量中新建添加 D:Program Filesmingw64in
注意!注意!注意!最后即便這樣了,你會發現還是不能make,只需要在mingw64in目錄下找到mingw32-make.exe將mingw32-make.exe名字改成make.exe即可,如下圖:
至此,使用CubeMX直接可以生成Makefile 工程,直接make進行編譯:上圖就是使用STM32CubeMX直接生成的工程,直接編譯。
4、安裝openocd
OpenOCD(Open On-Chip Debugger)是開源片上調試器,OpenOCD旨在提供針對嵌入式設備的調試、系統編程和邊界掃描功能。OpenOCD的功能是在仿真器的輔助下完成的,仿真器是能夠提供調試目標的電信號的小型硬件單元。仿真器是必須的,因為調試主機(運行OpenOCD的PC)通常不具備這種電信號的直接解析功能。
通過網站下載OpenOCD的windows包OpenOCD下載地址
把下載的壓縮包解壓出來,這個OpenOC是免安裝的,比如我解壓在D盤:
添加環境變量步驟:
安裝完成以后可以查看版本號如下圖:
openocd的操作模式 openocd -f <接口配置文件> -f <目標芯片配置文件> -c <要執行的命令> 比如:openocd -f interface/stlink-v2.cfg -f target/stm32l0.cfg openocd -f interface/jlink.cfg -f target/stm32f1x.cfg
如果想了解更多,可以去查看官方的指導手冊:openocd官方手冊
5、Makefile的修改
Makefile 中的有些語法 是 linux下的,例如下面的clean:
####################################### #cleanup ####################################### clean: -rm-fR$(BUILD_DIR)
在window CMD終端中,make clean是不會成功的,這個時候你需要改成CMD下可以執行的操作:
####################################### clean: #-rm-fR$(BUILD_DIR) -del/q$(BUILD_DIR) #######################################
使用CubeMX生成的Makefile,是不支持浮點數打印的,所以需要加上-u_printf_float -u_sprintf_float,如下圖:
# libraries LIBS = -lc -lm -lnosys LIBDIR = LDFLAGS = $(MCU) -u_printf_float -u_sprintf_float -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections
我們目的是使用openocd進行燒錄,指令都是上面openocd 使用指令的集合,我們需要使用一個偽指令make download(名字其實按照自己的習慣命名就可以):
# Generate dependency information CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" # 這里需要使用絕對路徑,根據自己的環境路徑配置 INTERFACE_CFG="D:Program Filesopenocdshareopenocdscriptsinterfacestlink-v2.cfg" TARGET_CFG="D:Program Filesopenocdshareopenocdscripts argetstm32l0.cfg" # linux下的路徑 # INTERFACE_CFG=/usr/local/share/openocd/scripts/interface/stlink-v2.cfg # TARGET_CFG=/usr/local/share/openocd/scripts/target/stm32l0.cfg ####################################### # LDFLAGS ####################################### ... ####################################### # clean up ####################################### clean: -rm -fR $(BUILD_DIR) download: openocd -f $(INTERFACE_CFG) -f $(TARGET_CFG) -c init -c reset -c halt -c "flash write_image erase $(BUILD_DIR)/$(TARGET).hex" -c reset -c shutdown # 建議使用program,前面不需要加-c reset,實際測試更加穩定 # download: # openocd -f $(INTERFACE_CFG) -f $(TARGET_CFG) -c init -c halt -c # "program $(BUILD_DIR)/$(TARGET).hex" -c reset -c shutdown ####################################### # dependencies #######################################
6、燒錄過程的說明
make download 的操作:
-f interface/stlink-v2.cfg 根據相關目錄下的文件配置使用J-link還是st_link, 示例中使用的是stlink
-f target/stm32l0.cfg 選擇對應的芯片配置文件 示例中使用的是stm32l0系列
-c init 初始化
-c reset 芯片復位 (因為在實際使用中發現燒錄完成后會給芯片寫保護,導致再次使用此方法無法燒錄,必須復位一次) 經過后來測試發現使用 program xx.hex 指令燒錄是不需要在前面在 reset 的,而且每次都能章程燒錄 使用 flash write_image erase xx.hex 有時候會失敗,寫入以后也會給芯片寫保護,需要加reset
-c halt 掛起,等待燒錄
-c "flash write_image erase xx.hex" 或者 -c "program xx.hex" 燒錄對應的hex文件
如果是燒錄bin文件,需要指定燒錄的起始地址 -c "program xx.bin 0x08000000"
-c reset 芯片復位,自動運行
-c shutdown 自動關閉openocd的操作窗口
7、使用 Jlink 燒錄問題說明
以上的步驟我在使用 ST-LINK 的時候一切正常,但是在用到Jlink 的時候,也是遇到了問題,主要是2個問題,一個是Jlink使用SWD模式的問題,另外一個是openocd不識別jlink的問題。
openocd下無法找到J-Link設備:
7.1 openocd下如何識別J-Link
openocd無法識別jlink的官方的標準驅動,需要修改驅動,怎么修改我也是參照了網上前輩們的總結,需要用到 zadig 這個工具,下面給出官方下載地址:zadig下載地址如果官方地址下載太慢了,可以到其他網站找找,這個軟件我也放在了我上傳的工具包里面 exe文件直接運行,軟件打開后選擇Options,點擊List ALL Devices:然后再出來的設備中選中Jlink(千萬不要亂選,亂選操作失誤鼠標鍵盤什么都用不了了):
選中后會識別Jlink的版本,點擊下面的Replace Driver就可以(還是記住一下自己的版本,因為這個轉化是不可逆的,就是你用正常的驅動,Keil能正常用,j-scope,j-flash能正常用,換成這個以后,只能在openocd下使用了)先不慌,后面我還會測試下,如何換回去= =!
換完驅動后,操作試一下,如下圖,可以正常識別出J-Link(其他信息不用在意,下面我們會全部解決):
7.2 openocd使用 J-Link swd模式
我們在能夠識別J-Link后,發現也不能正常燒錄,這主要是STM32設置的調試模式問題,我們現在開發一般使用的都是SWD模式:
然而我們可以看看 在openocd的相關路徑下面 openocdscriptsinterfacejlink.cfg文件:
只是把設備選成了Jlink,沒有做別的任何處理,所以我們選擇swd模式無法調試下載,雖然我們可以在指令中直接加上 transport select swd,但是為了以后方便,我們可以自己做一個cfg文件,如圖:
保存以后再根據我們前面講過的知識,Makefile中添加如下(換了一套電腦,所以路徑有點不一致):
#省略 INTERFACE_CFG="D:OpenOCD-20210729-0.11.0shareopenocdscriptsinterfacejlink-swd.cfg" TARGET_CFG="D:OpenOCD-20210729-0.11.0shareopenocdscripts argetstm32f1x.cfg" #省略 ####################################### clean: #-rm -fR $(BUILD_DIR) -del /q $(BUILD_DIR) down: openocd -f $(INTERFACE_CFG) -f $(TARGET_CFG) -c init -c halt -c "program $(BUILD_DIR)/$(TARGET).hex" -c reset -c shutdown #######################################
最終,使用J-Link正常燒錄:
7.3 J-Link 恢復到 SEGGER J-Flash 使用
點擊卸載設備,勾選刪除此設備的驅動程序軟件進行卸載。
刪除完成后,重新拔插J-link,我這邊測試,因為本身電腦上有官方的驅動,所以居然自動識別出了,然后在Keil下測試了一下,也能識別燒錄OK,這樣我們就還原成功!當然這個時候,openocd是用不了了,不過我這里只是為了測試下如何還原,不至于使得J-Link變磚。
7.4換板子出現的Jlink燒錄問題(未解決)
最近用了另外一塊L051的板子在上次修改的Jlink上面燒錄,發現出現如下問題:
這個網上查了很多,也沒直接得到答案,自己也修改過配置,也沒有得到答案。
網上所謂的改stm32l0.cfg文件中的reset_config srst_nogate或者是set _WORKAREASIZE 0x800都試過沒用的:
折騰了好一段時間,最后還是換成ST-link燒錄的。
8、gcc下pirntf 的重定義
我們以前在Keil開發STM32的時候,printf都需要重定義才能正常觀察打印結果,在gcc下和Keil下的重定義是不一樣的,我直接給出我使用的方式:
/*USERCODEBEGIN0*/ #if1 #include#ifdef__GNUC__ #definePUTCHAR_PROTOTYPEint__io_putchar(intch) PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,HAL_MAX_DELAY); returnch; } int_write(intfile,char*ptr,intlen) { intDataIdx; for(DataIdx=0;DataIdxISR&0X40)==0); /*串口發送完成,將該字符發送*/ USART1->TDR=(uint8_t)ch; returnch; } #endif #endif
二、使用 VScode插件Embedded IDE進行開發
1、安裝 Embedded IDE插件
這種方法其實PC上還是得安裝一下KEIL,使用這種方式的好處在于,VScode的代碼編輯功能完爆KEIL太多了。在 VScode的 插件中,搜索 Embedded IDE :
**如果自動安裝失敗**,可以到下面這個網址找到插件包,自動安裝:Embedded IDE離線安裝包
下載號以后,在VScode插件欄目中,選擇從VSIX安裝,如下圖所示:
(對于這個插件的使用,插件的作者本身其實已經寫了很多很詳細的,這里給個傳送門使用文檔)
2、Embedded IDE插件配置操作說明
我這邊分別針對STM32F系列和nRF52832系列做一下簡單演示,找到插件點擊安裝,安裝好以后再VScode左邊的工具欄會多出Embedded IDE 的圖標,點擊打開IDE的工作區域:
第一步,設置工具鏈路徑,點擊IDE工作區域的 設置工具鏈路徑欄目,在彈出的界面中選擇Keil安裝路徑中的 TOOLS.INI 文件:
上圖操作完會彈出選擇界面,選擇KEIL5 安裝路徑下面的 TOOLS.INI 文件
完成上述配置后,就可以導入項目了,我們先找一個STM32F103的項目測試下:
右下角會彈出項目是否將 EIDE 與原有的KEIL項目存于同一目錄下,我這里作為測試,選擇NO,然后得自己新建一個文件夾放置工程:
自己找位置選擇一個文件夾(最好是英文不帶空格),然后在彈出的是否立即切換工作區,選擇繼續:
EIDE工程就打開了,打開工程他會自動切換到 左邊 Vscode資源管理器工作區欄目,但是我們的一些配置需要選中 左邊EIDE:
3、STM32F103 工程編譯燒錄示例
配置好以后就可以進行編譯了,編譯的小按鈕,編譯成功如下圖:
如果需要單步調試,需要安裝Cortex-Debug,我這邊的ST_linK調試還是有點問題,這里就不演示了,直接點擊燒錄測試:
4、nRF52832 工程編譯燒錄示例
下面我們找一個nRF52832的工程,按照步驟導入:
還是一樣配置好,其他東西都是默認就可以,還是可以正常編譯和燒錄:
-
Window
+關注
關注
0文章
82瀏覽量
37272 -
ARM
+關注
關注
134文章
9098瀏覽量
367679 -
編譯
+關注
關注
0文章
659瀏覽量
32877
原文標題:拋棄IDE — 在window下使用VScode搭建ARM開發環境
文章出處:【微信號:技術讓夢想更偉大,微信公眾號:技術讓夢想更偉大】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論