來源:轉(zhuǎn)載自21ic論壇極海半導(dǎo)體專區(qū)
1 背景
拿到APM32F411的TINY板卡后,在打開官方提供的SDK發(fā)現(xiàn),他們提供的MDK、IAR、Eclipse的工程示例。非常不錯(cuò),但是我想著有一些場(chǎng)景下在沒有安裝IDE的情況下怎么編譯程序呢?
通過學(xué)習(xí),我發(fā)現(xiàn)可以使用開源工具鏈GCC+Makefile編譯程序。經(jīng)過分析發(fā)現(xiàn)極海的Eclipse工程就是基于GCC工具鏈進(jìn)行編譯的,這樣看來我只需要搭建GCC+Makefile的本地編譯環(huán)境就可以在不使用IDE的情況下完成對(duì)APM32F411的程序編譯了。
完成程序的編譯后,我們需要對(duì)程序進(jìn)行下載,由于APM32F411的TINY板卡的板載仿真器是基于CMSIS-DAP而來的,我們可以輕易的就想到使用ARM提供的PyOCD進(jìn)行程序下載。
整體的程序編譯及下載的步驟理論存在,那么我們實(shí)踐開始。
2 工具鏈準(zhǔn)備
在實(shí)際進(jìn)行代碼的搬運(yùn)前,我們需要對(duì)我們所需要的環(huán)境進(jìn)行搭建,我這里使用的是window的環(huán)境,注意是下載相關(guān)的工具鏈,然后把工具鏈的路徑添加到我們的系統(tǒng)變量中,從而使得直接調(diào)用CMD命令就能使用我們的目標(biāo)工具鏈程序。
2.1 make工具鏈
make工具鏈?zhǔn)俏覀儽敬尉幾g腳本的基礎(chǔ)工具,make工具也是多種多樣的,我這里選擇,這個(gè)是它的下載頁面:https://github.com/xpack-dev-tools/windows-build-tools-xpack/releases
這里是它的安裝介紹:https://xpack.github.io/dev-tools/windows-build-tools/install/。
我這里就簡(jiǎn)單描述一下:
1. 先下載我們需要的xPack Windows Build Tools版本,比如說我選4.3.0的。
2. 下載下來是一個(gè)壓縮包,我們把它解壓到一個(gè)合適的路徑,比如我把它放在C盤。
3. 把make.exe的路徑添加到我們的系統(tǒng)環(huán)境變量,比如我的是:C:xpack-windows-build-tools-4.3.0-1in
4. 我們?cè)赾md命令窗口輸入“make -v”檢查是否make程序已經(jīng)正常添加入我們的系統(tǒng)變量中。
2.2 GCC工具鏈
GCC工具,因?yàn)锳PM32F411是基于Arm Cortex-M4F的芯片,所以我們要選擇的是GNU Arm Embedded Toolchain,
這個(gè)是工具鏈的官網(wǎng):https://developer.arm.com/downloads/-/gnu-rm,也是選擇一個(gè)喜歡的版本進(jìn)行下載,我這里選的是10 2021.10的版本。
需要注意的是,它提供安裝包和壓縮包,使用壓縮包需要自己配置系統(tǒng)環(huán)境變量(可以參考make的工具鏈配置,它的路徑是(我的):C:GNU Arm Embedded Toolchain10 2021.10in,里面有arm-none-eabi-gcc.exe那個(gè)就是),如果是安裝包需要留意勾選“配置至系統(tǒng)變量”的選項(xiàng)。
同樣的,我們也可以在CMD查看支持,僅需要輸入以下命令“arm-none-eabi-gcc -v”,若有打印arm-none-eabi-gcc版本信息即可。
這里也給大家看看系統(tǒng)環(huán)境變量的設(shè)置界面(直接使用WIN+Q 按鍵搜索“環(huán)境變量”即可)。
2.3 PyOCD 工具鏈
PyOCD的官網(wǎng):https://link.zhihu.com/?target=https%3A//github.com/pyocd/pyOCD,它提供了我們使用命令行的形式配合CMSIS-DAP下載程序至Arm Cortex-M的芯片。
PyOCD這個(gè)工具鏈的安裝是基于Python上的,我們首先需要安裝Python環(huán)境(可以直接在它的官網(wǎng)https://www.python.org/downloads/windows/下載安裝),有了Python環(huán)境后我們直接在CMD上輸入“pip install -i https://pypi.tuna.tsinghua.edu.cn/simpl pyocd”命令等待安裝成功。
安裝成功后我們可以在CMD上輸入“pyocd list”我們可以看到當(dāng)前系統(tǒng)連接的仿真器。
3 源碼選擇
由于我們使用的是GCC的工具鏈環(huán)境,對(duì)于內(nèi)核的源碼我們需要相應(yīng)的版本。即鏈接腳本文件以及啟動(dòng)文件都得選擇GCC版本的。
為了方便我們的后續(xù)程序編寫,我這里新建一個(gè)文件夾,把我們需要的源碼往里面裝進(jìn)去。
1. 板載文件及庫(kù)文件必不可少。將“Boards”、“Libraries”復(fù)制到我們的新文件夾中。
2. 復(fù)制APM32F4xx_SDK_V1.4APM32F4xx_SDK_V1.4ExamplesSysTick下的文件夾至我們的新文件夾中。
然后把里面的“Project”給刪除,我們不需要這段IDE工程。
3. 復(fù)制鏈接腳本文件以及啟動(dòng)文件。把APM32F4xx_SDK_V1.4LibrariesDeviceGeehyAPM32F4xxSourcegcc里面的“APM32F4xxxE_FLASH.ld”和“startup_apm32f411.S”復(fù)制到我們的新文件夾中。
至此,我們的源碼準(zhǔn)備完畢。
4 編寫makefile腳本
由于我們是使用makefile來做IDE的角色,我們現(xiàn)在回憶一下我們IDE需要哪些基礎(chǔ)的設(shè)置才能完成程序的編譯?對(duì)是的,有工程名、源碼包含、頭文件包含、宏定義、輸出目錄、輸出內(nèi)容、編譯優(yōu)化等級(jí)等內(nèi)容需要一一設(shè)置。
我們新建一個(gè)txt文件,把它名字改為“Makefile”,同時(shí)刪除后綴。然后我們一步步地將以下內(nèi)容寫入文件。
4.1 工程名設(shè)置
首先是工程名設(shè)置,我這里設(shè)置為SysTick_TimeBase。
######################################
# target
######################################
TARGET = SysTick_TimeBase
4.2 編譯設(shè)置
這里設(shè)置編譯是否是debug標(biāo)簽和優(yōu)化等級(jí)。
######################################
# building variables
######################################
# debug build?
DEBUG = 1
# optimization
OPT = -Og
4.3 編譯文件夾設(shè)置
設(shè)置編譯的文件的輸出文件夾
#######################################
# paths
#######################################
# Build path
BUILD_DIR = build
4.4 設(shè)置源碼包含
設(shè)置工程需要包含的源碼路徑。
######################################
# 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 設(shè)置啟動(dòng)文件
設(shè)置啟動(dòng)文件,將我們的文件夾內(nèi)的startup_apm32f411.S的啟動(dòng)文件后綴名改為小寫的“s”。
# ASM sources
ASM_SOURCES =
startup_apm32f411.s
4.6 設(shè)置編譯MCU內(nèi)核
設(shè)置編譯的MCU內(nèi)核及FPU設(shè)置。工具鏈?zhǔn)褂谩癮rm-none-eabi-”,內(nèi)核為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 設(shè)置宏定義
設(shè)置工程所需的宏定義。
# C defines
C_DEFS =
-DAPM32F411
-DAPM32F411_TINY
4.8 設(shè)置工程頭文件包含
設(shè)置工程所需的頭文件路徑。
# C includes
C_INCLUDES =
-ILibraries/APM32F4xx_StdPeriphDriver/inc
-ILibraries/Device/Geehy/APM32F4xx/Include
-ILibraries/CMSIS/Include
-IBoards
-ISysTick_TimeBase/Include
4.9 設(shè)置鏈接腳本文件
設(shè)置鏈接腳本文件路徑。
4.10 其他
這個(gè)部分內(nèi)容是編譯的一些指令及操作,直接使用即可這里由于篇幅關(guān)系就不一一舉例,大家拿到附件后可自行了解。
5 編譯程序
在工程目錄下啟動(dòng)CMD,輸入“make”便可以開始編譯我們的代碼。最終編譯結(jié)果如下:
6 下載程序
我們這里將使用PyOCD下載程序,我們把“Geehy.APM32F4xx_DFP.1.0.4.pack”復(fù)制到我們的工程目錄,然后在目錄下啟動(dòng)CMD,輸入:
pyocd flash --erase chip --target apm32f411ve --pack=Geehy.APM32F4xx_DFP.1.0.4.pack build/SysTick_TimeBase.hex
最終效果如下,程序下載完畢后板卡將閃燈,并在串口輸出當(dāng)前的延時(shí)速度。
亮燈效果:
注:文章作者在原帖中提供了例程文件,有需要請(qǐng)至原文21ic論壇下載
原文地址:
https://bbs.21ic.com/icview-3329116-1-1.html
-
仿真器
+關(guān)注
關(guān)注
14文章
1037瀏覽量
85371 -
開源
+關(guān)注
關(guān)注
3文章
3676瀏覽量
43803 -
編譯
+關(guān)注
關(guān)注
0文章
679瀏覽量
33967 -
極海半導(dǎo)體
+關(guān)注
關(guān)注
0文章
163瀏覽量
4825
原文標(biāo)題:APM32芯得 EP.59 | 為APM32F411打造可自動(dòng)化的命令行工作流
文章出處:【微信號(hào):geehysemi,微信公眾號(hào):Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于APM32F411 DMA_ADC Handler模式分析及解決

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

在STM32實(shí)現(xiàn)命令行
TinyMaix框架的內(nèi)存需求超過了APM32F411的可用內(nèi)存,導(dǎo)致運(yùn)行失敗,怎么能成功優(yōu)化?
caxa命令行中的應(yīng)用
Shell命令行解釋器簡(jiǎn)介
Fcoder從命令行批量轉(zhuǎn)換為TIFF

linux命令行與shell編程實(shí)戰(zhàn)
linux虛擬機(jī)怎么調(diào)出命令行
linux切換到命令行模式
APM32F411板的python+pyocd命令行操作

評(píng)論