前言

最近在做一个基于 AT32 的 FOC 的项目,在开始写代码之前对整体的代码框架构思了一下,有些部分打算用 C++ 来写。另外由于之前的经验,用 keil 中的 arm 编译器编译出来的 C++ 的程序有很大问题,所以就打算使用 Clion 来做这个。网络上很多教程说的不是很清楚,或者说并没有把整个部分做完整,所以打算自己记录下来。

软件版本

  • Clion 2025.2.4
  • AT32 WorkBench 1.2.00

芯片型号

芯片型号为 AT32F403ACGT7

编译工具配置

整个项目编译过程需要 AT32 官方提供的工具包 OpenOCD 下载支持和 arm-none-eabi-gcc 等编译器。可以直接从官网上下载,也可以点击下面的链接进行下载。

上述的 OpenOCD 和 mingw 是不需要自己安装的,所以它需要你将它解压到某个你熟悉的位置,方便查找,然后需要手动将其 bin 文件夹添加到系统环境变量中。GNU Arm 工具链是需要安装的,可以在安装时就选择添加到系统环境变量中。之后就需要重启一下电脑,更新一下系统环境变量,之后可以在终端测试一下你的 mingw 和 GNU Arm 的工具链是否安装好。

1
2
3
4
gcc -v
g++ -v
arm-none-eabi-gcc -v
arm-none-eabi-g++ -v

如果正常显示,那就说明安装好了。

AT32 WorkBench 导出工程代码

使用 workbench 直接导出工程代码,这个配置基本上就按照自己的项目需求配置即可。只是在最后导出时需要修改一下,如下图所示,将工具链改为 AT32 IDE 或者 cmake 都可,我这里是导出为 AT32 IDE 的。

1761729561207.png

Clion 配置

如果是第一次安装 Clion 的话,可以选择设置语言为中文,直接在设置里查找 Language,设置为中文即可。如果你之前一直在 vscode 上进行开发,而且 vscode 已经有很多配置了,那么切换成 Clion 的时候,它会提醒你是否要导入 vscode 中的配置,这一点还是很不错的。

工具链配置

进入 Clion 之后,打开你这个项目的文件夹,进入设置中设置工具链。如图所示,首先是进入设置中的构建执行部署,之后设置工具链。如果你的选项栏中没有 MinGW 的话,就点击上方那个 “+” 号,添加一个 MinGW 的工具链。工具链中的设置:工具集就选择你的 mingw 的文件夹,构建工具就选择 mingw\bin\mingw32-make.exe 文件,C 编译器选择使用 GNU Arm 的工具 arm-none-eabi-gcc.exe ,这个文件在你的 GNU Arm 的安装地址下,对应的 C++ 编译器选择使用 arm-none-eabi-g++.exe 。如果你希望你的项目能够调试的话,在调试器的地方选择 arm-none-eabi-gdb.exe 调试器。

1761823174260.png

CMakeLists 文件

首先是需要在项目的根目录下添加 CMakeLists.txt 文件,CMakeLists.txt 文件如下,我也对对应的代码进行了解释。但是一般的话,第一次添加 CMakeLists.txt 文件时,该项目并不会被识别为 cmake 项目,所以此时是没有 cmake 的构建的。这时候需要在左侧项目栏中,选中 CMakeLists.txt 文件,右键它点击加载 cmake 项目即可完成构建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# 设置为通用系统
set(CMAKE_SYSTEM_NAME Generic)
# 设置系统版本号
set(CMAKE_SYSTEM_VERSION 1)
# 要求 cmake 最低版本
cmake_minimum_required(VERSION 3.21)

# 设置项目所用的 C 语言的编译器,这里设置为 GNU Arm 工具链的编译器
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
# C++ 编译器
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
# 汇编编译器
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
# 静态库工具
set(CMAKE_AR arm-none-eabi-ar)
# 目标文件转换工具
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
# 目标文件反汇编工具
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
# 文件大小分析工具
set(SIZE arm-none-eabi-size)
# 设置编译目标类型为静态库
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

# 项目设置,支持 C C++ 汇编
project(AT32 C CXX ASM)
# C++ 17
set(CMAKE_CXX_STANDARD 17)
# C11
set(CMAKE_C_STANDARD 11)

# 添加 ARM 数学库相关的编译定义
add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING;)
# 添加编译和链接选项 硬件浮点单元
add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)

# arm-none-eabi-gcc 报错 undefined reference to `_exit'解决方案,关闭 semi-host 通信机制
add_compile_options(--specs=nosys.specs)
add_link_options(--specs=nosys.specs)

# 优化等级 -O1
add_compile_options(-O1)
# 处理器架构
add_compile_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork)
add_link_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork)
# 代码生成选项
add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)
# 编译器特殊选项,支持 C++ 编译
add_compile_options($<$<COMPILE_LANGUAGE:ASM>:-x$<SEMICOLON>assembler-with-cpp>)

include_directories(
# 这里只添加你需要依赖的文件的目录即可
)
# 添加预处理器定义
add_definitions(-DAT32F403ACGT7 -DUSE_STDPERIPH_DRIVER -DAT_START_F403A_V1_0)

file(GLOB SOURCES CONFIGURE_DEPENDS
# 这里只添加你需要的源文件即可,AT32 WorkBench 会把你不需要的某些文件也生成在这个项目里,但是如果选择了只生成必要的文件的话,就不会生成它所需要的源文件,编译会报错,所以这个需要根据自己需求来写
)

# 设置 ld 链接器的规则文件
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/libraries/cmsis/cm4/device_support/startup/gcc/linker/AT32F403AxG_FLASH.ld)
# 指定链接脚本
add_link_options(-T ${LINKER_SCRIPT})
# 添加链接器选项,内存使用报告,生成 map 文件
add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)

# 可执行文件定义
add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})

# 设置生成 hex 和 bin 文件,即十六进制和二进制文件
set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)

add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
COMMENT "Building ${HEX_FILE}
Building ${BIN_FILE}")

构建完成之后,右上角处会出现这个项目的 cmake 应用程序,这个 cmake 就相当于配置好了

1761734138239.png

OpenOCD 下载配置

首先需要添加一个配置文件,对应于不同的下载器,配置文件写法也不一样,例如我这里使用的是 dap 下载器,所以就列出 dap 下载器的配置文件。首先在当前项目根目录下添加文件 at32-daplink.cfg ,并且在其中写入如下的代码

1
2
3
4
5
6
7
adapter driver cmsis-dap
source [find interface/cmsis-dap.cfg]
cmsis_dap_backend hid
transport select swd
source [find target/at32f403axx.cfg]
# download speed = 10MHz
adapter speed 10000

上述的东西配置完成之后,就在这个运行调试配置界面上,点击左上角的 “+” 号,添加 OpenOCD 项目,选择目标为你这个项目的名称,选择对应的可执行的二进制文件,调试器就选择配置的工具链中的 GDB,面板配置文件选择上面刚刚新建的文件。需要注意的是,如果在 CMakeLists.txt 配置中失败了,那在选择目标和可执行二进制文件时,就不会出现 .elf 文件。

1761734864766.png

配置到此基本上就完了,之后就可以开始使用 Clion 快乐的写代码了。

遇到的一些问题

  1. arm-none-eabi-gcc 报错 undefined reference to _exit 等等一些未定的引用。在 CMakeLists.txt 文件中添加如下两行指令。

    1
    2
    add_compile_options(--specs=nosys.specs)
    add_link_options(--specs=nosys.specs)

后记

这个教程实际上也是参考了很多教程做出来的,而且过程中也遇到各种各样的问题,但是有些问题我也没遇到,所以教程只能做参考,出现没遇到的问题还是需要自己上网查查的。