首页 > 其他分享 >Clion+STM32配置环境

Clion+STM32配置环境

时间:2023-10-17 16:34:11浏览次数:35  
标签:FILENO int com 配置 STM32 fd include Clion

Clion+STM32配置环境

下载安装

下载Clion,具体步骤省略
https://www.jetbrains.com/clion/download/

Clion官方的教程网址如下

https://www.jetbrains.com/help/clion/embedded-development.html

需要下载的东西有openocd和GNU ARM工具链

openocd:https://gnutoolchains.com/arm-eabi/openocd/(最新版即可)

image-20230713195950638

GNU ARM工具链:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads(最新版即可)

image-20230713201216119

OpenOCD强烈建议安装在无空格,无特殊符号,尽可能简短的路径

安装后需要配置环境变量,版本号可能不一样(更别说yourpath了)别照抄

C:\yourpath\OpenOCD-20230202-0.12.0\bin
C:\yourpath\Arm GNU Toolchain arm-none-eabi\12.2 rel1\bin

假设你没有用过CubeMX,下载地址与推荐学习帖子:

https://www.st.com/en/development-tools/stm32cubemx.html#get-software

http://www.openedv.com/thread-309468-1-1.html

创建项目

项目路径和名字不要有空格,特殊符号,最好下划线也不要!!

先使用stm32Cubemx创建项目,在创建代码时需要选择STM32CubeIDE选项

image-20230521215546852

已经创建了项目的ico?(且要求ide没有选错)

直接在Clion内打开项目,选择打开ico文件,会自动识别为一个项目

板载文件.cfg配置,他给你推荐,你搜索对应的型号,大概就行(里面全部是开发板的cfg,然而我们大概率不是在用列表里的开发板),然后复制到项目中使用

image-20230522182207543

image-20230713203548566

OpenOCD在Clion的配置的话大概如图(大概只需要改一次)

image-20230713201503905

稍微提一下cmake语法问题

image-20230713202639850

这句话意思是索引在Startup,Src,Drivers下的所有文件夹里的所有文件,所以如果你添加了文件,显示找不到,请手动更新cmake

image-20230713202751582

cmake存在缓存,如果还是没刷出来可以考虑清缓存

image-20230713202829031

运行/调试配置要修改

image-20230713203710250

调试和运行的对象是这个图标的,别搞错了image-20230713203754169

其他

keil内的编译选项,宏定义在哪里添加

image-20230713203000117

在cmake中添加这句话,即定义DEBUG,USE_STDPERIPH_DRIVER等三个宏定义,类似的还有-O0等

printf怎么用

添加文件,记得自己改h7xx

retarget.h

#include "stm32H7xx_hal.h"
#include <sys/stat.h>
#include <stdio.h>

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);

retarget.c

#include <_ansi.h>
#include <_syslist.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/times.h>
#include <stdint.h>

#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)

main.c内

    RetargetInit(&huart1);

编译后提示重复函数名,需要自己屏蔽syscall的同名函数

对于浮点数打印,还有加一句cmake语句

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

标签:FILENO,int,com,配置,STM32,fd,include,Clion
From: https://www.cnblogs.com/xutongxin/p/17770058.html

相关文章

  • 静态路由原理与配置
    静态路由定义找寻数据传输的最佳路径路由表的形成1、直连网段:给端口配置IP地址后,路由器会自动将该端口的网段加入路由表(长在路由器自己身上的叫直连)2、手动配置手动添加路由信息单向 3、动态学习(动态路由)根据报文自动学习网段 查看路由表命令:displayIProuting......
  • ABP中关于Swagger的一些配置
    Abp集成Swagger官方文档,请参考SwaggerIntegrationAspNetCore配置Swagger,请参考Swashbuckle.AspNetCore本文的项目环境是AspNetCore6.0+Volo.Abp.Swashbuckle6.0.2Abp中默认的基础配置如下:publicoverridevoidConfigureServices(ServiceConfigurati......
  • MounRiver工程配置讲解总结
    MRS配置汇总:1.MounRiver工程配置讲解一(添加全局宏定义)2.MounRiver工程配置讲解二(将灰色库的文件参与或排除编译)3.MounRiver工程配置讲解三(打印转行符和浮点数)4.MounRiver工程配置讲解四(报警告thereisahole)5.MounRiver工程配置讲解五(const变量地址不在flash中)6.......
  • Linux MySQL8.1 二进制安装和配置
    下载bin文件https://dev.mysql.com/downloads/mysql/选择LinuxGeneric,下载对应的tar包解压tar包解压完成后,目录结构如下:lsbindocsincludelibLICENSEmanREADMEsharesupport-files每个目录的内容,官方文档有说明DirectoryContentsofDirectorybi......
  • VSCode 新手入门第二期 C/C++环境配置
    前言编译器由于VSCode不像VisualStudio和DEV,CodeBlocks一样自带编译器,所以说我们得自己安装编译器现在主流编译器有许多,我这边推荐TDM-GCC,因为后面还有图形化库要配编译器下载https://jmeubank.github.io/tdm-gcc/download/正常下载中间那个tdm64版本编译器安装选Creat......
  • EPLAN 符号库的配置
    问题描述EPLAN安装破解完成之后,初次打开报错,报错的内容包括找不到符号库以及插入符号显示符号数为0 ,经过梳理发现可能是符号库的配置有问题。解决过程1.建立默认文件夹在安装目录的Data文件夹下新建中文目录如图1所示。如果安装目录没有Data文件夹,手动创建一个,并在“符号......
  • Revit 二次开发 C# 添加配置 Add-In Manager
    第一步:安装SDK,在SDK目录下获取Add-InManager插件第二步:将Add-InManager文件夹整个拷贝到C:\ProgramData\Autodesk\Revit\Addins\2022目录下;(注意:不是Revit安装目录,而是Revit的ProgramData目录,默认:C:\ProgramData\Autodesk\Revit\Addins\2022)第三步:将Add-InManager目录下Auto......
  • C2000 系列DSP使用Syscfg配置CLB模块记录
    1.1、SysConfig配置1、在工程下新建一个syscfg文件。注意文件的后缀名是.syscfg,命名任意。这时候会弹出一个弹窗,点击yes将SysConfig添加到该工程的toolchain。2、可以看到工程下多了一个GeneratedSource,并且打开工程属性,Build下也新加了SysConfig......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系
    在WPF应用端开发,它的界面类似于Winform端,因此我们也需要对系统的菜单进行动态配置,这样才能把系统的功能弹性发挥到极致,通过动态菜单的配置方式,我们可以很容易的为系统新增所需的功能,通过权限分配的方式,可以更有效的管理系统的菜单分配到不同的角色用户,本篇随笔介绍在WPF应用端中实......
  • Windows Server 2016 Standard RemoteApp应用发布配置举例
    RemoteApp应用发布介绍RemoteApp是微软在WindowsServer2008之后,在其系统中集成的一项服务功能,用户可以通过远程桌面访问远端服务器的桌面与程序,客户端本机在无须安装操作系统与应用程序的情况下也能正常使用远端服务器发布的各种桌面与应用。而在Windows2016中RemoteApp已......