打印
[应用相关]

Clion配置stm32嵌入式开发环境

[复制链接]
4255|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
磨砂|  楼主 | 2019-7-9 08:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
简介:
最近一段时间一直在学习Linux平台下的嵌入式stm32开发环境的搭建,现在终于搭建完毕,基本满足了自己的开发需求,就顺便写下自己的一点心得。
最开始做嵌入式开发是在win平台下,后来因为学习需要转到了deepin(一个linux的发行版)平台,但是总不能一直两个系统切换吧,况且Keil嵌入式开发软件,虽然强大,但是语法补全功能实在做的捉急,各种嫌弃。作为一个IDE党,于是转投Clion,想使用Clion进行嵌入式开发。
Clion的优势:
1. 编译,连接自动化辅助工具Cmake很大程度上解决了,嵌入式开发环境复杂的编译链接过程
2. 强大的语法智能补全、debug  功能  (2017版本刚好又已经有了嵌入式所需要的 remote debug)





使用特权

评论回复
沙发
磨砂|  楼主 | 2019-7-9 08:31 | 只看该作者
开发环境:
平台:deepin
工具链 :  arm-none-eabi
IDE :  Clion
调试器驱动:开源openocd (适用于多种调试器jlink、stlink。这里我用的是stlink调试器)
辅助工具:expect, telnet     (这两个软件可以直接在软件仓库下载 `sudo apt-get install xxxx` )





使用特权

评论回复
板凳
磨砂|  楼主 | 2019-7-9 08:31 | 只看该作者
配置模板:

cmake配置:
cmake有一部分宏定义是需要在IDE -> setting -> build...->cmake 里面进行配置的,作为全局变量在cmake编译过程中生效,这里我会一一进行详细说明。






使用特权

评论回复
地板
磨砂|  楼主 | 2019-7-9 08:31 | 只看该作者
这里主要设置了两个宏定义供CMake编译的时候使用:
-DTOOLCHAIN_DIR=/home/sunqi/program/gcc-arm-none-eabi-5_4-2016q3
-DCMAKE_TOOLCHAIN_FILE=/home/sunqi/Desktop/mcu_proj/conf/t
第一个宏定义是自己arm-none-eabi编译工具链的path
第二个宏定义是cmake自己的处理文件,基于第一个宏定义,找出所需要的编译时用到的gcc,ld命令地址,还有一些是硬件相关的参数。
两个宏定义的路径是基于自己的文件路径定义的,不要盲目搬砖!!





使用特权

评论回复
5
磨砂|  楼主 | 2019-7-9 08:32 | 只看该作者
oolchain-arm-eabi-gcc.cmake  文件的内容将下面内容保存,我将它放在了project根目录下


include(CMakeForceCompiler)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR cortex-m3)
find_program(ARM_CC arm-none-eabi-gcc ${TOOLCHAIN_DIR}/bin)
find_program(ARM_CXX arm-none-eabi-g++ ${TOOLCHAIN_DIR}/bin)
find_program(ARM_OBJCOPY arm-none-eabi-objcopy ${TOOLCHAIN_DIR}/bin)
find_program(ARM_SIZE_TOOL arm-none-eabi-size ${TOOLCHAIN_DIR}/bin)
CMAKE_FORCE_C_COMPILER(${ARM_CC} GNU)
CMAKE_FORCE_CXX_COMPILER(${ARM_CXX} GNU)
set(CMAKE_ARM_FLAGS
"-mcpu=cortex-m3 -mthumb -fno-common -ffunction-sections -fdata-sections"
)
if(CMAKE_SYSTEM_PROCESSOR STREQUAL"cortex-m3")
set(CMAKE_C_FLAGS"${CMAKE_C_FLAGS} ${CMAKE_ARM_FLAGS}")
set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} ${CMAKE_ARM_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS"${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_ARM_FLAGS}")
else()
message(WARNING
"Processor not recognised in toolchain file,"
"compiler flags not configured."
)
endif()
# fix long strings (CMake appends semicolons)
string(REGEX REPLACE";" " "CMAKE_C_FLAGS"${CMAKE_C_FLAGS}")
set(CMAKE_C_FLAGS"${CMAKE_C_FLAGS}"CACHE STRING"")
set(BUILD_SHARED_LIBS OFF)


Clion项目根目录下还有一个CMakeList 是整个项目的编译配置文件,包含了编译、连接参数的配置以及输出编译文件的路径, 默认是在 工程目录下的build文件夹下。
cmakeList的具体配置我就不多说了,具体看文件内部的注释。





使用特权

评论回复
6
磨砂|  楼主 | 2019-7-9 08:33 | 只看该作者
gdb相关配置:
openocd相当于建立了一个gdb-server。clion使用arm-noen-eabi-gdb的进行调试的时候需要进行先关的设置







使用特权

评论回复
7
磨砂|  楼主 | 2019-7-9 08:33 | 只看该作者
进入run/debug configuration界面以后 点击左上角的 `+`号,里面选择remote gdb debugger 选项,然后按照如下进行配置。
openocd的默认tcp 调试端口是3333。
symbol file的路径是 project/build/xxx.elf     看你项目的名字了     xxx 由项目根目录下CMakeList 文件中的项目名字决定。











使用特权

评论回复
8
磨砂|  楼主 | 2019-7-9 08:34 | 只看该作者
还需要对gdb初始化文件进行配置,初始化配置文件 `.gdbinit`可以在两个地方1. gdb程序的绝对地址所在的目录下2. ~/.gdbinit一般我们选择第二种方式,如果没有在 ~路径下创建。~/.gdbinit 内容如下

add-auto-load-safe-path ~/.gdbinit
define target hookpost-remote
#file "~/CLionProjects/mcu/build/mcu.elf"
monitor reset
monitor halt
load
break main
end

使用特权

评论回复
9
磨砂|  楼主 | 2019-7-9 08:34 | 只看该作者
openocd的相关配置:
我们使用openocd其实是为了将它作为一个gdb-server传递指令,我们在Clion中要新建一个相关的工具,开启gdb-server服务。





使用特权

评论回复
10
磨砂|  楼主 | 2019-7-9 08:35 | 只看该作者
配置具体如下:
注意 下方倒数第三个栏目 program栏目中程序的路径是根据自己程序存放的地址来定义的。
第二行参数是与调试器相关的我的是stlink v2所以使用的是这个参数。jlink的参数可以到官网查询,也可以在网上直接搜到很简单我就不说了。




openocd stlink-v2的具体配置


整个工程的模板我放在了我的github






使用特权

评论回复
11
磨砂|  楼主 | 2019-7-9 08:35 | 只看该作者
项目的编译:




项目的debug:
上张图中 step1:切换到remote debug栏目,切换后然后直接按下按钮右边debug按钮即可。


使用特权

评论回复
12
磨砂|  楼主 | 2019-7-9 08:36 | 只看该作者



美中不足的是不能查看对应的汇编寄存器变量,不过对我来说是够了。

使用特权

评论回复
13
xiaoqizi| | 2019-8-6 12:50 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
14
磨砂|  楼主 | 2019-8-7 09:51 | 只看该作者
非常感谢支持

使用特权

评论回复
15
mx25| | 2021-8-16 12:14 | 只看该作者
哇,前来学习观望

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

94

主题

4157

帖子

2

粉丝