【指南】如何在CLion下配置STM32开发环境

ngHackerX86

(注意:笔者在win下进行安装演示,linux或MacOS下安装请参考其他教程调整部分操作)

为什么是CLion?

  尽管对于STM32的开发而言,Keil已经是一个很好的工具了,作为一个老牌的嵌入式开发用IDE,该有的功能都有,升级到5.XX版本之后界面看着也挺现代。但是,作为一个属于上一个时代的开发环境,写代码时会感觉到它的自动补全、智能提示等等功能非常弱,特别是在CubeMX工具大大改善了初始化配置的体验以后,这种不足就显得更加突出了。

  而Keil的缺点正是CLion的重要优点,CLion由JetBrains公司开发,是一个广受赞誉的IDE,自动补全、智能提示能力一流,活动模板等特性可以大大提升开发效率。

  当然,早期CLion是不能用于单片机开发的,不过,用户要求添加相关功能的呼声一直很高,也一直有人通过各种魔改来在CLion下进行单片机开发工作。终于,在2019.1版本中,CLion添加了对于CubeMX的支持(2020.1版本则更加完善),然后,辅以几个其他的工具,可以在CLion下完成STM开发中的全部工作。而且,相关配置可以在任意主流桌面平台上搭建。

  So,赶紧折腾起来,换上属于新时代的开发工具!

安装步骤

所需的软件

  • CLion -------主角
  • STM32CubeMX ST官方力推的自动化配置和代码生成工具
  • OpenOCD ------调试工具
  • gcc-arm-none-eabi --------交叉编译工具链
  • MinGW --------额,你可以认为这是一个大礼包
  • Everything -------一个本地文件搜索工具,不是必备的
  • 可能还包括你所使用的调试器的驱动,之前安装过就行。

详细的步骤

一、Everything

  笔者想从简单的讲起,所以先说这个小家伙。下载链接在这里,这个小工具会自己维护一份文件目录,所以搜索起来超级快,搜索时可以通过名称和文件类型进行筛选,同时还支持对于后缀名的检索,比如你可以通过“hello .c”这样的关键字搜索名称中包含“hello”的.c文件。

二、MinGW

  • 首先,从这里下载MinGW(其实是MinGW-w64,兼容MinGW且更强大),然后解压到某个目录(以后不要改动)。
  • 然后,添加环境变量,具体到bin目录,比如“D:ToolChainmingw64bin”这样,根据自己安装目录确定。
  • 打开命令行,输入gcc -v测试一下,没有提示不是可用的指令而是返回了一大堆信息就说明一切正常。

    (补充:安装过Dev-cpp之类的自带MinGW的软件的话这个安装环节可以省略)

三、OpenOCD

  • 首先,在这里下载并解压到某个目录(之后不要改动),笔者选择的版本为20200524。
  • 然后,添加环境变量,还是具体到bin目录。
  • 最后同样要测试一下,命令行输入openocd -v,回车,返回版本信息说明状态正常。

四、gcc-arm-none-eabi

  • 下载地址,高版本的该工具链在CLion里适用貌似有些问题,笔者使用的版本为“gcc-arm-none-eabi-7-2017-q4-major”
  • 然后,添加环境变量。
  • 开命令行用arm-none-eabi-gcc -v测试一下,返回版本信息说明正常。

五、STM32CubeMX

  • CubeMX是基于Java开发的软件,所以需要先安装Java运行环境(JRE、Java Runtime Environment),下载地址在这里,根据自己系统和CPU选择版本,如intel+win10 64位应选择“jre-8u251-windows-x64.exe”
  • 安装JRE以后,命令行下用java -version进行测试,返回版本信息则正常。
  • 然后,我们来安装STM32CubeMX,从这里下载即可,安装过程没什么特别的。

    (补充:JRE必须是64位的,否则CubeMX会不正常)

六、CLion

  • 终于到咱们的主角了,首先去这里下载,CLion是收费软件,下载的版本为完全版本但是许可证只有30天有效期,但是没关系,学生的话通过教育邮箱认证一下就可以获取教育许可证从而免(bai)费(piao)使用,至于破解什么的,咳咳,咱不研究这个。
  • 下载的时候有这么个环节需要自己选择一下,如图,全勾上即可。

P1.jpg

  • 然后第一次使用的话会先要求登录,然后是这么个界面,识别出了MinGW并且添加了路径,假如想跟着教程走的话,默认的就可以。

P2.jpg

  • 然后是CLion的开始界面,选择右下角的“Config”,然后选择“Setting”
  • 然后,如图,在"Build, Execution, Deployment --> Embedded Devlopment"下添加OpenOCD和STM32CubeMX的路径,自动识别到的不一定正确,点击Test之后弹出的提示消息背景色为绿色而不是红色则路径已经正确添加。

P3.jpg

  • 安装OpenOCD插件,然后根据提示重启IDE

P4.jpg

  • "Setting --> Build, Execution, Deployment --> OpenOCD Support",添加OpenOCD安装路径

P5.jpg

  • "Setting --> Build, Execution, Deployment --> Toolchains",修改Debugger为“arm-none-eabi-gdb.exe”(bin目录下)

P6.jpg

到这里,CLion下STM32开发环境的配置就算完成了,但是平常的使用中还有一些需要注意的,所以我们来建个工程演示一下。

CLion新建工程演示

  • 首先来建个工程,选择CubeMX,然后选好路径,创建。

P7.jpg

  • 然后,CLon会调用STM32CubeMX创建一个.ioc文件(也就是Cube的工程文件),选中它,然后“Open With STM32CubeMX”
  • 然后就是Cube的常规使用了,网上教程很多,各位看官随便找点看下即可。总之,先修改芯片,然后保存并覆盖原先工程,然后按一般的方式建个LED的demo,稍微要注意的就是生成的工程类型选择“SW4STM32”,因为目前CLion还无法管理Keil工程(不过IAR工具链已经支持了,有兴趣的童鞋可以探索一下在CLion下使用IAR工具链的方法)。

P8.jpg

  • 关闭Cube,返回CLion,会有这么一个界面弹出来让你选择cfg文件,这个文件定义了工程里面一些关于芯片型号、Flash容量、使用的调试器和调试接口类型等等的信息,选择是以开发板为选项进行的,可能无法和芯片匹配上,没关系,之后可以修改,根据选择一个主芯片与自己所用芯片同系列且尽量相似的板子,然后选择"Copy to Project & Use",复制一份到工程里便于之后修改。笔者这里选择103C8

P9.jpg

  • 除注释外,cfg文件原内容如下:

    set FLASH_SIZE 0x20000
    
    source [find target/stm32f1x.cfg]
  • 我们修改之后的内容如下:

    # 设置调试器为cmsis-dap
    source [find interface/cmsis-dap.cfg]
    # 设置调试器所用接口为SWD
    transport select swd
    # 定义Flash大小为64K
    set FLASH_SIZE 0X10000
    # 设置芯片
    source [find target/stm32f1x.cfg]
  • 然后,点击右上角的小三角进行编译下载(或者使用快捷键Shift + F10 )

P10.jpg

  • 虽然提示信息是红色(这一点值得吐槽),但是确实下载成功了。

P11.jpg

  • 点击小三角旁边的小虫虫,可以正常debug,打断点、单步都正常。

P12.jpg

  • 然后,终于要用到我们的Everything了,当我们想查看寄存器值的时候,提示要加载.svd文件。

P13.jpg

  • 用Everything搜索“stm32F103 .svd”。笔者电脑上的话,在RT-Thread Studio和Keil的安装目录下都有名为“stm32F103xx.svd”的文件被发现,但是没有安装过类似软件的童鞋可能会发现啥也搜不到,这样的话就需要自己上网找相应文件了,网上能搜到很多资源,例如这个。不过笔者没有做过测试,如有需要请读者自行验证。

    加载.svd文件以后就能查看寄存器值了。

P14.jpg

  • OK,之后就能在CLion下愉快地开发STM32了。

一些可选的配置

  • 添加背景图片

    依次选择“File --> Settings --> Appearance & Behavior --> Appearance”,然后你就能看到“Background Image”的选项了

  • 添加活动模板

    活动模板是个很强大的功能,能减少大量不必要的劳动,比如写for循环。

gif_1.gif

这里用了个printf,很多童鞋都知道,在单片机开发中用printf需要把它重定向到串口,简单点的话就是重写fputc,当然,对编译器类型进行判断后在分别处理的代码更加优秀,比如这样的:

/* USER CODE BEGIN 1 */
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
/* USER CODE END 1 */

(来源:http://www.waveshare.net/stud...

至于如何自定义活动模板让这段代码在你需要它的时候于3S内出现,请各位看官移步文末的第二条参考链接。

尾声

  如果需要在CLion下进行其他单片机的开发的话,可以考虑一下PlatformIO,具体看这里

参考链接

阅读 11.4k

在嵌入式的道路上疯狂跑偏

16 声望
15 粉丝
0 条评论

在嵌入式的道路上疯狂跑偏

16 声望
15 粉丝
文章目录
宣传栏