当前位置: 首页 > ai >正文

APM32芯得 EP.27 | 告别IDE,为APM32F411打造轻量级命令行开发工作流

如遇开发技术问题,欢迎前往开发者社区,极海技术团队将在线为您解答~
极海官方开发者社区​https://community.geehy.cn/

《APM32芯得》系列内容为用户使用APM32系列产品的经验总结,均转载自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-1\bin

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 Toolchain\10 2021.10\bin,里面有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.4\APM32F4xx_SDK_V1.4\Examples\SysTick下的文件夹至我们的新文件夹中。

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

3. 复制链接脚本文件以及启动文件。把APM32F4xx_SDK_V1.4\Libraries\Device\Geehy\APM32F4xx\Source\gcc里面的“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# optimizationOPT = -Og

4.3 编译文件夹设置

设置编译的文件的输出文件夹

######################################## paths######################################## Build pathBUILD_DIR = build

4.4 设置源码包含

设置工程需要包含的源码路径。

####################################### source####################################### C sourcesC_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 sourcesASM_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_PATHCC = $(GCC_PATH)/$(PREFIX)gccAS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cppCP = $(GCC_PATH)/$(PREFIX)objcopySZ = $(GCC_PATH)/$(PREFIX)sizeelseCC = $(PREFIX)gccAS = $(PREFIX)gcc -x assembler-with-cppCP = $(PREFIX)objcopySZ = $(PREFIX)sizeendifHEX = $(CP) -O ihexBIN = $(CP) -O binary -S######################################## CFLAGS######################################## cpuCPU = -mcpu=cortex-m4# fpuFPU = -mfpu=fpv4-sp-d16# float-abiFLOAT-ABI = -mfloat-abi=hard# mcuMCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)

4.7 设置宏定义

设置工程所需的宏定义。

# C definesC_DEFS =  \-DAPM32F411 \-DAPM32F411_TINY

4.8 设置工程头文件包含

设置工程所需的头文件路径。

# C includesC_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

http://www.xdnf.cn/news/16544.html

相关文章:

  • 《Computational principles and challenges in single-cell data integration》
  • Vite 模块动态导入之Glob导入
  • 微算法科技MLGO突破性的监督量子分类器:纠缠辅助训练算法为量子机器学习开辟新天地
  • PCB学习笔记(一)
  • LeetCode 面试经典 150_数组/字符串_轮转数组(6_189_C++_中等)(额外数组;转置)
  • dify + mcp 实现图片 ocr 识别
  • 实例教学FPN原理与PANet,Pytorch逐行精讲实现
  • [leetcode] Z字型变换
  • dify离线插件打包步骤
  • 手撕设计模式——智能家居之外观模式
  • C++线程详解
  • C++11 std::function 详解:通用多态函数包装器
  • 从0开始学习R语言--Day62--RE插补
  • 【ssh】ubuntu服务器+本地windows主机,使用密钥对进行ssh链接
  • Linux常用基础命令
  • 反射核心:invoke与setAccessible方法详解
  • Git 从入门到精通
  • linux命令ps的实际应用
  • SQL注入SQLi-LABS 靶场less26-30详细通关攻略
  • 深入解析Java元注解与运行时处理
  • ​第七篇:Python数据库编程与ORM实践
  • 前缀和-974.和可被k整除的子数组-力扣(LeetCode)
  • [mcp: JSON-RPC 2.0 规范]
  • 机器学习之线性回归——小白教学
  • LRU(Least Recently Used)原理及算法实现
  • 最新优茗导航系统源码/全开源版本/精美UI/带后台/附教程
  • BreachForums 黑客论坛强势回归
  • sqLite 数据库 (2):如何复制一张表,事务,聚合函数,分组加过滤,列约束,多表查询,视图,触发器与日志管理,创建索引
  • JAVA_TWENTY—ONE_单元测试+注解+反射
  • 学习Python中Selenium模块的基本用法(3:下载浏览器驱动续)