国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

1.為什么不是gcc

在開發stm32的時候,編譯工具鏈要使用gcc-arm-none-eabi,為什么不是gcc呢?這就要說到linux下的交叉編譯了,因為我們要在PC機上編譯出可以運行在ARM上的程序,使用gcc編譯出的是在PC上運行的程序,所以我們要使用gcc-arm-none-eabi進行交叉編譯~

2.gcc-arm-none-eabi toolchain 介紹及安裝

gcc-arm-none-eabi是一個開源的ARM開發工具鏈,適用于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目錄添加到環境變量,這樣可以直接在命令行輸入要使用的工具名,然后系統就可以找到該工具,在此我們僅為當前用戶添加環境變量,使用vim ~/.bashrc編輯當前用戶配置文件,在最后添加export PATH=$PATH:/home/mculover666/gcc-arm-none-eabi/bin:

然后使用命令source ~/.bashrc更新系統路徑,使添加的環境變量立即生效:

然后輸入命令arm-none,然后按三下Tab(一定不要輸入全部),檢查系統是否可以自動補全:

如果系統可以提示,說明環境變量配置成功,可以開心的使用arm-none-eabi工具鏈啦~

3.從裸機工程開始

3.1.硬件說明

這里我使用的是野火霸道開發板,板載芯片為STM32F103ZET6,下載器使用e-link,這個下載器使用CMSIS-DAP下載程序,同時并帶有一個串口,非常好用~

板載RGB-LED的原理圖如圖所示:

3.2.新建空的裸機工程

首先新建一個文件夾mkdir 00-template-reg用來存放整個工程,然后整個工程包含三個文件:

startup_stm32f10x_hd.s:從固件庫中拷貝,注意不是arm文件夾下的,因為truestudio使用的是gcc編譯器,所以我們選擇truestudio文件夾下的啟動文件;

stm32f10x.h:空文件;

main.c:代碼如下:

#include"stm32f10x.h" intmain() { /*開啟GPIOB時鐘*/ *(unsignedint*)(0x40021000+0x18)|=1<<3; ????/*?配置PB0為推挽輸出?*/ ????*(unsigned?int*)(0x40010c00+0x00)?|=?1<<(4*0); ????/*?PB0輸出低電平,點亮綠色LED?*/ ????*(unsigned?int*)(0x40010c00+0x0c)?&=?~(1<<0); ????while(1); } void?SystemInit(void) { }

4.編譯

接下來就是激動人心的編譯步驟了~編譯的時候有兩種文件,一種是匯編啟動文件,一種是c源文件,接下來分別編譯:
首先需要說明一些編譯任何一個文件都需要帶上的參數:

參數 說明
-mthumb 表明使用的指令集(必需)
-mcpu=cortex-m3 表明芯片內核(必需)
-g 產生調試信息

4.1.啟動文件編譯

啟動文件一般是由匯編寫成,此處需要注意的是,匯編文件的格式有.S和.s之分:

大寫S:表明文件中含有預處理指令(比如#define),需要先進行處理;

小寫s:表明文件不需要處理,可以直接編譯;

之前我們添加的啟動文件是小寫.s,所以直接進行編譯,另外說一下,如果使用的是.S文件,那么需要帶上-x assembler-with-cpp參數。

接下來說明一些匯編文件gcc編譯器使用的參數:

參數 說明
-x assembler-with-cpp 先對文件進行預處理
-Wa,option 向匯編器Assembler傳遞參數

注:可以向匯編器傳遞的參數:

參數 說明
-W或--no-warn 關閉所有告警
--fatal-warnings 將所有的警告提示為錯誤
--warn 正常提示告警信息

所以,接下來我們可以使用如下的參數組合來編譯啟動文件(不進行預處理,并且正常提示告警信息):

arm-none-eabi-gcc-c-mthumb-mcpu=cortex-m3-g-Wa,--warn-ostartup_stm32f10x_hd.ostartup_stm32f10x_hd.s

4.2.C文件編譯

因為main.c中沒有特殊的東西,只是兩個函數,所以簡單的編譯一下就可以了:

參數 描述
-Wall 允許輸出所有警告

arm-none-eabi-gcc-c-mthumb-mcpu=cortex-m3-g-Wall-omain.omain.c

5.鏈接

鏈接重要的部分有兩點:鏈接文件和傳遞給鏈接器的參數。
鏈接文件在固件庫中給的示例工程中有,在下面這個目錄:


其中stm32_flash.ld是針對于STM32F103ZE的鏈接文件,如果是別的芯片,需要進行修改,將它復制到我們的工程中去:


然后就要讓鏈接器開始根據stm32_flash.ld這個文件對startup_stm32f10x_hd.o和main.o這兩個文件開始鏈接,生成包含了調試信息的elf文件,同時,我們還需要給鏈接器傳遞一些參數:

參數 描述
-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文件轉化為適合于單片機的bin文件和hex文件,其中參數-O(大寫o)用于指定輸出文件的格式(默認是bin格式)

arm-none-eabi-objcopytest.elftest.bin arm-none-eabi-objcopytest.elf-Oihextest.hex

7.編寫一個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文件轉化生成bin文件;

使用命令make hex將elf文件轉化生成hex文件;

使用命令make clean即可清除掉所有編譯產生的文件。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219008
  • STM32
    +關注

    關注

    2309

    文章

    11162

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    CW32系列MCU在Eclipse GCC + JLink的使用示例分享

    gcc-arm-none-eabi工具。 3、下載安裝xPack Windows Build Tools。 4、下載安裝Segger JLink。 5、運行eclipse,打開CW32系列MCU的
    發表于 02-02 06:57

    GCC開發工程的模版

    = arm-none-eabi- # 啟用下一項以指定GCC目錄 GCC_PATH = /Applications/ARM/bin/ 12
    發表于 11-28 08:15

    【OK3506-S12Mini試用評測】編譯你的第一個內核模塊

    -x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/ 工具
    發表于 10-24 21:00

    gcc工具無法匯編硬件浮點指令fsqrt問題

    團隊在項目推進過程中發現,Linux環境,math庫中的sqrt()函數無論是在浮點數的gcc工具中還是整數的
    發表于 10-20 06:19

    cubemx生成的main.c報錯怎么解決?

    之前可以編譯成功,但是開啟軟件i2c后編譯報錯。我使用git將工程還原后重新編譯仍然報錯,不知道是哪里出了問題,因為main.c文件我沒有修改過。報錯信息如下:
    發表于 09-28 09:00

    micropython配置報錯怎么解決?

    LINK rt-thread.elf c:/env-windows/tools/gnu_gcc/arm_gcc/mingw/bin/../lib/gcc/
    發表于 09-17 07:13

    為什么RT Thread Studio 鏈接器無法正確讀取鏈接文件

    大家好,我用RT Thread Studio 創建工程,然后下載相應的編譯器,編譯源代碼,源碼編譯成功,但是最后鏈接時出現問題: 。。。。 arm-none-eabi-gcc \&q
    發表于 09-02 08:22

    求助,關于NanoEdge AI Studio生成的庫交叉編譯器版本疑問求解

    20231009\", 那么問題來了,怎么在NanoEdge AI Studio設定交叉編譯器呢,比如設置為armcc、armclang、iccram,因為我需要將庫加到keil或者iar工程里面。 看樣子這個軟件生成的庫是arm-g
    發表于 08-08 07:25

    STM32CubeIDE報錯編譯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
    發表于 07-11 06:19

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

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

    在IAR Arm開發工具中--function_sections編譯選項的使用

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

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

    使用 arm-none-eabi-gcc,它應該是相同的,與 13.2 版相同。我不知道為什么我會收到這么多這樣的錯誤
    發表于 04-10 07:37

    為什么會報錯Could not determine GDB version using command: arm-none-eabi-gdb --version?

    我已經重啟電腦了,沒用; 重裝軟件沒有,沒有; 將ST_link_server卸載重裝也沒有; 將arm-none-eabi-gdb加入windows 11系統環境變量,也沒用; 將軟件的GDB
    發表于 03-12 08:08

    ubuntu24.04上安裝gcc工具出現報錯怎么解決?

    虛擬機安裝的ubuntu24.04.1,默認gcc版本13,從芯來官網下載了對應的gcc版本的工具,到最后編譯報錯: riscv64-un
    發表于 03-07 12:39

    stm32cubeide編譯的時候報錯,無法生成hex文件怎么解決?

    stm32cubeide編譯的時候報錯,并且無法生成hex文件怎么辦急急急!
    發表于 03-07 08:17