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