前言 最近在做一个基于 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 的。
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 调试器。
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 就相当于配置好了
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 文件。
配置到此基本上就完了,之后就可以开始使用 Clion 快乐的写代码了。
遇到的一些问题
arm-none-eabi-gcc 报错 undefined reference to _exit 等等一些未定的引用。在 CMakeLists.txt 文件中添加如下两行指令。
1 2 add_compile_options(--specs=nosys.specs) add_link_options(--specs=nosys.specs)
后记 这个教程实际上也是参考了很多教程做出来的,而且过程中也遇到各种各样的问题,但是有些问题我也没遇到,所以教程只能做参考,出现没遇到的问题还是需要自己上网查查的。