一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-02-28 15:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11512

    瀏覽量

    213908
  • STM32
    +關(guān)注

    關(guān)注

    2295

    文章

    11032

    瀏覽量

    365220
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32CubeIDE報(bào)錯(cuò)編譯STM32MP135(Projects\\STM32MP135C-DK\\External_Loader)的原因?

    /com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.13.3.rel1.win32_1.0.0.202411081344/tools/bin/../lib/gcc
    發(fā)表于 07-11 06:19

    CW32L010 MCU在VSCode+GCC+EIDE+JLink的使用示例

    、安裝Embedded IDE、Cortex-Debug等插件。 2、下載安裝gcc-arm-none-eabi工具。 3、運(yùn)行VSCode,打開CW32L010 MCU的GCC示例
    的頭像 發(fā)表于 07-01 14:52 ?179次閱讀
    CW32L010 MCU在VSCode+<b class='flag-5'>GCC</b>+EIDE+JLink<b class='flag-5'>下</b>的使用示例

    在IAR Arm開發(fā)工具中--function_sections編譯選項(xiàng)的使用

    本文主要介紹在IAR Arm開發(fā)工具中不修改源代碼的情況使用??function_sections編譯選項(xiàng)把函數(shù)放到單獨(dú)的section
    的頭像 發(fā)表于 06-13 13:53 ?1043次閱讀
    在IAR <b class='flag-5'>Arm</b><b class='flag-5'>開發(fā)工具</b><b class='flag-5'>鏈</b>中--function_sections<b class='flag-5'>編譯</b>選項(xiàng)的使用

    可以在MCUXpressoIDE中哪些位置管理工具?

    使用 arm-none-eabi-gcc,它應(yīng)該是相同的,與 13.2 版相同。我不知道為什么我會(huì)收到這么多這樣的錯(cuò)誤
    發(fā)表于 04-10 07:37

    ubuntu24.04上安裝gcc工具出現(xiàn)報(bào)錯(cuò)怎么解決?

    虛擬機(jī)安裝的ubuntu24.04.1,默認(rèn)gcc版本13,從芯來官網(wǎng)下載了對(duì)應(yīng)的gcc版本的工具,到最后編譯報(bào)錯(cuò): riscv64-un
    發(fā)表于 03-07 12:39

    stm32cubeide編譯的時(shí)候報(bào)錯(cuò),無法生成hex文件怎么解決?

    stm32cubeide編譯的時(shí)候報(bào)錯(cuò),并且無法生成hex文件怎么辦急急急!
    發(fā)表于 03-07 08:17

    stm32cubmx生成的makefile編譯無法啟動(dòng)線程怎么解決?

    f103vct6 的 make編譯環(huán)境是 windows + gcc-arm-none-eabi-10.3-2021.10-win32 + xpack-windows-build-tools-4.4.1-2-win32-x64 有沒有人遇到同樣的問題,求解,謝謝!
    發(fā)表于 09-27 09:27

    使用vscode始終無法找到頭文件怎么解決?

    為“windows-gcc-arm”:“D:/env-windows/tools/gnu_gcc/arm_gcc/mingw/bin/arm-non
    發(fā)表于 09-27 06:33

    【米爾NXP i.MX 93開發(fā)板試用評(píng)測(cè)】2、異構(gòu)通信環(huán)境搭建和源碼編譯

    build_all.sh和clean_all.sh兩個(gè)腳本添加運(yùn)行權(quán)限,然后設(shè)置編譯器環(huán)境變量 export ARMGCC_DIR=\"/mnt/MyNAS/walker/.bin/tools/gcc-arm-none-eabi
    發(fā)表于 09-20 23:19

    linux開發(fā)板如何編譯curl

    準(zhǔn)備開發(fā)環(huán)境 確保你的開發(fā)板已經(jīng)安裝了編譯 curl 所需的工具,包括 gcc 、 make 和可能的其他庫。如果
    的頭像 發(fā)表于 08-30 15:33 ?1438次閱讀

    【飛凌嵌入式OK3576-C開發(fā)板體驗(yàn)】應(yīng)用編譯運(yùn)行

    源碼需要下載的庫文件。 編譯前準(zhǔn)備 環(huán)境說明 開發(fā)環(huán)境操作系統(tǒng):Ubuntu24.04 64 位版 交叉工具:aarch64-non-
    發(fā)表于 08-26 17:55

    bin文件怎么燒錄到stm32

    燒錄bin文件STM32微控制器是一個(gè)相對(duì)復(fù)雜的過程,涉及到硬件連接、軟件配置和固件燒錄等多個(gè)方面。 一、硬件準(zhǔn)備 STM32開發(fā)
    的頭像 發(fā)表于 08-22 09:38 ?4395次閱讀

    openharmony移植AT32F407編譯時(shí)錯(cuò)誤

    /gcc-arm-none-eabi-10-2020-q4-major-master/bin/../lib/gcc/arm-none-eabi/12.3.1/../../../../
    發(fā)表于 08-18 17:04

    百問網(wǎng)全志T113-PRO LVGL環(huán)境配置

    。 進(jìn)入gcc工具文件目錄的bin目錄中查看交叉編譯工具
    發(fā)表于 08-01 10:11

    FRDM-MCXN947的純Linux命令行環(huán)境搭建

    arm-none-eabi-gccarm官網(wǎng)下載標(biāo)準(zhǔn)工具arm-none-eabi-gcc),并解壓縮。由于RTT可以直接在腳本里指
    發(fā)表于 07-28 22:55