国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

Linux下開發(fā)STM32 使用gcc-arm-none-eabi工具鏈編譯生成bin、hex文件

發(fā)布者:SereneWhisper最新更新時(shí)間:2024-09-19 來源: elecfans關(guān)鍵字:Linux  STM32  hex文件 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

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)生的文件。


關(guān)鍵字:Linux  STM32  hex文件 引用地址:Linux下開發(fā)STM32 使用gcc-arm-none-eabi工具鏈編譯生成bin、hex文件

上一篇:STM32F4_TIM輸出PWM波形 (可調(diào)頻率、占空比)
下一篇:探秘STM32U5安全特性|硬件加解密引擎與軟件算法對(duì)比

推薦閱讀最新更新時(shí)間:2025-07-16 14:14

STM32高級(jí)開發(fā)(5)-gcc-arm-none-eabi
在完成對(duì)ubuntu的基本操作和指令的學(xué)習(xí)后,我們下面正式的進(jìn)入有關(guān)于我們stm32/ARM單片機(jī)的軟件安裝過程。首先我們就要介紹這個(gè)會(huì)貫穿我們整個(gè)開發(fā)過程中的軟件gcc-arm-none-eabi。 gcc-arm-none-eabi是什么 最直接的當(dāng)我說出這個(gè)軟件的時(shí)候,大部分童鞋可能會(huì)奇怪他到底是個(gè)什么呢?首先他是個(gè)軟件這就不用多說了,做什么的軟件呢?編譯軟件,或是準(zhǔn)確點(diǎn)叫工具鏈。那么聽起來是不是和keil、IAR感覺一樣呢?我們是不是安裝好他以后,打開獲得一個(gè)界面導(dǎo)入代碼就可以編譯hex文件呢?答案是否定的。 又我們國內(nèi)Keil+IAR環(huán)境教育出來的童靴們,很少會(huì)理解IDE其本質(zhì)的含義。也許查詢百度,他會(huì)告訴你ID
[單片機(jī)]
<font color='red'>STM32</font>高級(jí)開發(fā)(5)-<font color='red'>gcc-arm-none-eabi</font>
安裝交叉編譯工具
自己動(dòng)手安裝交叉工具鏈: 1.Windows中裝軟件的特點(diǎn) Windows中裝軟件使用安裝包,安裝包解壓后有2種情況:一種是一個(gè)安裝文件(.exe、.msi),雙擊進(jìn)行安裝,下一步直到安裝完畢。安裝完畢后會(huì)在桌面上生成快捷方式,我們平時(shí)使用快捷方式來啟動(dòng)這些程序;另一種是所謂的綠色軟件、免安裝包,這種不用安裝,直接解壓開里面就.exe可以直接雙擊執(zhí)行。 2.Linux中裝軟件的特點(diǎn) linux中安裝軟件比windows中復(fù)雜。linux中安裝軟件一般有以下幾種方法: 第一種:在線安裝。譬如ubuntu中使用apt-get install vim來安裝vim軟件。 第二種:自己下載安裝包來安裝。這種方式的缺陷就
[單片機(jī)]
STM32學(xué)習(xí)筆記一一HEX文件和BIN文件格式
1. 引言 今天看串口的 IAP ,平時(shí)我們通過 JTAG 等工具下載的都是 HEX 文件,都沒有思考一下 HEX 的文件組成。而串口 IAP 下載的是 BIN 文件,剛好在這里區(qū)分學(xué)習(xí)一下。 我們平時(shí)燒寫 HEX 文件是不需要設(shè)置地址信息的,因?yàn)橐呀?jīng)包含在文件里面,而使用 BIN 燒寫,需要在程序中指定地址。 2. 簡(jiǎn)述 Intel hex 文件是記錄文本行的 ASCII 文本文件,在 Intel HEX 文件中,每一行是一個(gè) HEX 記錄,由十六進(jìn)制數(shù)組成的機(jī)器碼或者數(shù)據(jù)常量。Intel HEX 文件經(jīng)常被用于將程序或數(shù)據(jù)傳輸存儲(chǔ)到 ROM、EPROM,大多數(shù)編程器和模擬器使用Intel HEX文件。 2.1 H
[單片機(jī)]
<font color='red'>STM32</font>學(xué)習(xí)筆記一一<font color='red'>HEX文件</font>和BIN文件格式
linux驅(qū)動(dòng)開發(fā)(十)——misc雜散設(shè)備
1:什么是misc驅(qū)動(dòng)模型? 2:為什么要有misc驅(qū)動(dòng)模型? 3:misc驅(qū)動(dòng)模型的代碼實(shí)現(xiàn) 4:misc驅(qū)動(dòng)模型實(shí)戰(zhàn) 參考: http://blog.csdn.net/yicao821/article/details/6785738 http://www.thinksaas.cn/topics/0/507/507168.html http://www.cnblogs.com/fellow1988/p/6235080.html https://www.zhihu.com/question/21508904 http://www.cnblogs.com/snake-hand/p/3212483.html http://blog.c
[單片機(jī)]
linux內(nèi)核中S3C6410 timer相關(guān)代碼理解
本文描述基于mini6410平臺(tái)的time.c中的相關(guān)代碼,主要描述下對(duì)部分代碼的理解。 先貼上代碼: 1 /* we use the shifted arithmetic to work out the ratio of timer ticks 2 * to usecs, as often the peripheral clock is not a nice even multiple 3 * of 1MHz. 4 * 5 * shift of 14 and 15 are too low for the 12MHz, 16 seems to be ok 6 * for the current HZ value
[單片機(jī)]
RTOS正在縮小與Linux的差距
RTOS與Linux的物聯(lián)網(wǎng)設(shè)備操作系統(tǒng)之爭(zhēng)已經(jīng)持續(xù)了很多年。Linux以其強(qiáng)大的計(jì)算能力和豐富的軟件生態(tài),在需要復(fù)雜處理和軟件支持的物聯(lián)網(wǎng)設(shè)備上占據(jù)一席之地;RTOS憑借實(shí)時(shí)響應(yīng)和資源節(jié)約的特性,在對(duì)實(shí)時(shí)性和資源占用有嚴(yán)格要求的場(chǎng)景中獨(dú)領(lǐng)風(fēng)騷。 如果時(shí)間倒回五年前,那時(shí)候IoT徹底火了,但大型科技公司在面對(duì)RTOS和Linux的抉擇中,對(duì)RTOS不感興趣,更加青睞Linux,并把它推成主流。不過,在最近一段時(shí)間,風(fēng)評(píng)反轉(zhuǎn)了,實(shí)時(shí)操作系統(tǒng) (RTOS)在嵌入式IoT領(lǐng)域開始重新復(fù)興。 在開源計(jì)劃、大型科技公司支持、對(duì)低延遲和資源受限應(yīng)用程序不斷增長的需求的推動(dòng)下,RTOS 正在迅速縮小與Linux的差距。很多開發(fā)人員發(fā)現(xiàn),
[嵌入式]
RTOS正在縮小與<font color='red'>Linux</font>的差距
關(guān)于 arm-linux-gcc 使用 static關(guān)鍵字的一個(gè) bug
# arm-linux-gcc -v xxx 4.3.3 /* main.c */ static unsigned *p = (unsigned*) (0x0000); /* 當(dāng)外部的初始化為0,一切OK int main (void) { xxxxx; ...... ; } # arm-linux-gcc -O0 main.c -g -c -Wall 當(dāng)我們不加不優(yōu)化的時(shí)候 文件瞬間變的很大,當(dāng) -O2的時(shí)候,一切OK 或許這個(gè)是一個(gè)BUG.
[單片機(jī)]
韋東山嵌入式Linux_3期之USB攝像頭監(jiān)控_手機(jī)App增加錄像功能(二)
一、模塊劃分 i) (主體模塊)視頻采集播放 ii) 顯示模式切換 iii) 拍照 iv) 錄像 v) fps顯示 vi) 錄像的瀏覽和刪除 回到頂部(go to top) 二、各模塊的實(shí)現(xiàn) 2.1(主體模塊)視頻采集播放 2.1.1 參考資料: 1)主體框架(解碼、讀幀)參考雷霄驊的:100行代碼實(shí)現(xiàn)最簡(jiǎn)單的基于FFMPEG+SDL的視頻播放器(SDL1.x) 主體框架的流程,可參考雷霄驊的上述博文,這里不再贅述 2)幀的顯示,參考:Android 使用 FFmpeg (二)——視屏流播放簡(jiǎn)單實(shí)現(xiàn) 幀顯示的流程,大致如下: 2.2 顯示模式切換 實(shí)現(xiàn)思路:利用av_filter
[單片機(jī)]
韋東山嵌入式<font color='red'>Linux</font>_3期之USB攝像頭監(jiān)控_手機(jī)App增加錄像功能(二)
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved