一、參考來源
VSCode開發(fā)STM32快速搭建開發(fā)環(huán)境零基礎(chǔ)教程!嗶哩嗶哩bilibili
上面的鏈接是主要參考的來源。
二、工具鏈
本次使用的工作有
arm-none-eabi-gcc 來作為編譯器;
pyocd 作為燒寫器;
vscode 作為編輯器;
vscode 的插件 cortex-debug 作為調(diào)試工具;
STM32cubeMX 作為模板的生成;
make 作為構(gòu)建工具。
三、VScode 的相關(guān)插件
CC++ 插件:作為 C 語言的主要插件。
360截圖17700510535946.png
Cortex-debug 插件:作為調(diào)試的插件。
360截圖177005105359406.png
四、配置過程
4.1 使用 stm32cubeMX 生成模板
使用 stm32cubeMX 的目的是使用其生成的 makefile 文件,嘻嘻。因?yàn)槠渌牟粫?huì)用,現(xiàn)不深究。但有一點(diǎn)要注意, stm32cubeMX 使用的是 stm 公司新推出的 hal 庫 ,而當(dāng)前項(xiàng)目使用的卻是其另一種推出的 stm32標(biāo)準(zhǔn)庫。因此,在后面的演示,我會(huì)把除 makefile 外的文件均刪除。。。
現(xiàn)演示的是怎生成模板:
打開 stm32cubeMX ,點(diǎn)擊 ACCESS TO MCU SELECTOR 。
360截圖17700510535946-1651573567296.png
使用英文輸入法輸入你想要的芯片型號(hào)。
360截圖17700510535946-1651573695124.png
并在右側(cè)的列表中選擇芯片,注意其封裝。
360截圖177005105359406-1651573772126.png
其他配置不在當(dāng)前演示的重點(diǎn),日后學(xué)到,再作重視。
360截圖17700510535946-1651573981925.png
這里的重點(diǎn)是 (4) 。我們選擇 makefile 。而toolchain folder location的話,我未設(shè)置,好像也行,因?yàn)槲野?arm-none-eabi-gcc 已經(jīng)加載到環(huán)境變量了。
360截圖17700510535946-1651574222999.png
上圖,就是生成的目錄。我把其他文件都刪去,只保留 Makefile (好像有點(diǎn)傻傻的樣子,哈哈,T^T)。
其中包括 .s 文件和 .ld 文件 ,因?yàn)槲疫€未測(cè)試過,所以在演示中,我選擇用回固件庫里的。
4.2 搭建以固件庫為基礎(chǔ)的項(xiàng)目架構(gòu)
項(xiàng)目的基本目錄
360截圖17700510535946-1651574884821.png
其中我定義了
Driver 放 stm32 標(biāo)準(zhǔn)庫的內(nèi)容
src 放自己寫的業(yè)務(wù)代碼
Makefile 構(gòu)建工具
360截圖17700510535946-1651574986088.png
上圖為 Driver 目錄下的結(jié)構(gòu),其中
CMSIS 放 core 代碼,對(duì)應(yīng)標(biāo)準(zhǔn)庫里的
360截圖17700510535946-1651575102566.png
360截圖177005105359406-1651575116915.png
即,
360截圖17700510535946-1651575151141.png
FWLB 放的是外設(shè)的文件,直接把標(biāo)準(zhǔn)庫里的 inc 目錄和 src 目錄復(fù)制過來就行,標(biāo)準(zhǔn)庫里的如下圖,
360截圖17700510535946-1651575261219.png
LINK_SCRIPTS 選擇的是
360截圖17700510535946-1651575382866.png
即,project -> template -> TrueSTUDIO -> STM3210E-EVAL -> stm32_flash.ld。此目錄放的是鏈接腳本。STM公司已經(jīng)幫我們?yōu)椴煌木幾g工具和不同芯片類型寫了一個(gè)模板。
其中 TrueSTUDIO 適用于 gcc 工具。 stm3210e 里放的是大容量的,而其他的區(qū)別,日后再作研究。
STARTUP 放的是啟動(dòng)文件。
360截圖17700510535946-1651575633839.png
同樣,我們選擇 TrueSTUDIO 里提供的模板,好像 gcc-ride7 里的也行,未測(cè)試過。
最后,還要把一些中斷之類的文件從模板中復(fù)制過來。
360截圖17700510535946-1651575835854.png
請(qǐng)注意,systme_stm32f10x.c 就不要復(fù)制了,因?yàn)樵谏厦嬷幸呀?jīng)有復(fù)制到其他地方了。不然在鏈接階段會(huì)報(bào) 重復(fù)定義
這樣,我們的基本項(xiàng)目架構(gòu)就完成了。
4.3 在 vscode 里構(gòu)建智能提示
在 vscode 使用快捷鍵 Ctrl+Shift+P 。鍵入 C/C++ ,選擇 C/C++: Edit Configurations(UI)
360截圖17700510535946-1651576148224.png
360截圖177005105359406-1651576164217.png
把編譯器改為 gcc, 而 IntelliSense 改為 windows-gcc-arm。
這里的作用是為了在智能提示里的 uint32_t 不報(bào)錯(cuò)。
360截圖17700510535946-1651576270291.png
當(dāng)你有其他庫的頭文件不在當(dāng)前項(xiàng)目里,請(qǐng)?jiān)谶@里增加路徑。不過一般不用修改,但在插件 keil assistent 里就有這樣的應(yīng)用。
360截圖17700510535946-1651576360898.png
添加相應(yīng)的宏。這很重要,在 stm32cubeMX 里和 stm32 固件庫 里的有不同,請(qǐng)注意。
在這里,我們會(huì)增加兩個(gè)
USE_STDPERIPH_DRIVER 表明我們使用的是標(biāo)準(zhǔn)固件庫
STM32F10X_HD 表明我們的芯片是 F1 系列的大容量產(chǎn)品
另外,加一些補(bǔ)充
__CC_ARM 若使用 keil assistent 插件導(dǎo)入 keil 項(xiàng)目時(shí),就要加入這個(gè)才能使 uint32_t 不會(huì)報(bào)錯(cuò)
同時(shí),其頭文件也要包含 ARMCC 的 include 和 include/rw 目錄。
不過插件會(huì)做好配置,不用我們操心 。
4.4 修改 makefile ,搭建 task
在 main.c 文件里鍵入測(cè)試代碼
#include 'stm32f10x.h' void GPIO_config(void); void LED_on(void); void LED_off(void); void delay(uint32_t i); int main(void) { GPIO_config(); while (1) { LED_off(); delay(0x0FFFFF); LED_on(); delay(0x0FFFFF); } return 0; } void GPIO_config(void) { GPIO_InitTypeDef GPIO_init_args; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_init_args.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_init_args.GPIO_Pin = GPIO_Pin_1; GPIO_init_args.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_init_args); } void LED_on(void) { GPIO_ResetBits(GPIOB, GPIO_Pin_1); } void LED_off(void) { GPIO_SetBits(GPIOB, GPIO_Pin_1); } void delay(volatile uint32_t i) { while (i--); }
然后,我們還要修改 makefile 里的內(nèi)容。
TAGET 生成的目標(biāo)名稱
C_SOURCE C/C++ 文件,例
###################################### # source ###################################### # C sources C_SOURCES += $(wildcard Driver/CMSIS/*.c) C_SOURCES += $(wildcard Driver/FWLB/src/*.c) C_SOURCES += $(wildcard src/*.c)
ASM_SOURCE 啟動(dòng)文件或匯編文件,例
# ASM sources ASM_SOURCES = Driver/STARTUP/startup_stm32f10x_hd.s
LDSCRIPT 鏈接腳本,例
####################################### # LDFLAGS ####################################### # link script LDSCRIPT = Driver/LINK_SCRIPTS/stm32_flash.ld
C_INCLUDE C/C++ 的頭文件搜索目錄,例
# C includes C_INCLUDES = -Isrc -IDriver/CMSIS -IDriver/FWLB/inc
C_DEFS 一些配置用的宏定義,一般用來指定開啟某些功能用的,例
# C defines C_DEFS = -DUSE_STDPERIPH_DRIVER # 不定義的話,F(xiàn)WLB的內(nèi)容不會(huì)被包含 -DSTM32F10X_HD # 定義設(shè)備
4.5 構(gòu)建編譯任務(wù)
構(gòu)建 tasks 。菜單中選擇 Terminal --> Configure Tasks... --> 選擇 gcc.exe 生成(其實(shí),哪個(gè)都行,反正都要改)。然后把 tasks.json 化簡(jiǎn),并把部分信息整理下。下面是我的例子,
{
'version': '2.0.0',
'tasks': [
{
'type': 'shell', // 不知是有何用的,我仿別人的
'label': 'build', // 這會(huì)在 Ctrl+Shift+B 時(shí)顯示
'command': 'make', // 這是運(yùn)行的程序
'args': [ // 例如 > make
]
'group': 'build', // 這個(gè)好像很重要,其與下一組 tasks 一樣才能做選擇
}
]
}
然后選擇 Ctrl+Shift+B ,因?yàn)橹挥幸粋€(gè)任務(wù),故 vscode 自動(dòng)運(yùn)行了。
但是,運(yùn)行了一會(huì)兒,就出現(xiàn)報(bào)錯(cuò),
C:Users11207AppDataLocalTempcczTFbui.s: Assembler messages:
C:Users11207AppDataLocalTempcczTFbui.s:599: Error: registers may not be the same -- `strexb r0,r0,[r1]'
C:Users11207AppDataLocalTempcczTFbui.s:629: Error: registers may not be the same -- `strexh r0,r0,[r1]'
make: *** [Makefile:141: build/core_cm3.o] Error 1
解決方法,參考自 (20條消息) VS Code + GCC 搭建 STM32 開發(fā)環(huán)境qq_32166451的博客-CSDN博客vs開發(fā)stm環(huán)境
問題出在標(biāo)準(zhǔn)固件庫里,這里的匯編與 gcc 的不一致,故要修改文件 core_cm3.c。
在文件 core_cm3.c 里搜索 strexb 和 strexh ,把兩行語句里的 =r 修改成 =&r。
保存后,可再嘗試。最后編譯成功會(huì)得出下面類型的語句
arm-none-eabi-size build/stm_gcc.elf
text data bss dec hex filename
1376 8 540 1924 784 build/stm_gcc.elf
arm-none-eabi-objcopy -O ihex build/stm_gcc.elf build/stm_gcc.hex
arm-none-eabi-objcopy -O binary -S build/stm_gcc.elf build/stm_gcc.bin
4.6 燒錄程序
燒錄的程序,我們使用的是 pyocd 。其可以通過 pip install pyocd 來安裝??蓞⒖?玩轉(zhuǎn) pyocd - 哈拎 - 博客園 (cnblogs.com)。
我記錄一些基本應(yīng)用。
> > pyocd list # Probe Unique ID -------------------------------------------------- 0 Keil Software Fire CMSIS-DAP HS-00012048
當(dāng)你連接上仿真器后,使用此命令就可以讀出其類型。
其與 keil MDK 一樣,其有些芯片不在自身的庫內(nèi),可以使用命令下載 ,但很慢 。慶幸的是,也可以其與 keil 芯片包通用。
360截圖17700510535946-1651590929435.png
我把從野火論壇下載的包放出來。因?yàn)槲业男酒?stm32f103ve6 ,所以我選擇了 F1xx 的包。
Documentation — pyOCD
從其文檔里得到一信息,包導(dǎo)入的方式可以是在命令行里以額外參數(shù)的方式,也可以在項(xiàng)目里鍵入配置信息。我這使用第二種方法。
創(chuàng)建 pyocd.yaml 文件
pack: - Keil.STM32F1xx_DFP.2.4.0.pack
注: - keil... 是指其路徑。
然后使用 pyocd list -t, -t 即是 --taget ??梢孕幸恍┬畔?,
> > pyocd list -t
......
stm32f103rb STMicroelectronics STM32F103RB STM32F1 Series, STM32F103 pack
stm32f103rc STMicroelectronics STM32F103RC builtin
stm32f103rd STMicroelectronics STM32F103RD STM32F1 Series, STM32F103 pack
stm32f103re STMicroelectronics STM32F103RE STM32F1 Series, STM32F103 pack
stm32f103rf STMicroelectronics STM32F103RF STM32F1 Series, STM32F103 pack
stm32f103rg STMicroelectronics STM32F103RG STM32F1 Series, STM32F103 pack
stm32f103t4 STMicroelectronics STM32F103T4 STM32F1 Series, STM32F103 pack
stm32f103t6 STMicroelectronics STM32F103T6 STM32F1 Series, STM32F103 pack
......
這里說明,當(dāng)前環(huán)境下,存在了 F10x 的芯片了。
然后就是配置燒錄任務(wù)。在 tasks.json 里鍵入
{
'tasks': [
{
...
},
{
'type': 'shell',
'label': 'update',
'command': 'pyocd',
'args': [
'load', // 燒錄命令
'-t', // 選擇目標(biāo)芯片
'stm32f103ve', // 芯片型號(hào)
'./build/test2.elf' // 下載文件,可以是 elf, hex, bin。其中 bin 文件
// File to write to memory. Binary files can have an optional base address appended to the file name as '@
', for instance 'app.bin@0x20000'.],
'group': 'build',
}
]
}
當(dāng)然還有其他功能,日后再細(xì)看。
4.7 調(diào)試程序
點(diǎn)擊左側(cè)面板的調(diào)試,選擇創(chuàng)建 launch.json 文件
360截圖17700510535946-1651592703906.png
然后選擇 GDB 那一行。
點(diǎn)擊右下角的 add configuration... 選擇 cortext-debug: PyOcd 。
{
// Use IntelliSense to learn about possible attributes.
上一篇:【STM32 LL庫編程】外部中斷與中斷管理
下一篇:STM32 模板文件配置
推薦閱讀最新更新時(shí)間:2025-06-28 12:43

- 熱門資源推薦
- 熱門放大器推薦
-
【Follow me第三季第一期】STM32F429I-DISC1任務(wù)匯總
-
【Follow me第三季第1期】任務(wù)三:Arduino環(huán)境運(yùn)動(dòng)傳感器數(shù)據(jù)讀取
-
【Follow me 第三季第1期】任務(wù)二——Arduino控制板載LED燈,并實(shí)現(xiàn)呼吸燈效果
-
【Follow me 第三季第1期】任務(wù)一 源碼-——Arduino環(huán)境Hello EEWorld
-
射頻電路設(shè)計(jì)
-
器件應(yīng)力降額總規(guī)范(艾默生)
-
5G通信系統(tǒng)定位技術(shù)原理與方法
-
笨辦法學(xué)C語言
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- LTC3119IFE 5V、500kHz 寬輸入穩(wěn)壓器的典型應(yīng)用電路
- BPC292封裝的SPC58 C,E,G和N線的微型插座模塊
- FRDM-17C724EVB: Freedom套件 - MPC17C724, 0.4 A雙H橋
- LTC695-3.3 的典型應(yīng)用 - 3.3V 微處理器監(jiān)控電路
- 使用 Analog Devices 的 LTC6263HMS 的參考設(shè)計(jì)
- FSA3000 兩端口高速 MHL 交換機(jī)的典型移動(dòng) MHL 應(yīng)用
- LTC3633AIFE 1.5V 1MHz 雙相降壓穩(wěn)壓器的典型應(yīng)用電路
- NCV33074ADR2G 運(yùn)算放大器用作 LED 驅(qū)動(dòng)器的典型應(yīng)用
- 4463-915-PDK,用于 Si4463 915-MHz 射頻收發(fā)器的 EZRadio-PRO 無線開發(fā)套件
- CN0313
- 基于STM32的超聲波HC-SR04詳解
- 55-基于51單片機(jī)的溫度檢測(cè)報(bào)警系統(tǒng)
- MSP430G2553 Launchpad 硬件I2C驅(qū)動(dòng)
- 新思科技與臺(tái)積公司拓展戰(zhàn)略合作提供3D系統(tǒng)集成解決方案
- 一加9系列推穩(wěn)定版OxygenOS 12
- 英特爾宣布將推動(dòng)Mobileye獨(dú)立上市
- 博流劉占領(lǐng):全屋智能普及需要邊緣網(wǎng)關(guān)
- s3c2440裸機(jī)實(shí)驗(yàn)(5)----IIS
- 網(wǎng)絡(luò)分析儀通道超差故障的解決方法是什么
- 整車控制網(wǎng)絡(luò)系統(tǒng)CAN總線特性分析
- 潤(rùn)石科技推出RS3215-Q1系列低壓差線性穩(wěn)壓器
- CANape 23開啟智能測(cè)試新時(shí)代(下)
- 軟件定義汽車電源管理設(shè)計(jì):NXP的PMIC選型攻略解析
- 深度測(cè)評(píng)時(shí)空壺X1同聲傳譯器:全球最先進(jìn)AI同傳設(shè)備的非凡實(shí)力
- 作為領(lǐng)先的垂直整合制造商(IDM),英飛凌在 300mm氮化鎵生產(chǎn)路線圖方面取得突破
- 鐵威馬F6-424 Max:六盤位擴(kuò)容+國(guó)產(chǎn)系統(tǒng)兼容,小白也能玩轉(zhuǎn)NAS
- 開關(guān)電源給鉛酸電池恒流恒壓充電的電流跳動(dòng)問題解析
- 自動(dòng)駕駛中的激光雷達(dá)是否會(huì)傷害攝像頭?
- 觸覺技術(shù)助力企業(yè)在激烈的市場(chǎng)競(jìng)爭(zhēng)中脫穎而出
- 芯片中的串?dāng)_噪聲有幾類
- 全新8位tinyAVR? MCU可增加傳感器節(jié)點(diǎn)功能
- 適合驅(qū)動(dòng) LED的38VIN、10A 升壓型 μModule 穩(wěn)壓器
- 增強(qiáng)您汽車設(shè)計(jì)的低功耗藍(lán)牙設(shè)備SoC NCV-RSL10
- 英特爾 5g不只是無線互聯(lián),更是第四次工業(yè)革命基礎(chǔ)
- Pasternack推出一系列用于高速數(shù)字測(cè)試時(shí)延匹配電纜線對(duì)新品
- 關(guān)于51單片機(jī)的復(fù)位
- 基于單片機(jī)的電動(dòng)執(zhí)行機(jī)構(gòu)控制器的研究
- 用SST89C58自制51仿真器
- 解讀美信DS28E40
- 吉時(shí)利DMM7510萬用表維修
- 昨天接到武漢力源的電話
- 裁剪 WinCE 時(shí)可以吧 UDP 協(xié)議裁掉么?我的 PDA 怎么只能 TCP 通訊,不能 UDP 通訊?
- 年底了,出點(diǎn)東西好過年
- 求大神幫我看看程序咋死在1602液晶顯示里了
- 全球半導(dǎo)體產(chǎn)業(yè)起伏中醞釀新變
- 2個(gè)驅(qū)動(dòng) 2個(gè)分區(qū)?
- 我用STC12C5A32S2的單片機(jī),我現(xiàn)在想用儲(chǔ)存卡存儲(chǔ)數(shù)據(jù),不知道用什么卡好
- 求助:用MSP實(shí)現(xiàn)兩個(gè)模擬信號(hào)相除
- [吐血推薦]^_^單片機(jī)多媒體教程-下載地址
- 2020曬曬我眼中的+國(guó)家健康文明縣級(jí)市遷安