0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

稚晖君:配置CLion用于STM32开发

li5236 来源:稚晖君 作者:稚晖君 2022-03-30 14:28 次阅读

0.前言

最近在做一个开源个人项目有用到STM32这款MCU,好久没用Keil感觉各种不适应,遂尝试能不能把STM32的开发环境部署到其他更强大的IDE,结果很圆满,以下是配置Clion用于STM32开发的过程记录,供大家参考~

嵌入式开发的人对STM32这个平台应该都是非常熟悉的,在国内尤其流行,很多产品里面都是基于这个平台做的方案。多数人在开发STM32的时候用的都是Keil这个老牌IDE,很大一部分原因是因为大多数人最初是从51单片机学习过来的,51就是基于Keil去开发的,然后迁移到STM32的时候也就沿用下来了。

poYBAGJD-MSAE-jMAAGqK_1W7fQ709.png

Keil开发环境界面

Keil操作简单,容易上手,而且可以很方便地进行调试。但是对于以前不是做嵌入式开发的软件开发人员来说,面对Keil这种上世纪风格的IDE(不只是UI)肯定是不太有好感的。在尝试过STM32CubeIDE和TrueStudio等用Eclipse修改的IDE之后,总是觉得还是没内味儿。

我平时工作中最常用的是Pycharm和Android Studio,都是Jetbrains系的IDE。用过Jetbrains系IDE的朋友肯定会被它强大的代码补全、界面风格、各种插件、流畅性等众多优点所吸引,毫无疑问这些是能够极大提高开发效率的。而其中有一款CLion IDE就是专门面向C/C++开发的,所以本篇文章会介绍如何把STM32的编译调试环境部署到CLion中,过程还是有很多坑值得注意的。

代码的话大家以前用的基本上都是ST的标准库,然后自己开发逻辑部分,或者在一些方便的地方直接操作寄存器。直接操作寄存器能提高代码的执行效率,但是很难移植,后来ST开发了一款可以快速demo的平台Cube MX,通过这个软件配合ST的HAL库,可以快速的搭建工程,并能生成跨芯片平台的工程。HAL库更容易进行移植,而且应用起来也更加方便,ST也正在加大对HAL库的支持,并渐渐放弃标准库。

本篇介绍的内容也是以基于HAL库开发为准的。

1.环境及所需工具

软件环境:

Windows 10

STM32CubeMX

Clion-2019

MinGW

OpenOCD

arm-none-eabi-gcc

硬件环境:

STM32F103VET6

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

工具安装

STM32CubeMX

这个正常去官网下载最新版的安装就行了:https://www.st.com/en/development-tools/stm32cubemx.html

OpenOCD

OpenOCD是用于对STM32进行下载仿真的工具,是一个开源软件包,Windows版本下从这里下载,下载好解压到一个目录就行,后面会在Clion中链接这个目录:

poYBAGJD-OuAP9JSAACziATgD7c707.png

MinGW

Clion需要使用MinGW环境来配置工具链,安装方法如下:

首先去MinGW主页下载最新版本的MinGW: Minimalist GNU for Windows,这是MinGW的安装器:

poYBAGJD-RyAW_WKAAByc9a_XmA589.png

打开exe进行安装,修改安装目录(最好不能有空格),安装完成后进行组件下载:

pYYBAGJD-SmADsKRAADAsNIXB6k023.png

如上图中所示,把Basic Setup里面的组件全部勾选(也可也去掉不需要的语言编译器比如Objective-C)。

配置系统的环境变量,在Path环境变量里面添加一条,指向MinGW的bin文件夹:

pYYBAGJD-TSAYvSdAARjzraWc78780.png

重启电脑,然后在命令窗口中输入下面的命令验证安装是否成功:

gcc -v

poYBAGJD-WiARzQgAANK47t3hBw920.png

arm-none-eabi-gcc

Windows到这里下载:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads ,选择ZIP压缩包形式的:

pYYBAGJD-XSAJqboAAEuJQeeUm8794.png

解压到一个文件夹,并把安装目录下的bin文件夹添加到环境变量:

pYYBAGJD-YOALgF1AAClL1bISbo807.png

然后重启使得环境变量生效之后可以在命令行里用以下语句测试:

arm-none-eabi-gcc -v

如果有信息输出,那就是装好了。

Clion配置

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

打开File-Settings-Build,Execution,Deployment选项卡,在Toolchains下面添加一个MinGW环境:

pYYBAGJD-cKAWw7bAAGrodGOi1I736.png

注意Debugger不要改,否则断点调试的时候无法连接。

然后再CMake栏下确认一下工具链是否正确:

poYBAGJD-cyABiMKAAFvrdg2JJI812.png

至此Clion环境配置完成,可以创建STM32项目了。

2.在Clion中创建STM32工程

创建CubeMX工程

在Clion中选择File-New Project可以创建STM32CubeMX的项目:

poYBAGJD-dyALETlAAEDws5kiEg026.png

点击create后会生成一个.ioc文件,这个文件跟使用STM32CubeMX直接创建的是一样的,点击图中的链接可以跳转到STM32CubeMX中打开这个ioc文件:

poYBAGJD-eaAY6pnAAFDl5Kx1OA948.png

默认选中的芯片型号是STM32F030F4Px,我们可以在CubeMX中重新选择自己需要的芯片,一切操作都和使用Keil开发没有区别。

只有一个地方需要注意一下,就是在下面的设置中项目名称一定要和在Clion中建立的一致,这样生成的工程文件才会覆盖Clion中的文件,否则会另外生成一个文件夹,Clion就无法读取了。

另外生成的IDE类型选择是SW4STM32。

pYYBAGJD-jmADZ4HAAHJmZHTaAY474.png

每次修改完点Generate之后,弹窗直接点Close,Clion里面会自动更新文件。

pYYBAGJD-kiAJLfwAACASL1Cpuw886.png

第一次设置完回到Clion会弹出一个板卡选择窗口:

pYYBAGJD-lOAA9HSAAELqp3Q-1Q475.png

这些配置文件是跟OpenOCD下载程序有关的,里面的板子很可能是没有我们自己要用的型号的,后面会介绍怎么自己建立这个配置文件,这里先点取消。

编译工程

在IDE底栏的CMake选项卡中如果没有提示错误,说明工程配置就没问题了。

点击这个按钮可以更新CMake工程:

poYBAGJD-miARY1vAAEGWpNWddc765.png

顶栏的这三个图标分别是编译、下载、调试:

pYYBAGJD-nKAKWzfAABoL7-49MI462.png

点击编译,可以看到编译输出:

poYBAGJD-oeAVgu_AAFkuugNNbg339.png

可以看到成功生成了用于烧写的.bin和.hex文件。

烧录程序 & 在线调试

在Keil里面我们烧录程序的时候要指定使用的下载器(J-Link、ST-Link、CMSIS-DAP等),Clion烧录程序之前通用需要进行一些设置。

点击编译按钮旁边的配置栏下拉,选Edit Configurations,打开配置窗口:

pYYBAGJD-s6AFQavAAGEa0Yhsrk622.png

可以看到没有设置板子的config文件所以出现警告错误,这个配置文件就是前面说的需要自己生成的文件。

我们在工程根目录下新建一个文件夹config,在里面新建一个配置文件daplink.cfg(因为我这里使用的是自制DapLink作为仿真器),文件的内容如下:

# choose st-link/j-link/dap-link etc.

adapter driver cmsis-dap

transport select swd

# 0x10000 = 64K Flash Size

set FLASH_SIZE 0x20000

source [find target/stm32f1x.cfg]

# download speed = 10MHz

adapter speed 10000

前两行设置了仿真器的类型和接口,下面几行指定了Flash大小、芯片类型、下载速度等。

如果对自己的芯片不知道怎么设置,可以参考OpenOCD自带的一系列配置文件,路径在OpenOCD安装目录的share\openocd\scripts下:

pYYBAGJD-uOATz0jAAFUa5mI5ZE179.png

只需要关注这几个目录:

board:板卡配置,各种官方板卡

interface:仿真器类型配置,比如ST-Link、CMSIS-DAP等都在里面

target:芯片类型配置,STM32F1xx、STM32L0XX等等都在里面

设置好配置文件之后,就可以点击下载或者调试按钮进行下载和在线调试了。

在配置文件中不要加reset_config srst_only这一句,会导致下载失败,这一句是指示系统重启的,删除不影响下载。

CLion里面是支持全功能的单步断点调试的,也能在代码里直接观察变量的值,非常舒服~

pYYBAGJD-viALcAAAAG0towS1BU769.png

强大的代码补全功能

pYYBAGJD-wuAbHvfAAH3i7nOez0149.png

单步调试和变量观察功能

3.其他问题

编译错误问题

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

printf重定向问题

在Keil里面为了使用printf函数我们需要重定向fputc函数:

int fputc (int ch, FILE *f)

{

(void)HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);

return ch;

}

其中的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文件内容如下:

#ifndef _RETARGET_H__

#define _RETARGET_H__

#include “stm32f1xx_hal.h”

#include

#include

void RetargetInit(UART_HandleTypeDef *huart);

int _isatty(int fd);

int _write(int fd, char *ptr, int len);

int _close(int fd);

int _lseek(int fd, int ptr, int dir);

int _read(int fd, char *ptr, int len);

int _fstat(int fd, struct stat *st);

#endif //#ifndef _RETARGET_H__

再新建一个retarget.c文件内容如下:

#include 《_ansi.h》

#include 《_syslist.h》

#include

#include

#include

#include

#include

#if !defined(OS_USE_SEMIHOSTING)

#define STDIN_FILENO 0

#define STDOUT_FILENO 1

#define STDERR_FILENO 2

UART_HandleTypeDef *gHuart;

void RetargetInit(UART_HandleTypeDef *huart)

{

gHuart = huart;

/* Disable I/O buffering for STDOUT stream, so that

* chars are sent out as soon as they are printed. */

setvbuf(stdout, NULL, _IONBF, 0);

}

int _isatty(int fd)

{

if (fd 》= STDIN_FILENO && fd 《= STDERR_FILENO)

return 1;

errno = EBADF;

return 0;

}

int _write(int fd, char *ptr, int len)

{

HAL_StatusTypeDef hstatus;

if (fd == STDOUT_FILENO || fd == STDERR_FILENO)

{

hstatus = HAL_UART_Transmit(gHuart, (uint8_t *) ptr, len, HAL_MAX_DELAY);

if (hstatus == HAL_OK)

return len;

else

return EIO;

}

errno = EBADF;

return -1;

}

int _close(int fd)

{

if (fd 》= STDIN_FILENO && fd 《= STDERR_FILENO)

return 0;

errno = EBADF;

return -1;

}

int _lseek(int fd, int ptr, int dir)

{

(void) fd;

(void) ptr;

(void) dir;

errno = EBADF;

return -1;

}

int _read(int fd, char *ptr, int len)

{

HAL_StatusTypeDef hstatus;

if (fd == STDIN_FILENO)

{

hstatus = HAL_UART_Receive(gHuart, (uint8_t *) ptr, 1, HAL_MAX_DELAY);

if (hstatus == HAL_OK)

return 1;

else

return EIO;

}

errno = EBADF;

return -1;

}

int _fstat(int fd, struct stat *st)

{

if (fd 》= STDIN_FILENO && fd 《= STDERR_FILENO)

{

st-》st_mode = S_IFCHR;

return 0;

}

errno = EBADF;

return 0;

}

#endif //#if !defined(OS_USE_SEMIHOSTING)

添加这两个文件到工程,更新CMake,编译之后会发现,有几个系统函数重复定义了,被重复定义的函数位于Src目录的syscalls.c文件中,我们把里面重复的几个函数删掉即可。

在main函数的初始化代码中添加对头文件的引用并注册重定向的串口号:

#include “retarget.h”

RetargetInit(&huart1);

然后就可以愉快地使用printf和scanf啦:

char buf[100];

printf(“\r\nYour name: ”);

scanf(“%s”, buf);

printf(“\r\nHello, %s!\r\n”, buf);

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2244

    文章

    10683

    浏览量

    349404
  • 稚晖君
    +关注

    关注

    5

    文章

    34

    浏览量

    4873
收藏 人收藏

    评论

    相关推荐

    ST-LINK程序下载不进去的原因?怎么排查?

    使用芯片:STM32F103C8T6开发环境:clion 配置是跟稚晖一步一步操作的下载使用的
    发表于 03-08 07:24

    stm32使用AD5762配置程序

    如何使用STM32配置AD5762。 首先,我们需要确保STM32开发环境已经搭建好,并且熟悉STM32的编程方式。接下来,我们将按照以
    的头像 发表于 01-09 11:10 368次阅读

    开源作品!稚晖超迷你低成本开发板、超酷机器人、智能手环等参考方案

    (u-boot、内核、root-fs)开源出来。板卡成本应该不到50RMB,而且提供了很多资料,很适合用于新手作为入门Linux学习的开发板。 稚晖在个人的github仓库开源了
    发表于 12-12 10:28

    JetBrains推出CLion Nova技术工具

    未来,我们计划将 CLion Nova 并入 CLion Classic。我们不打算推出新产品。” 该公司打算先收集用户反馈,然后在 2024 年的某个时刻根据具体的反馈结果将 CLion Nova 合并到
    的头像 发表于 11-23 10:44 462次阅读
    JetBrains推出<b class='flag-5'>CLion</b> Nova技术工具

    JetBrains推出新的C/C++ IDE:CLion Nova

    该公司打算先收集用户反馈,然后在 2024 年的某个时刻根据具体的反馈结果将 CLion Nova 合并到 CLion Classic。在此之前,预览版本将免费提供,并且可以与 CLion (Classic) 安装并行安装。目前
    的头像 发表于 11-20 17:24 774次阅读
    JetBrains推出新的C/C++ IDE:<b class='flag-5'>CLion</b> Nova

    STM32如何配置外部中断?STM32外部中断配置步骤

    STM32如何配置外部中断?STM32外部中断配置步骤  作为一款现代化的微控制器,STM32系列芯片在各种应用场合中广泛应用。其中最常见的
    的头像 发表于 10-26 17:47 2285次阅读

    STM32使用GPIO配置的5种方式

    STM32使用GPIO配置的5种方式 STM32是常见的一种微控制器,其GPIO模块可以实现对外部设备的控制和数据传输,包括数字I/O口、模拟输入口和输出口等。在STM32中,GPIO
    的头像 发表于 10-26 17:42 863次阅读

    RaspberryPi Pico Clion开发环境配置

    该文章用于记录使用一块 Pico通过 picoprobe 调试另一块 Pico 的开发方案,使用的 IDE 为 Clion,工程文件为 RT-Thread BSP。
    的头像 发表于 10-09 16:16 800次阅读
    RaspberryPi Pico <b class='flag-5'>Clion</b><b class='flag-5'>开发</b>环境<b class='flag-5'>配置</b>

    PICO Example Clion开发

    以下是一些在 linux 环境下,使用 Clion 开发基于 C/C++ SDK 的 PICO-Example 的注意事项,使用 Clion 的下载和调试配置在上一篇文章中已经介绍。
    的头像 发表于 10-09 10:16 518次阅读

    STM32cubeide导入Clion IDE会出错的原因?如何解决?

    STM32cubeide导入Clion IDE 会出错
    发表于 09-20 06:47

    华为天才少年稚晖君轮足机器人“远征A1”正式发布

    发布会,正式发布远征A1智能机器人。“远征A1”是人工智能技术与机器人实体相结合;具备双足行走、智能任务、人机互动等领域的能力。 稚晖君轮足机器人“远征A1”的下肢采用双足,轮式,轮足等不同的设计,可实现不同应用场景下更换配置;而且上肢
    的头像 发表于 08-18 18:42 1961次阅读
    华为天才少年<b class='flag-5'>稚晖</b>君轮足机器人“远征A1”正式发布

    基于STM32的FreeRTOS开发(2)----Cube工程的FreeRTOS配置

    STM32Cube是STMicroelectronics提供的一种软件工具,用于配置和生成STM32微控制器的固件。它提供了一个图形化用户界面,可以轻松
    的头像 发表于 07-27 09:53 1322次阅读
    基于<b class='flag-5'>STM32</b>的FreeRTOS<b class='flag-5'>开发</b>(2)----Cube工程的FreeRTOS<b class='flag-5'>配置</b>

    STM32CUBEMX开发GD32F303(14)----IIC之配置OLED

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。
    的头像 发表于 07-26 13:52 1424次阅读
    <b class='flag-5'>STM32</b>CUBEMX<b class='flag-5'>开发</b>GD32F303(14)----IIC之<b class='flag-5'>配置</b>OLED

    STM32的GPIO在实际开发设计的使用配置和技巧

    一、前言 本篇开始对STM32的GPIO在实际开发设计中的使用配置和技巧进行探讨,可以先去回顾下之前介绍的GPIO的相关理论基础知识包括基本结构,工作模式和寄存器原理。 了解过STM32
    的头像 发表于 06-22 10:22 563次阅读
    <b class='flag-5'>STM32</b>的GPIO在实际<b class='flag-5'>开发</b>设计的使用<b class='flag-5'>配置</b>和技巧

    CubeMX配置stm32的DAC

    我们使用 STM32CubeMX 软件进行配置。DAC 的配置是相对很简单的,如下图所示。
    的头像 发表于 06-12 09:18 2079次阅读
    CubeMX<b class='flag-5'>配置</b><b class='flag-5'>stm32</b>的DAC