來源:轉載自21ic論壇極海半導體專區
1 背景
拿到APM32F411的TINY板卡后,在打開官方提供的SDK發現,他們提供的MDK、IAR、Eclipse的工程示例。非常不錯,但是我想著有一些場景下在沒有安裝IDE的情況下怎么編譯程序呢?
通過學習,我發現可以使用開源工具鏈GCC+Makefile編譯程序。經過分析發現極海的Eclipse工程就是基于GCC工具鏈進行編譯的,這樣看來我只需要搭建GCC+Makefile的本地編譯環境就可以在不使用IDE的情況下完成對APM32F411的程序編譯了。
完成程序的編譯后,我們需要對程序進行下載,由于APM32F411的TINY板卡的板載仿真器是基于CMSIS-DAP而來的,我們可以輕易的就想到使用ARM提供的PyOCD進行程序下載。
整體的程序編譯及下載的步驟理論存在,那么我們實踐開始。
2 工具鏈準備
在實際進行代碼的搬運前,我們需要對我們所需要的環境進行搭建,我這里使用的是window的環境,注意是下載相關的工具鏈,然后把工具鏈的路徑添加到我們的系統變量中,從而使得直接調用CMD命令就能使用我們的目標工具鏈程序。
2.1 make工具鏈
make工具鏈是我們本次編譯腳本的基礎工具,make工具也是多種多樣的,我這里選擇,這個是它的下載頁面:https://github.com/xpack-dev-tools/windows-build-tools-xpack/releases
這里是它的安裝介紹:https://xpack.github.io/dev-tools/windows-build-tools/install/。
我這里就簡單描述一下:
1. 先下載我們需要的xPack Windows Build Tools版本,比如說我選4.3.0的。
2. 下載下來是一個壓縮包,我們把它解壓到一個合適的路徑,比如我把它放在C盤。
3. 把make.exe的路徑添加到我們的系統環境變量,比如我的是:C:xpack-windows-build-tools-4.3.0-1in
4. 我們在cmd命令窗口輸入“make -v”檢查是否make程序已經正常添加入我們的系統變量中。
2.2 GCC工具鏈
GCC工具,因為APM32F411是基于Arm Cortex-M4F的芯片,所以我們要選擇的是GNU Arm Embedded Toolchain,
這個是工具鏈的官網:https://developer.arm.com/downloads/-/gnu-rm,也是選擇一個喜歡的版本進行下載,我這里選的是10 2021.10的版本。
需要注意的是,它提供安裝包和壓縮包,使用壓縮包需要自己配置系統環境變量(可以參考make的工具鏈配置,它的路徑是(我的):C:GNU Arm Embedded Toolchain10 2021.10in,里面有arm-none-eabi-gcc.exe那個就是),如果是安裝包需要留意勾選“配置至系統變量”的選項。
同樣的,我們也可以在CMD查看支持,僅需要輸入以下命令“arm-none-eabi-gcc -v”,若有打印arm-none-eabi-gcc版本信息即可。
這里也給大家看看系統環境變量的設置界面(直接使用WIN+Q 按鍵搜索“環境變量”即可)。
2.3 PyOCD 工具鏈
PyOCD的官網:https://link.zhihu.com/?target=https%3A//github.com/pyocd/pyOCD,它提供了我們使用命令行的形式配合CMSIS-DAP下載程序至Arm Cortex-M的芯片。
PyOCD這個工具鏈的安裝是基于Python上的,我們首先需要安裝Python環境(可以直接在它的官網https://www.python.org/downloads/windows/下載安裝),有了Python環境后我們直接在CMD上輸入“pip install -i https://pypi.tuna.tsinghua.edu.cn/simpl pyocd”命令等待安裝成功。
安裝成功后我們可以在CMD上輸入“pyocd list”我們可以看到當前系統連接的仿真器。
3 源碼選擇
由于我們使用的是GCC的工具鏈環境,對于內核的源碼我們需要相應的版本。即鏈接腳本文件以及啟動文件都得選擇GCC版本的。
為了方便我們的后續程序編寫,我這里新建一個文件夾,把我們需要的源碼往里面裝進去。
1. 板載文件及庫文件必不可少。將“Boards”、“Libraries”復制到我們的新文件夾中。
2. 復制APM32F4xx_SDK_V1.4APM32F4xx_SDK_V1.4ExamplesSysTick下的文件夾至我們的新文件夾中。
然后把里面的“Project”給刪除,我們不需要這段IDE工程。
3. 復制鏈接腳本文件以及啟動文件。把APM32F4xx_SDK_V1.4LibrariesDeviceGeehyAPM32F4xxSourcegcc里面的“APM32F4xxxE_FLASH.ld”和“startup_apm32f411.S”復制到我們的新文件夾中。
至此,我們的源碼準備完畢。
4 編寫makefile腳本
由于我們是使用makefile來做IDE的角色,我們現在回憶一下我們IDE需要哪些基礎的設置才能完成程序的編譯?對是的,有工程名、源碼包含、頭文件包含、宏定義、輸出目錄、輸出內容、編譯優化等級等內容需要一一設置。
我們新建一個txt文件,把它名字改為“Makefile”,同時刪除后綴。然后我們一步步地將以下內容寫入文件。
4.1 工程名設置
首先是工程名設置,我這里設置為SysTick_TimeBase。
######################################
# target
######################################
TARGET = SysTick_TimeBase
4.2 編譯設置
這里設置編譯是否是debug標簽和優化等級。
######################################
# building variables
######################################
# debug build?
DEBUG = 1
# optimization
OPT = -Og
4.3 編譯文件夾設置
設置編譯的文件的輸出文件夾
#######################################
# paths
#######################################
# Build path
BUILD_DIR = build
4.4 設置源碼包含
設置工程需要包含的源碼路徑。
######################################
# source
######################################
# C sources
C_SOURCES =
SysTick_TimeBase/Source/main.c
SysTick_TimeBase/Source/apm32f4xx_int.c
SysTick_TimeBase/Source/system_apm32f4xx.c
Boards/Board.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_adc.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_can.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_crc.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_cryp.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_cryp_aes.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_cryp_des.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_cryp_tdes.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_dac.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_dbgmcu.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_dci.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_dma.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_dmc.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_eint.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_fmc.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_gpio.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_hash.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_hash_md5.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_hash_sha1.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_i2c.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_iwdt.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_misc.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_pmu.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_rcm.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_rng.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_rtc.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_sdio.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_smc.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_spi.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_syscfg.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_tmr.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_usart.c
Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_wwdt.c
4.5 設置啟動文件
設置啟動文件,將我們的文件夾內的startup_apm32f411.S的啟動文件后綴名改為小寫的“s”。
# ASM sources
ASM_SOURCES =
startup_apm32f411.s
4.6 設置編譯MCU內核
設置編譯的MCU內核及FPU設置。工具鏈使用“arm-none-eabi-”,內核為Arm Cortex-M4F。
#######################################
# binaries
#######################################
PREFIX = arm-none-eabi-
# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
# either it can be added to the PATH environment variable.
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
else
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S
#######################################
# CFLAGS
#######################################
# cpu
CPU = -mcpu=cortex-m4
# fpu
FPU = -mfpu=fpv4-sp-d16
# float-abi
FLOAT-ABI = -mfloat-abi=hard
# mcu
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
4.7 設置宏定義
設置工程所需的宏定義。
# C defines
C_DEFS =
-DAPM32F411
-DAPM32F411_TINY
4.8 設置工程頭文件包含
設置工程所需的頭文件路徑。
# C includes
C_INCLUDES =
-ILibraries/APM32F4xx_StdPeriphDriver/inc
-ILibraries/Device/Geehy/APM32F4xx/Include
-ILibraries/CMSIS/Include
-IBoards
-ISysTick_TimeBase/Include
4.9 設置鏈接腳本文件
設置鏈接腳本文件路徑。
4.10 其他
這個部分內容是編譯的一些指令及操作,直接使用即可這里由于篇幅關系就不一一舉例,大家拿到附件后可自行了解。
5 編譯程序
在工程目錄下啟動CMD,輸入“make”便可以開始編譯我們的代碼。最終編譯結果如下:
6 下載程序
我們這里將使用PyOCD下載程序,我們把“Geehy.APM32F4xx_DFP.1.0.4.pack”復制到我們的工程目錄,然后在目錄下啟動CMD,輸入:
pyocd flash --erase chip --target apm32f411ve --pack=Geehy.APM32F4xx_DFP.1.0.4.pack build/SysTick_TimeBase.hex
最終效果如下,程序下載完畢后板卡將閃燈,并在串口輸出當前的延時速度。
亮燈效果:
注:文章作者在原帖中提供了例程文件,有需要請至原文21ic論壇下載
原文地址:
https://bbs.21ic.com/icview-3329116-1-1.html
-
仿真器
+關注
關注
14文章
1037瀏覽量
85340 -
開源
+關注
關注
3文章
3673瀏覽量
43787 -
編譯
+關注
關注
0文章
679瀏覽量
33954 -
極海半導體
+關注
關注
0文章
162瀏覽量
4825
原文標題:APM32芯得 EP.59 | 為APM32F411打造可自動化的命令行工作流
文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
基于APM32F411 DMA_ADC Handler模式分析及解決

極海APM32F411微控制器硬件FPU使用指南

在STM32實現命令行
TinyMaix框架的內存需求超過了APM32F411的可用內存,導致運行失敗,怎么能成功優化?
Shell命令行解釋器簡介
Fcoder從命令行批量轉換為TIFF

linux命令行與shell編程實戰
linux虛擬機怎么調出命令行
linux切換到命令行模式
APM32F411板的python+pyocd命令行操作

評論