配置CLion用于STM32开发【优雅の嵌入式开发】 - 哔哩哔哩

date
Mar 11, 2020
Last edited time
Jun 27, 2021 06:46 AM
status
Published
slug
clion_stm32
tags
MCU
summary
type
Post
Field
Plat
转载
最近在做一个开源个人项目有用到STM32这款 MCU,好久没用Keil感觉各种不适应,遂尝试能不能把STM32的开发环境部署到其他更强大的 IDE,结果很圆满,以下是配置Clion用于STM32开发的过程记录,供大家参考~
做嵌入式开发的人对STM32这个平台应该都是非常熟悉的,在国内尤其流行,很多产品里面都是基于这个平台做的方案。多数人在开发STM32的时候用的都是Keil这个老牌 IDE,很大一部分原因是因为大多数人最初是从 51 单片机学习过来的,51 就是基于Keil去开发的,然后迁移到STM32的时候也就沿用下来了。
Keil 开发环境界面
notion image
Keil操作简单,容易上手,而且可以很方便地进行调试。但是对于以前不是做嵌入式开发的软件开发人员来说,面对Keil这种上世纪风格的 IDE(不只是 UI)肯定是不太有好感的。在尝试过STM32CubeIDETrueStudio等用Eclipse修改的 IDE 之后,总是觉得还是没内味儿。
我平时工作中最常用的是PycharmAndroid Studio,都是 Jetbrains 系的 IDE。用过 Jetbrains 系 IDE 的朋友肯定会被它强大的代码补全、界面风格、各种插件、流畅性等众多优点所吸引,毫无疑问这些是能够极大提高开发效率的。而其中有一款CLion IDE就是专门面向 C/C++ 开发的,所以本篇文章会介绍如何把 STM32 的编译调试环境部署到CLion中,过程还是有很多坑值得注意的。
代码的话大家以前用的基本上都是 ST 的标准库,然后自己开发逻辑部分,或者在一些方便的地方直接操作寄存器。直接操作寄存器能提高代码的执行效率,但是很难移植,后来 ST 开发了一款可以快速 demo 的平台Cube MX,通过这个软件配合 ST 的HAL 库,可以快速的搭建工程,并能生成跨芯片平台的工程。HAL 库更容易进行移植,而且应用起来也更加方便,ST 也正在加大对HAL 库的支持,并渐渐放弃标准库。
本篇介绍的内容也是以基于HAL 库开发为准的。

环境及所需工具

环境

软件环境:

  • Windows 10
  • STM32CubeMX
  • Clion-2019
  • MinGW
  • OpenOCD
  • arm-none-eabi-gcc

硬件环境:

  • STM32F103VET6
  • 自制的 DapLink 下载器(ST-Link/J-Link 也是可以的)

工具安装

  1. STM32CubeMX 这个正常去官网下载最新版的安装就行了:https://www.st.com/en/development-tools/stm32cubemx.html
  1. OpenOCD OpenOCD 是用于对 STM32 进行下载仿真的工具,是一个开源软件包,Windows 版本下从这里下载,下载好解压到一个目录就行,后面会在 Clion 中链接这个目录:
    1. notion image
       
  1. MinGW
    1. arm-none-eabi-gcc Windows 到这里下载:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads ,选择 ZIP 压缩包形式的:
      1. notion image
        解压到一个文件夹,并把安装目录下的 bin 文件夹添加到环境变量:
        notion image
        然后重启使得环境变量生效之后可以在命令行里用以下语句测试: arm-none-eabi-gcc -v 如果有信息输出, 那就是装好了。
         

    Clion配置

    Clion 是基于 CMake 来管理项目的,所以首选我们需要配置好预设的 MinGW 和 CMake 环境。
     
    notion image
    配置成如图即可

    在Clion中创建STM32工程

    创建CubeMX工程

    在 Clion 中选择File-New Project可以创建 STM32CubeMX 的项目:
    notion image
    点击 create 后会生成一个.ioc文件,这个文件跟使用 STM32CubeMX 直接创建的是一样的,点击图中的链接可以跳转到 STM32CubeMX 中打开这个 ioc 文件:
    notion image
    默认选中的芯片型号是STM32F030F4Px,我们可以在 CubeMX 中重新选择自己需要的芯片,一切操作都和使用 Keil 开发没有区别。
    只有一个地方需要注意一下,就是在下面的设置中项目名称一定要和在 Clion 中建立的一致,这样生成的工程文件才会覆盖 Clion 中的文件,否则会另外生成一个文件夹,Clion 就无法读取了。
    另外生成的 IDE 类型选择是SW4STM32
    notion image
    每次修改完点 Generate 之后,弹窗直接点 Close,Clion 里面会自动更新文件。
    notion image
    第一次设置完回到 Clion 会弹出一个板卡选择窗口:
    notion image
    这些配置文件是跟 OpenOCD 下载程序有关的,里面的板子很可能是没有我们自己要用的型号的,后面会介绍怎么自己建立这个配置文件,这里先点取消。
    如果我还在用STM32-F407和这个ST-LinkV2的话, 可以直接用这个文件
     

    编译工程

    在 IDE 底栏的 CMake 选项卡中如果没有提示错误,说明工程配置就没问题了。
    点击这个按钮可以更新 CMake 工程:
    notion image
    顶栏的这三个图标分别是编译下载调试
    notion image
    点击编译,可以看到编译输出:
    notion image
    可以看到成功生成了用于烧写的.bin.hex文件。
    Keil里面我们烧录程序的时候要指定使用的下载器(J-Link、ST-Link、CMSIS-DAP 等),Clion烧录程序之前通用需要进行一些设置。

    烧录程序 & 在线调试

    点击编译按钮旁边的配置栏下拉,选Edit Configurations,打开配置窗口:
    notion image
    可以看到没有设置板子的 config 文件所以出现警告错误,这个配置文件就是前面说的需要自己生成的文件。
    我们在工程根目录下新建一个文件夹config,在里面新建一个配置文件daplink.cfg(因为我这里使用的是自制 DapLink 作为仿真器),文件的内容如下:
    前两行设置了仿真器的类型和接口,下面几行指定了Flash 大小芯片类型下载速度等。
    如果对自己的芯片不知道怎么设置,可以参考 OpenOCD 自带的一系列配置文件,路径在 OpenOCD 安装目录的share\openocd\scripts下:
    notion image
    只需要关注这几个目录:
    • board:板卡配置,各种官方板卡
    • interface:仿真器类型配置,比如 ST-Link、CMSIS-DAP 等都在里面
    • target:芯片类型配置,STM32F1xx、STM32L0XX 等等都在里面
    设置好配置文件之后,就可以点击下载或者调试按钮进行下载和在线调试了。
    在配置文件中不要加reset_config srst_only这一句,会导致下载失败,这一句是指示系统重启的,删除不影响下载。
    CLion 里面是支持全功能的单步断点调试的,也能在代码里直接观察变量的值,非常舒服~
    notion image
    强大的代码补全功能
    notion image
    单步调试和变量观察功能

    其他问题

    编译错误问题

    1. 如果移动了工程文件夹的话,最好打开. ioc 文件重新 Generate 一下再编译,可以解决很多错误。

    printf重定向问题

    在 Keil 里面为了使用printf函数我们需要重定向fputc函数:
    其中的FILE定义在stdio.h头文件中,所以需要在项目中包含这个头文件,但是经过测试发现,Keil 里面包含的是MDK\ARM\ARMCC\include这个目录下的stdio.h,而在 Clion 中是不会链接到这个文件的。因此如果在 Clion 中也按之前的方法进行重定向,会发现printf没有任何输出。
    在 Clion 中链接的是GNU-Tools-ARM-Embedded\arm-none-eabi\include里面的stdio.h,如果仍然想使用printf函数功能,则需要进行如下操作:
    新建一个retarget.h文件内容如下:
    再新建一个retarget.c文件内容如下:
    添加这两个文件到工程,更新 CMake,编译之后会发现,有几个系统函数重复定义了,被重复定义的函数位于Src目录的syscalls.c文件中,我们把里面重复的几个函数删掉即可。
    在 main 函数的初始化代码中添加对头文件的引用并注册重定向的串口号:
    然后就可以愉快地使用printfscanf啦:
     
    使用CLION连接Jlink的GDB Server
    按照如图配置即可
    notion image
    arg:
     

    © Lazurite 2021 - 2024