0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为APM32F411打造可自动化的命令行工作流

Geehy极海半导体 ? 来源:21ic论坛极海半导体专区 ? 2025-07-11 10:00 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

来源:转载自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程序已经正常添加入我们的系统变量中。

f3927168-5bc5-11f0-baa5-92fbcf53809c.jpg

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那个就是),如果是安装包需要留意勾选“配置至系统变量”的选项。

f39f35b0-5bc5-11f0-baa5-92fbcf53809c.jpg

同样的,我们也可以在CMD查看支持,仅需要输入以下命令“arm-none-eabi-gcc -v”,若有打印arm-none-eabi-gcc版本信息即可。

f3a9223c-5bc5-11f0-baa5-92fbcf53809c.jpg

这里也给大家看看系统环境变量的设置界面(直接使用WIN+Q 按键搜索“环境变量”即可)。

f3bbed9a-5bc5-11f0-baa5-92fbcf53809c.jpg

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”我们可以看到当前系统连接的仿真器。

f3cfc978-5bc5-11f0-baa5-92fbcf53809c.jpg

3 源码选择

由于我们使用的是GCC的工具链环境,对于内核的源码我们需要相应的版本。即链接脚本文件以及启动文件都得选择GCC版本的。

为了方便我们的后续程序编写,我这里新建一个文件夹,把我们需要的源码往里面装进去。

1. 板载文件及库文件必不可少。将“Boards”、“Libraries”复制到我们的新文件夹中。

f4128bc8-5bc5-11f0-baa5-92fbcf53809c.jpg

2. 复制APM32F4xx_SDK_V1.4APM32F4xx_SDK_V1.4ExamplesSysTick下的文件夹至我们的新文件夹中。

f4282078-5bc5-11f0-baa5-92fbcf53809c.jpg

然后把里面的“Project”给删除,我们不需要这段IDE工程。

3. 复制链接脚本文件以及启动文件。把APM32F4xx_SDK_V1.4LibrariesDeviceGeehyAPM32F4xxSourcegcc里面的“APM32F4xxxE_FLASH.ld”和“startup_apm32f411.S”复制到我们的新文件夹中。

f4bc5720-5bc5-11f0-baa5-92fbcf53809c.jpg

至此,我们的源码准备完毕。

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”便可以开始编译我们的代码。最终编译结果如下:

f4d17376-5bc5-11f0-baa5-92fbcf53809c.jpg

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

最终效果如下,程序下载完毕后板卡将闪灯,并在串口输出当前的延时速度。

f4e99dca-5bc5-11f0-baa5-92fbcf53809c.jpg

亮灯效果:

f4f9d780-5bc5-11f0-baa5-92fbcf53809c.gif

注:文章作者在原帖中提供了例程文件,有需要请至原文21ic论坛下载

原文地址:
https://bbs.21ic.com/icview-3329116-1-1.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真器
    +关注

    关注

    14

    文章

    1040

    浏览量

    85471
  • 开源
    +关注

    关注

    3

    文章

    3716

    浏览量

    43903
  • 编译
    +关注

    关注

    0

    文章

    679

    浏览量

    34114
  • 极海半导体
    +关注

    关注

    0

    文章

    164

    浏览量

    4825

原文标题:APM32芯得 EP.59 | 为APM32F411打造可自动化的命令行工作流

文章出处:【微信号:geehysemi,微信公众号:Geehy极海半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于APM32F411 DMA_ADC Handler模式分析及解决

    ADC连续转换采集,因此,我没过滤掉ADC采集中开启中断配置的信息,开启了ADC中断采集,因此这次以APM32F411官方例程中的DMA_ADC例程,复刻了此次出现的问题。
    的头像 发表于 06-24 14:30 ?526次阅读
    基于<b class='flag-5'>APM32F411</b> DMA_ADC Handler模式分析及解决

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

    APM32F411是一款基于32位Arm Cortex-M4F内核的微控制器。硬件FPU是Arm Cortex-M4F的一大优势。合理应用硬件FPU可以大大缩短运算时间。
    的头像 发表于 06-28 11:23 ?859次阅读
    极海<b class='flag-5'>APM32F411</b>微控制器硬件FPU使用指南

    在STM32实现命令行

    工作中的开发环境都是基于linux命令行交互,作为命令行的重度使用者,玩单片机也要使用命令行工具,百度了一些命令行工具,有几个不错的开源 c
    发表于 12-09 11:32 ?3115次阅读

    TinyMaix框架的内存需求超过了APM32F411的可用内存,导致运行失败,怎么能成功优化?

    TinyMaix框架的内存需求超过了APM32F411的可用内存,导致运行失败。怎么能成功优化?
    发表于 09-27 09:44

    cmd网络经典命令行

    cmd网络经典命令行:
    发表于 06-11 15:17 ?36次下载
    cmd网络经典<b class='flag-5'>命令行</b>

    caxa命令行中的应用

    caxa命令行中的应用 命令行对于大多用户来说往往只是输入数据的作用,但是其中的奥妙还有很多,下面就给大家
    发表于 10-18 18:18 ?2430次阅读

    CMD的命令行高级教程

    CMD的命令行高级教程
    发表于 10-24 08:31 ?30次下载
    CMD的<b class='flag-5'>命令行</b>高级教程

    XenServer2016命令行方式自动化安装

    命令行+自动化的顾问XE 2016
    的头像 发表于 05-31 11:42 ?1991次阅读

    Fcoder从命令行批量转换为TIFF

    何应用程序中,让您只需一个命令即可自动执行重复的转换任务。 命令行语法和用法 2TIFF图像转换器软件可以从Windows 命令提示符、PowerShell或任何其他
    的头像 发表于 05-22 14:13 ?1132次阅读
    Fcoder从<b class='flag-5'>命令行</b>批量转换为TIFF

    通过TPT命令行自动化执行测试

    作者|Poplar小编|吃不饱随着DevOps、CI/CT在汽车行业日趋成熟和普及,TPT支持通过命令行的方式完成测试执行过程。TPT作为德国PikeTec公司的嵌入式软件模型测试工具,具有很高
    的头像 发表于 02-02 11:07 ?964次阅读
    通过TPT<b class='flag-5'>命令行</b><b class='flag-5'>自动化</b>执行测试

    linux命令行与shell编程实战

    Linux命令行与Shell编程实战主要涉及以下内容: Linux命令行基础:学习Linux命令行的基本操作,如文件管理、进程管理、网络配置等。熟悉使用命令行能够提高
    的头像 发表于 11-08 10:57 ?1117次阅读

    linux虚拟机怎么调出命令行

    快捷键组合Ctrl+Alt+F1 6来切换到命令行界面。如果系统在虚拟机中,则可以使用Ctrl+Alt+shift+F1 6组合键来切换到命令行界面。在
    的头像 发表于 11-08 11:28 ?3745次阅读

    linux切换到命令行模式

    在Linux中,可以通过以下步骤切换到命令行模式: 打开终端。可以在应用菜单中找到终端或命令行终端。 在终端中输入命令“exit”或“logout”,然后按回车键。 系统会提示您输入管理员密码。输入
    的头像 发表于 11-13 16:47 ?2282次阅读

    APM32F411板的python+pyocd命令行操作

    前段时间学习了一下如何使用pyocd配合APM32F411VCTINY板在命令行下给它进行各种骚操作,在使用一段时间后就想着:pyocd是基于python的,那是不是也可以使用python脚本+pyocd使用起来呢?
    的头像 发表于 10-18 16:21 ?1053次阅读
    <b class='flag-5'>APM32F411</b>板的python+pyocd<b class='flag-5'>命令行</b>操作

    AI工作流自动化是做什么的

    AI工作流自动化是指利用人工智能技术,对工作流程中的重复性、规则明确的任务进行自动化处理的过程。那么,AI工作流
    的头像 发表于 01-06 17:57 ?764次阅读