嵌入式我爱编程嵌入式linux那些事

Clion配置stm32嵌入式开发环境

2017-09-18  本文已影响757人  5353f429a042

简介:

最近一段时间一直在学习Linux平台下的嵌入式stm32开发环境的搭建,现在终于搭建完毕,基本满足了自己的开发需求,就顺便写下自己的一点心得。

最开始做嵌入式开发是在win平台下,后来因为学习需要转到了deepin(一个linux的发行版)平台,但是总不能一直两个系统切换吧,况且Keil嵌入式开发软件,虽然强大,但是语法补全功能实在做的捉急,各种嫌弃。作为一个IDE党,于是转投Clion,想使用Clion进行嵌入式开发。

Clion的优势:

1. 编译,连接自动化辅助工具Cmake很大程度上解决了,嵌入式开发环境复杂的编译链接过程

2. 强大的语法智能补全、debug  功能  (2017版本刚好又已经有了嵌入式所需要的 remote debug)

开发环境:

平台:deepin 

工具链 :  arm-none-eabi

IDE :  Clion

调试器驱动:开源 openocd (适用于多种调试器jlink、stlink。这里我用的是stlink调试器)

辅助工具:expect, telnet     (这两个软件可以直接在软件仓库下载 `sudo apt-get install xxxx` )

配置模板:

cmake配置:

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

CMake宏定义设置

这里主要设置了两个宏定义供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命令地址,还有一些是硬件相关的参数。

两个宏定义的路径是基于自己的文件路径定义的,不要盲目搬砖!!

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的具体配置我就不多说了,具体看文件内部的注释。

gdb相关配置:

openocd相当于建立了一个gdb-server。clion使用arm-noen-eabi-gdb的进行调试的时候需要进行先关的设置

设置第一步

进入run/debug configuration界面以后 点击左上角的 `+`号,里面选择remote gdb debugger 选项,然后按照如下进行配置。

openocd的默认tcp 调试端口是3333。

symbol file的路径是 project/build/xxx.elf     看你项目的名字了     xxx 由项目根目录下CMakeList 文件中的项目名字决定。

debugger配置参数

还需要对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

openocd的相关配置:

我们使用openocd其实是为了将它作为一个gdb-server传递指令,我们在Clion中要新建一个相关的工具,开启gdb-server服务。

新建tool工具栏选项

配置具体如下:

注意 下方倒数第三个栏目 program栏目中程序的路径是根据自己程序存放的地址来定义的。

第二行参数是与调试器相关的我的是stlink v2所以使用的是这个参数。jlink的参数可以到官网查询,也可以在网上直接搜到很简单我就不说了。

openocd stlink-v2的具体配置

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

项目的编译:

项目的debug:

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

debug截图

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

参考文章:

使用CLion做嵌入式开发  这篇文章少了.gdbinit的配置这个很重要 缺少后会一直报错

STM32高级开发(11)-使用GDB调试你的工程  gdb调试命令解释的很详细

windows下使用CLion+OpenOCD+expect做嵌入式开发(在CLion中编译、烧录、调试stm32) win平台下的clion参考 

github stlink 开源的stlink驱动 这个的作用和openocd一样 都是gdb-server 看它的readme很有用

上一篇下一篇

猜你喜欢

热点阅读