别用keil了,CLion同样可以用于STM32开发

发布者:ohp991养生的香菇最新更新时间:2023-07-04 来源: zhihu关键字:keil  STM32开发 手机看文章 扫描二维码
随时随地手机看文章

0.前言

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

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

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库开发为准的。

1.环境及所需工具

软件环境:

  • Windows 10

  • STM32CubeMX

  • Clion-2019

  • MinGW

  • OpenOCD

  • arm-none-eabi-gcc

硬件环境:

  • STM32F103VET6

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

工具安装

  1. STM32CubeMX
    这个正常去官网下载最新版的安装就行了:st.com/en/development-t

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

在CLion中配置OpenOCD的方法:

MinGW
Clion需要使用MinGW环境来配置工具链,安装方法如下:
首先去MinGW主页下载最新版本的MinGW: Minimalist GNU for Windows,这是MinGW的安装器:

如上图中所示,把Basic Setup里面的组件全部勾选(也可也去掉不需要的语言编译器比如Objective-C)。
配置系统的环境变量,在Path环境变量里面添加一条,指向MinGW的bin文件夹:

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

arm-none-eabi-gcc
Windows到这里下载:developer.arm.com/open- ,选择ZIP压缩包形式的:


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


然后重启使得环境变量生效之后可以在命令行里用以下语句测试:
arm-none-eabi-gcc -v
如果有信息输出,那就是装好了。

Clion配置

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

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

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

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

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

2.在Clion中创建STM32工程

创建CubeMX工程

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

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

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

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

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

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



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

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

编译工程

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

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

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


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

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

烧录程序 & 在线调试

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

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

可以看到没有设置板子的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

如果是用ST-Link的话:


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

#adapter driver cmsis-dap

#transport select swd

source [find interface/stlink.cfg]

transport select hla_swd

source [find target/stm32f1x.cfg]

# download speed = 10MHz

adapter speed 10000

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


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

只需要关注这几个目录:

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

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

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

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

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

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

强大的代码补全功能

最后说明一下,CLion中组织编译规则都是基于CMakeLists.txt文件的,如果熟悉CMake应该会觉得很方便很强大,不熟悉的也没事,基本不需要额外修改什么,只需要知道怎么在这个文件里面添加源码目录和include文件夹的路径就行了:

include_directories(

        Core/Inc

        UserApp

// 其他include目录

)



file(GLOB_RECURSE SOURCES

        "startup/*.*"

        "Drivers/*.*"

        "Core/*.*"

        "UserApp/*.*"

        "3rdParty/*.*"

// *.*表示通配符,也就是这个文件夹里的所有文件都会被编译

        )

3.其他问题

编译错误问题

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

遇到任何CMake相关的报错,一般是由于缓存没有更新引起的,可以在CLion中选Tools-CMake-Reset Cache and Reload Project即可解决。

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里面包含的是MDKARMARMCCinclude这个目录下的stdio.h,而在Clion中是不会链接到这个文件的。因此如果在Clion中也按之前的方法进行重定向,会发现printf没有任何输出。


在Clion中链接的是GNU-Tools-ARM-Embeddedarm-none-eabiinclude里面的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("rnYour name: ");

scanf("%s", buf);

printf("rnHello, %s!rn", buf);

其二:


直接修改CMakeList.txt,加入下述编译选项


set(COMMON_FLAGS "-specs=nosys.specs -specs=nano.specs -u _printf_float -u _scanf_float")


关键字:keil  STM32开发 引用地址:别用keil了,CLion同样可以用于STM32开发

上一篇:STM32单片机看门狗:独立看门狗和窗口看门狗有什么区别
下一篇:【STM32H7教程】第49章 STM32H7的FMC总线应用之SDRAM

推荐阅读最新更新时间:2024-11-12 23:43

MDK-ARM(Keil uVision V4.72)上STM32开发环境配置
以前我都是在Eclipse上面和arm-none-eabi交叉编译环境来开发STM32应用程序的。 现在改用MDK-ARM比较专业的工具搭建一个开发环境。 新建一个指定STM32微控制器型号的工程: 为了生成编译文件,勾选如下复选框: 配置编译项: STM32F4XX, USE_STDPERIPH_DRIVER 添加库编译符号,和语言/代码生成级别 其中最关键的头文件包含目录: 首先要添加包含工程目录,因为固件库会查找 stm32f4xx_conf.h 配置头文件,中断服务例程实现文件可能也会调用main.h中的函数。 再添加包含 xxxySTM32F4_LibLibrariesCMSISIn
[单片机]
MDK-ARM(<font color='red'>Keil</font> uVision V4.72)上<font color='red'>STM32</font><font color='red'>开发</font>环境配置
Keil c51 U3字符显示错位问题的解决办法
相信很多人遇到多光标处显示的字符并不是正确的字符,可一直没有办法解决。 其实很简单,在Keil c目录下TOOLS.INI文件中第三行增加一条语句:ANSI=1就可以了。 看看我的这个配置文件内容: ORGANIZATION= HEYONG NAME= USER , wym ANSI=1(就加这一句) EMAIL= 498729914@qq.com BOOK0=UV3\RELEASE_NOTES.HTM( uVision Release Notes ,GEN) ARMSEL=1 PATH= c:\Keil\C51\ BOOK0=HLP\Release_Notes.htm( Release Notes ,GEN) BOOK1=
[单片机]
STM32开发板基础教程(七) - ADC with DMA
下面来讲一下STM32的ADC应用。 先闲扯一点其他事情,是我自己的理解。 STM32的优点在哪里? 除去宣传环节,细细分析。 STM32时钟不算快,72MHZ, 也不能扩展大容量的RAM FLASH, 同样没有DSP那样强大的指令集。 它的优势在哪里呢? ---就在快速采集数据,快速处理上。 ARM的特点就是方便。 这个快速采集,高性能的ADC就是一个很好的体现, 12位精度,最快1uS的转换速度,通常具备2个以上独立的ADC控制器, 这意味着, STM32可以同时对多个模拟量进行快速采集, 这个特性不是一般的MCU具有的。 以上高性能的ADC,配合相对比较块的指令集和一些特色的算法支持, 就构成了STM32在电机控制上的强大特
[单片机]
STM32高级开发(18)-使用VS Code搭建STM32开发环境
以前在伴随着开发平台的转换中,我尝试过各种各样的开发环境,而在最近一段时间的开发中我使用了Visual Studio Code来作为代码编辑器,其优异的工程管理,超快的启动速度,各种各样功能强大的插件,使我立刻爱上了这个文本编辑器。但是在开发中来来回回在编辑器和Keil等IDE之间来回切换对我造成了不少不方便,另外由于希望能够在windows下使用gcc工具链开发,所以我尝试使用插件来完整的在vscode上搭建了一个开发环境。可以说这是我在windows平台下尝试过的最好用的一种搭配,下面我就来详细讲述一下这个环境的搭建和基本使用方式。 ps:启动真心快,在win下优化程度堪比记事本. 安装软件 下载安装 Visual S
[单片机]
<font color='red'>STM32</font>高级<font color='red'>开发</font>(18)-使用VS Code搭建<font color='red'>STM32</font><font color='red'>开发</font>环境
[正点原子]STM32开发板F103 第41讲 RTC实时时钟备份区域BKP原理
RTC模块与 时钟配置系统在后备区域,在复位时候不会被清除(框图: 中文参考手册) 如何使用RTC实现时钟?RTCCLK RTC的时钟有几个来源有三种 32.768khz 8Mhz 40khz RTC_PRL是自动重装载寄存器 RTC_DIV 预分频余数寄存器 RTC_DIV的作用就是 可以提供一个更加精确的时钟, 时钟开启之后会给RTC_PRL写一个值(比如100),那么RTCCLK就会被 /100 之后得到 TR_CLK。 TR_CLK的一个周期有100个 RTCCLK ,RTC_DIV在你装载之后它的值就是100,他在 RTCCLK的控制下每一个时钟 减一, 假如RTCCLK=100hz,那么 RT
[单片机]
[正点原子]<font color='red'>STM32</font><font color='red'>开发</font>板F103 第41讲 RTC实时时钟备份区域BKP原理
STM32开发笔记91: SX1268驱动程序设计(发送模式)
单片机型号:STM32L053R8T6 本系列开发日志,将详述SX1268驱动程序的整个设计过程,本篇介绍发送模式的相关驱动程序。 一、TX模式 In TX mode after ramping-up the Power-Amplifier (PA) transmits the data buffer. In TX mode the circuit can operate in different sub-modes: single mode or single with timeout mode.(在TX模式下,功率放大器(PA)启动后便可以传输数据缓冲区中的数据。在TX模式下电路可以工作不同的子模式:单模式或单超时模式
[单片机]
<font color='red'>STM32</font><font color='red'>开发</font>笔记91: SX1268驱动程序设计(发送模式)
Keil软件的安装及Keil C51和Keil MDK兼容配置
最近很多学员碰到了一个keil安装的问题。 学习51单片机,用的是Keil C51版本开发,做STM32项目的时候,又要用KeIl MDK版本开发。 那如何配置,可以让C51和MDK 兼容呢? 首先我们,先了解一下 Keil C51 和Keil MDK的区别: Keil C51: 支持绝大部分8051内核的微控制器开发工具。 Keil MDK: MDK主要适用于ARM内核的单片机,支持ARM7,ARM9,Cortex-M4/M3/M1,Cortex-R0/R3/R4等,软件内的数据库包含了很多厂商的芯片。 Keil C51 和MDK是同一个公司开发的, 理论上它们不能相互兼容 。 不过, 我们无际单片机编程研究了一种方法,
[单片机]
MSP432(Keil5)——4.系统时钟频率修改及查看
本实验将给出系统时钟频率的查看方法,以及修改的方法。真正的想要了解这款单片机的时钟树还得自己去啃手册。 如何修改系统时钟频率 在system_msp4329401r.c文件中,在64~71行处,定义了一个宏,修改这个宏即可。 查看系统时钟频率 sys_fre.c #include sys_fre.h /*在此定义了一些时钟源频率变量,在main函数中声明并调用该函数查看频率*/ /*可通过调试查看*/ extern uint32_t aclk, mclk, smclk, hsmclk, bclk; //得到系统各时钟频率 void Get_Sys_Fre(void) { aclk = CS_getACLK(
[单片机]
MSP432(<font color='red'>Keil</font>5)——4.系统时钟频率修改及查看

推荐帖子

开发流程 是 巨大的无形资产
《成吉思汗法典》第五十六条写道:“草绿后挖坑致使草原被损坏的,失火致使草原被烧的,对全家处死刑。”这个保护了被战争蹂躏的草坪,保护了畜牧业,保留了生命力,保留了经济支柱。大汗他老人家,1、组建了世界上第一流强大的快速骑兵;2、第一个实现了全民皆兵;3、创建了世界上第一个炮兵部队;4、组建了世界第一个参谋部;5、世界上第一个发明了“闪电战”。大汗他老人家,也组建了世界上最好最快的通信兵--“箭速传骑”。这支通信兵训练有素,直接由成吉思汗四狗之一者勒蔑指挥,他们靠沿途设的驿站,
5525 FPGA/CPLD
电机控制视频
本人做的单相电机调速视频PID速度环误差小http://v.youku.com/v_show/id_XNjUxNTA5ODI0.html本人做的直流无刷电机220V控制视频http://v.youku.com/v_show/id_XODY0MzE4MDAw.html本人做的直流无刷电机220VSTM32控制视频http://v.youku.com/v_show/id_XMTU3ODE1Mjk4MA==.html本人做的单相电机调速视频PID速度环误差小http:/
jie888jie89 工控电子
如何用PIC单片机存储体0或1
PIC单片机中级产品PIC16C6X的数据存储器通常分为两个存储体,即存储体0(Bank0)和存储体1(Bank1)。每个存储体都是由专用寄存器和通用寄存器两部分组成的。两个存储体中的一些寄存器单元实际上是同一个寄存器单元,却又具备有不同的地址。例如本版介绍的PIC16F84的状态寄存器STATUS-Reg的两个地址是03H和83H。又如通用寄存器也是如此。  不同型号的PIC单片机,其数据存储器的组成(即功能)是不完全相同的,所以设计人员一旦选用了某个PIC单片机的型号后,常要查找该单片机的
rain Microchip MCU
【VisionFive 2:集成3D GPU RISC-V单板计算机】+02.CPU/DDR功能测试(zmj)
【VisionFive2:集成3DGPURISC-V单板计算机】+02.CPU/DDR功能测试(zmj)赛昉科技的昉星光2开发板采用昉惊鸿7110(JH7110)处理器,它是RISC-V四核,指令集ISA为64位RV64GCISASoC,并且搭载2MB的L2缓存和协处理器,工作频率最高可达1.5GHz(GPU是IMGBXE-4-32MC1,工作频率最高可达600MHz,本节内容不做展开)。系统内存配置为4GB-LPDDR4SDRAM,数据传输速率最高可达
卿小小 国产芯片交流
发布一个运行于 NXP LPC1768 的操作系统源码工程包。
源码工程包基于MDK5.17平台建立。发布一个运行于NXPLPC1768的操作系统源码工程包。接着发布支持任务抢占运行权的操作系统源码工程文件包,
sky9218 单片机
话说AVR的熔丝位是怎么个设置法呢?
我已经锁死了两块单片机了啊··话说AVR的熔丝位是怎么个设置法呢?太多了看手册主要是晶振问题原帖由jasminebilin于2011-10-1815:41发表我已经锁死了两块单片机了啊··只要SPIEN和JTAGEN没有被编程,那就不算锁死。SPIEN是使能ISP下载的,禁止后,不能通过ISP来下载程序。JTAGEN是JTAG使能的,禁止后,JTAG引脚当成IO来用,但是不能仿真。ISP方式下,有些下载器不支持自动降速,配制成内部1MHz时
jasminebilin Microchip MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved