1.為什么不是gcc
在開發(fā)stm32的時(shí)候,編譯工具鏈要使用gcc-arm-none-eabi,為什么不是gcc呢?這就要說到linux下的交叉編譯了,因?yàn)槲覀円赑C機(jī)上編譯出可以運(yùn)行在ARM上的程序,使用gcc編譯出的是在PC上運(yùn)行的程序,所以我們要使用gcc-arm-none-eabi進(jìn)行交叉編譯~
2.gcc-arm-none-eabi toolchain 介紹及安裝
gcc-arm-none-eabi是一個(gè)開源的ARM開發(fā)工具鏈,適用于Arm Cortex-M和Coretex-A系列處理器,包括GNU編譯器(GCC),以及GDB,可用于Windows,Linux,MacOS上的交叉編譯。
gcc-arm-none-eabi在ubuntu軟件源倉庫中就有,但是版本比較陳舊:
在此我們從[ARM官方下載鏈接](https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads)選擇合適的版本下載(這里我選擇Linux64):
解壓下來是tar.ba2格式包,使用命令tar -jxf <要解壓的文件>解壓到我們要安裝的目錄:
為了以后使用方便,將文件夾重命名:
它下面的bin目錄就是我們要使用的編譯工具鏈:
share目錄的doc下包含了大量的使用幫助文檔,可以先略讀一二,特別是readme.txt:
接下來我們要將bin目錄添加到環(huán)境變量,這樣可以直接在命令行輸入要使用的工具名,然后系統(tǒng)就可以找到該工具,在此我們僅為當(dāng)前用戶添加環(huán)境變量,使用vim ~/.bashrc編輯當(dāng)前用戶配置文件,在最后添加export PATH=$PATH:/home/mculover666/gcc-arm-none-eabi/bin:
然后使用命令source ~/.bashrc更新系統(tǒng)路徑,使添加的環(huán)境變量立即生效:
然后輸入命令arm-none,然后按三下Tab(一定不要輸入全部),檢查系統(tǒng)是否可以自動(dòng)補(bǔ)全:
如果系統(tǒng)可以提示,說明環(huán)境變量配置成功,可以開心的使用arm-none-eabi工具鏈啦~
3.從裸機(jī)工程開始
3.1.硬件說明
這里我使用的是野火霸道開發(fā)板,板載芯片為STM32F103ZET6,下載器使用e-link,這個(gè)下載器使用CMSIS-DAP下載程序,同時(shí)并帶有一個(gè)串口,非常好用~
板載RGB-LED的原理圖如圖所示:
3.2.新建空的裸機(jī)工程
首先新建一個(gè)文件夾mkdir 00-template-reg用來存放整個(gè)工程,然后整個(gè)工程包含三個(gè)文件:
startup_stm32f10x_hd.s:從固件庫中拷貝,注意不是arm文件夾下的,因?yàn)閠ruestudio使用的是gcc編譯器,所以我們選擇truestudio文件夾下的啟動(dòng)文件;
stm32f10x.h:空文件;
main.c:代碼如下:
#include'stm32f10x.h' intmain() { /*開啟GPIOB時(shí)鐘*/ *(unsignedint*)(0x40021000+0x18)|=1<<3; /* 配置PB0為推挽輸出 */ *(unsigned int*)(0x40010c00+0x00) |= 1<<(4*0); /* PB0輸出低電平,點(diǎn)亮綠色LED */ *(unsigned int*)(0x40010c00+0x0c) &= ~(1<<0); while(1); } void SystemInit(void) { }
4.編譯
接下來就是激動(dòng)人心的編譯步驟了~編譯的時(shí)候有兩種文件,一種是匯編啟動(dòng)文件,一種是c源文件,接下來分別編譯:
首先需要說明一些編譯任何一個(gè)文件都需要帶上的參數(shù):
參數(shù) | 說明 |
---|---|
-mthumb | 表明使用的指令集(必需) |
-mcpu=cortex-m3 | 表明芯片內(nèi)核(必需) |
-g | 產(chǎn)生調(diào)試信息 |
4.1.啟動(dòng)文件編譯
啟動(dòng)文件一般是由匯編寫成,此處需要注意的是,匯編文件的格式有.S和.s之分:
大寫S:表明文件中含有預(yù)處理指令(比如#define),需要先進(jìn)行處理;
小寫s:表明文件不需要處理,可以直接編譯;
之前我們添加的啟動(dòng)文件是小寫.s,所以直接進(jìn)行編譯,另外說一下,如果使用的是.S文件,那么需要帶上-x assembler-with-cpp參數(shù)。
接下來說明一些匯編文件gcc編譯器使用的參數(shù):
參數(shù) | 說明 |
---|---|
-x assembler-with-cpp | 先對(duì)文件進(jìn)行預(yù)處理 |
-Wa,option | 向匯編器Assembler傳遞參數(shù) |
注:可以向匯編器傳遞的參數(shù):
參數(shù) | 說明 |
---|---|
-W或--no-warn | 關(guān)閉所有告警 |
--fatal-warnings | 將所有的警告提示為錯(cuò)誤 |
--warn | 正常提示告警信息 |
所以,接下來我們可以使用如下的參數(shù)組合來編譯啟動(dòng)文件(不進(jìn)行預(yù)處理,并且正常提示告警信息):
arm-none-eabi-gcc-c-mthumb-mcpu=cortex-m3-g-Wa,--warn-ostartup_stm32f10x_hd.ostartup_stm32f10x_hd.s
4.2.C文件編譯
因?yàn)閙ain.c中沒有特殊的東西,只是兩個(gè)函數(shù),所以簡(jiǎn)單的編譯一下就可以了:
參數(shù) | 描述 |
---|---|
-Wall | 允許輸出所有警告 |
arm-none-eabi-gcc-c-mthumb-mcpu=cortex-m3-g-Wall-omain.omain.c
5.鏈接
鏈接重要的部分有兩點(diǎn):鏈接文件和傳遞給鏈接器的參數(shù)。
鏈接文件在固件庫中給的示例工程中有,在下面這個(gè)目錄:
其中stm32_flash.ld是針對(duì)于STM32F103ZE的鏈接文件,如果是別的芯片,需要進(jìn)行修改,將它復(fù)制到我們的工程中去:
然后就要讓鏈接器開始根據(jù)stm32_flash.ld這個(gè)文件對(duì)startup_stm32f10x_hd.o和main.o這兩個(gè)文件開始鏈接,生成包含了調(diào)試信息的elf文件,同時(shí),我們還需要給鏈接器傳遞一些參數(shù):
參數(shù) | 描述 |
---|---|
-T | 指定鏈接文件 |
arm-none-eabi-gcc-otest.elfmain.ostartup_stm32f10x_hd.o-mthumb-mcpu=cortex-m3-Tstm32_flash.ld-specs=nosys.specs-static-Wl,-cref,-u,Reset_Handler-Wl,-Map=test.map-Wl,--gc-sections-Wl,--defsym=malloc_getpagesize_P=0x80-Wl,--start-group-lc-lm-Wl,--end-group
6.生成bin文件和hex文件
利用arm-none-eabi-objcopy工具可以將elf文件轉(zhuǎn)化為適合于單片機(jī)的bin文件和hex文件,其中參數(shù)-O(大寫o)用于指定輸出文件的格式(默認(rèn)是bin格式)
arm-none-eabi-objcopytest.elftest.bin arm-none-eabi-objcopytest.elf-Oihextest.hex
7.編寫一個(gè)makefile雛形
TARGET=test CC=arm-none-eabi-gcc OBJCOPY=arm-none-eabi-objcopy RM=rm-f CORE=3 CPUFLAGS=-mthumb-mcpu=cortex-m$(CORE) LDFLAGS=-Tstm32_flash.ld-Wl,-cref,-u,Reset_Handler-Wl,-Map=$(TARGET).map-Wl,--gc-sections-Wl,--defsym=malloc_getpagesize_P=0x80-Wl,--start-group-lc-lm-Wl,--end-group CFLAGS=-g-o $(TARGET):startup_stm32f10x_hd.omain.o $(CC)$^$(CPUFLAGS)$(LDFLAGS)$(CFLAGS)$(TARGET).elf startup_stm32f10x_hd.o:startup_stm32f10x_hd.s $(CC)-c$^$(CPUFLAGS)$(CFLAGS)$@ main.o:main.c $(CC)-c$^$(CPUFLAGS)$(CFLAGS)$@ bin: $(OBJCOPY)$(TARGET).elf$(TARGET).bin hex: $(OBJCOPY)$(TARGET).elf-Oihex$(TARGET).hex clean: $(RM)*.o$(TARGET).*
使用命令make編譯生成elf文件;
使用命令make bin將elf文件轉(zhuǎn)化生成bin文件;
使用命令make hex將elf文件轉(zhuǎn)化生成hex文件;
使用命令make clean即可清除掉所有編譯產(chǎn)生的文件。
上一篇:STM32F4_TIM輸出PWM波形 (可調(diào)頻率、占空比)
下一篇:探秘STM32U5安全特性|硬件加解密引擎與軟件算法對(duì)比
推薦閱讀最新更新時(shí)間:2025-07-16 14:14




設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- LT1934IS6-1 3.3V 降壓轉(zhuǎn)換器的典型應(yīng)用電路
- 用于 SRC Crowbar 的 NCV431A 可編程精密基準(zhǔn)的典型應(yīng)用
- LTC3415EUHF、3.3V 至 1.8V/7A 應(yīng)用
- 使用 Richtek Technology Corporation 的 RT9063 的參考設(shè)計(jì)
- AD9246-105EBZ,用于評(píng)估 AD9246 14 位、105 MSPS 模數(shù)轉(zhuǎn)換器的評(píng)估板
- 無電流感應(yīng)的 STC3115 電量計(jì)的典型應(yīng)用
- DC1851A,使用具有集成終端的 LTC2872 雙路多協(xié)議收發(fā)器的演示板
- 具有 6.4A 輸入電流限制和 5V、30W 備份模式的 LTC3350EUHF 4.8V 至 12V、10A 超級(jí)電容器充電器的典型應(yīng)用電路
- EVAL-ADXRS450Z-V,ADXRS450 評(píng)估板,±300 度/秒,1 軸數(shù)字輸出速率陀螺儀
- LTC3225EDDB 演示、薄型穩(wěn)壓雙節(jié) SuperCAP 充電器
- LPC11U35 SSP/SPI學(xué)習(xí)筆記
- 半導(dǎo)體設(shè)備市場(chǎng)井噴前夜,本土廠商怎樣乘風(fēng)而上?
- 雷達(dá)液位計(jì)在大型化工儲(chǔ)罐中的應(yīng)用
- 紫光云完成了6億元融資,中移資本領(lǐng)投
- TI推出全新3D霍爾效應(yīng)位置傳感器,實(shí)現(xiàn)更快的實(shí)時(shí)控制
- 首發(fā)18bit ISP:驍龍8將手機(jī)攝影的天花板拉到新高
- 羅德RS SMF100A信號(hào)發(fā)生器維修案例
- 網(wǎng)絡(luò)分析儀通道超差故障的解決方法是什么
- 瑞薩投資者日公布多項(xiàng)藍(lán)圖:開發(fā)單芯片雷達(dá),進(jìn)入碳化硅市場(chǎng)
- 80c51引腳圖管腳圖及各引腳功能介紹
- 意法半導(dǎo)體推出先進(jìn)的 1600 V IGBT,面向高性價(jià)比節(jié)能家電市場(chǎng)
- EDPF-NT+分散控制系統(tǒng)網(wǎng)絡(luò)防護(hù)解決方案
- 基于PLC控制的易驅(qū)變頻器在布袋除塵器上的應(yīng)用
- 如何利用伺服自動(dòng)化實(shí)現(xiàn)成本降低和產(chǎn)能最大化?
- 壓力傳感器有哪些抗干擾措施?
- 破局!補(bǔ)盲dToF固態(tài)激光雷達(dá)輪番“出手”,禾賽FT120也要靠邊
- 利用正壓送風(fēng)壓力傳感器自動(dòng)控制火災(zāi)風(fēng)口壓力
- 多個(gè)傳感器間相互位置關(guān)系校準(zhǔn)方法
- 樓宇自控BA系統(tǒng)傳感器有哪些?
- 常見壓力傳感器工業(yè)原理匯總
- SiC功率半導(dǎo)體市場(chǎng)加速攀升 汽車產(chǎn)業(yè)成主要推手
- 半導(dǎo)體清洗領(lǐng)域:國產(chǎn)設(shè)備商進(jìn)展積極
- IC設(shè)計(jì)再添百元新兵,晶相光上市漲46%
- 為拿下安世半導(dǎo)體 聞泰科技借款60億重組
- 解決集成電路“掐脖子”問題,光刻機(jī)這篇文章怎么做?
- 淺談無針血糖監(jiān)測(cè)的智能隱形眼鏡
- AIoT有望成為醫(yī)療現(xiàn)場(chǎng)轉(zhuǎn)變動(dòng)力 協(xié)助醫(yī)生進(jìn)行腦或肺等器官診
- 基于MC3361+MCU結(jié)構(gòu)的低速光纖通信模塊設(shè)計(jì)方案
- 轉(zhuǎn)正后的虛擬運(yùn)營商 如何殺出通行業(yè)重圍
- 完整QDR-IV設(shè)計(jì)高性能網(wǎng)絡(luò)系統(tǒng)詳解
- ka5H0380
- 關(guān)于用UT-450制作TCP/IP轉(zhuǎn)RS232/RS485/RS422問題
- 全局變量與函數(shù)變量所占RAM空間對(duì)比 PIC12F疑惑
- 求個(gè)步進(jìn)電機(jī)的驅(qū)動(dòng)
- 【平頭哥RVB2601創(chuàng)意應(yīng)用開發(fā)】+ CAN通信監(jiān)控終端
- 摩托車尾快閃礫霹靂燈電路
- 12V 升壓到48V 輸出電流1A MOS管有100度 正常嗎?
- 求救呀!nt驅(qū)動(dòng)用鏈表實(shí)現(xiàn)irp同的問題
- 什么是6800總線,8080總線?
- 小白新畫的pcb請(qǐng)大神們看看給出點(diǎn)意見