CLion + STM32环境配置

遇到的问题描述:

> "moniton" command not supported by this target. 
> You can't do that when your target is exec 
> 上传完成,但存在问题 
> monitor reset 
> "monitor" command not supported by this target.

在这里插入图片描述

GitHub链接

首先感谢偶像稚晖君

稚晖君大神配置Clion的教程:https://zhuanlan.zhihu.com/p/145801160

我在进行配置的时候遇到了一些问题,以下是我的修改版本:

前面的的可以参照稚晖君大神的配置也可以不安装MinGW,直接使用STM32CubeCLT,这里面是STM官方给我们配置好的各种编译环境

可以不安装MinGW,直接使用STM32CubeCLT相对容易一些

可以不安装MinGW,直接使用STM32CubeCLT相对容易一些

可以不安装MinGW,直接使用STM32CubeCLT相对容易一些

我的环境

CLion 2024.1

OpenOCD-20240916-0.12.0

STM32CubeCLT_1.18.0

相关资源在source文件夹内

GitHub上传大文件有点麻烦,给一个迅雷的下载链接:https://pan.xunlei.com/s/VOT6D5Qu-LTGNvuMcZoCLACRA1?pwd=iykg#
复制这段内容后打开迅雷,查看更方便

在这里插入图片描述

如果网盘下载的慢的话也可以直接去对应官网下载软件

OpenOCD-20240916-0.12.0版本的下载链接:https://www.st.com/en/development-tools/stm32cubeclt.html

STM32CubeCLT_1.18.0版本的下载链接:https://sysprogs.com/getfile/2285/openocd-20240916.7z

Clion2024.1版本的下载链接:https://download.jetbrains.com/cpp/CLion-2024.1.6.exe

STM32CubeMX 下载链接:https://www.st.com/en/development-tools/stm32cubemx.html

我的配置相设置如下

编译工具链

在这里插入图片描述

Cmake

在这里插入图片描述

嵌入式开发设置

在这里插入图片描述

运行调试配置

在这里插入图片描述

编译错误问题

  1. 如果移动了工程文件夹的话,最好打开.ioc文件重新Generate一下再编译,可以解决很多错误。
  2. 遇到任何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里面包含的是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 "main.h"
#include "usart.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);#endif //#ifndef _RETARGET_H__

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

#include <_ansi.h>
#include <_syslist.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/times.h>
#include "retarget.h"
#include <stdint.h>#if !defined(OS_USE_SEMIHOSTING)#define STDIN_FILENO  0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2UART_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;elsereturn 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;elsereturn 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);

然后就可以愉快地使用printfscanf啦:

char buf[100];printf("\r\nYour name: ");
scanf("%s", buf);
printf("\r\nHello, %s!\r\n", buf);

步骤二:

上面的修改完成之后可能会发现无法正常读取浮点数,这里修改CMakeList.txt,加入下述编译选项

set(COMMON_FLAGS "-specs=nosys.specs -specs=nano.specs -u _printf_float -u _scanf_float")name: ");
scanf("%s", buf);
printf("\r\nHello, %s!\r\n", buf);

步骤二:

上面的修改完成之后可能会发现无法正常读取浮点数,这里修改CMakeList.txt,加入下述编译选项

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910184.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910184.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910184.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

借助ChatGPT快速开发图片转PDF的Python工具

一、开发背景与适用场景 随着数字文档处理需求的激增&#xff0c;图片转PDF的需求日益广泛。从学生提交图像化作业&#xff0c;到教师整合扫描试卷等资料&#xff0c;再到行政人员归档证件照片&#xff0c;工作中的方方面面都离不开图片的处理。如何高效、批量地将多个图片文件…

SuGAR代码精简解读

目录 一、全流程训练脚本 train_full_pipeline.py 二、核心训练逻辑 train.py 粗优化 (coarse_density_and_dn_consistency.py) 网格提取 (extract_mesh_from_coarse_sugar) 精优化 (refined_training) 两次优化&#xff08;粗优化和精优化&#xff09;中使用的损失函数及…

大模型安全关键技术研究

​ 引言 随着人工智能技术的迅猛发展&#xff0c;大模型已成为推动各行业变革的核心力量。从智能客服、医疗影像识别到金融风险预测&#xff0c;大模型的应用场景不断拓展&#xff0c;深刻改变着人们的生产生活方式。大模型已经转变为AI领域的基础设施&#xff0c;为解决各种…

java面试题04成员变量和局部变量的区别

成员变量(Member Variable)和局部变量(Local Variable)是面向对象编程中两种作用域和生命周期不同的变量,主要区别体现在以下几个方面: 1. 声明位置 成员变量: 声明在类内部、方法/构造器/代码块外部。 例如: public class Person {// 成员变量(实例变量)private Str…

升级到 .NET 9 分步指南

随着激动人心的 .Net 9 更新正式发布&#xff0c;漫长的等待终于结束了。它带来了一些令人惊叹的特性&#xff0c;例如改进的 LINQ 功能、HybridCache 等等。此外&#xff0c;凭借其卓越的性能提升、更佳的安全性、更完善的协议和更易维护的特性&#xff0c;它必将吸引开发者和…

day30打卡

# 导入模块 import math print("方式1&#xff1a;使用 import math") print(f"圆周率π的值&#xff1a;{math.pi}") print(f"2的平方根&#xff1a;{math.sqrt(2)}\n") # 导入特定项 from math import pi, sqrt print("方式2&#…

优化数据库查询

优化数据库查询 在实际开发中,数据库查询的性能直接关系到系统响应速度和用户体验。尤其在高并发环境下,低效的SQL语句会成为瓶颈,导致系统负载升高,甚至引发宕机。因此,查询优化是数据库性能优化中最为关键的一环。 为了系统性地理解数据库查询优化策略,本节将从SQL语…

【LeetCode#第198题】打家劫舍(一维dp)

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#…

微前端MFE:(React 与 Angular)框架之间的通信方式

在 微前端&#xff08;MFE, Micro Frontends&#xff09; 中使用 CustomEvent 是非常常见的&#xff0c;尤其是在不同子应用&#xff08;Micro Apps&#xff09;之间通信的时候。今天将以React 主应用 ↔ Angular 子应用 之间的通信进行示例 React 主应用 <-> Angular 子…

408考研逐题详解:2010年第1题——理解栈的基本操作

2010年第1题 若元素 a&#xff0c;b&#xff0c;c&#xff0c;d&#xff0c;e&#xff0c;f 依次进栈&#xff0c;允许进栈、退栈操作交替进行&#xff0c;但不允许连续三次进行退栈操作&#xff0c;则不可能得到的出栈序列是&#xff08; &#xff09; A. dcebfa \qquad B.…

python追加合并excel效率记录

第一种合并方法&#xff1a; 在sheet的第一行&#xff0c;追加新表concat旧表 read_excel读取旧表全部 to_excel新表追加写入旧表 需要的时间&#xff1a; 第二种合并方法&#xff1a; 在sheet的最后一行&#xff0c;直接追加新表 load_book只读用来获取旧表sheet行数 read_ex…

公钥加密与签名算法计算详解(含计算题例子)

一、RSA 加密算法 密钥生成&#xff1a; 选两个大素数 p 和 q计算 n p q计算 φ(n) (p-1)(q-1)选整数 e 满足 1 < e < φ(n) 且 gcd(e, φ(n)) 1计算 d 满足 d e ≡ 1 mod φ(n) 公钥&#xff1a;(e, n) 私钥&#xff1a;(d, n) 加密&#xff1a; c ≡ mᵉ mod…

63 网络交互的过程中目标设备的选择

前言 这里主要是 调研一下 发送网络数据包的过程中 选择网络设备 比如 向本机发送信息, 走的是 lo 向局域网其他主机发送信息, 走无线网卡 或者 有线网卡 基于 linux 的调试 这里主要是基于 ping 192.168.1.2 的调试 skb->dev 的初始化是在 skb->_skb_refdst 初…

DE2-115板子上用 Verilog编程实现一个分秒计数器

一、实验目的 掌握 Verilog 语言在硬件描述中的应用&#xff0c;通过编程实现分秒计数器的逻辑功能。 学习并实践按键消抖的原理与实现方法&#xff0c;提升对硬件电路中信号处理的理解。 熟悉在 DE2-115 开发板上进行 Verilog 程序的开发、调试及下载验证流程&#xff0c;将…

R4 LSTM-火灾温度预测

import tensorflow as tf import pandas as pd import numpy as npgpus tf.config.list_physical_devices("GPU") if gpus:tf.config.experimental.set_memory_growth(gpus[0], True) #设置GPU显存用量按需使用tf.config.set_visible_devices([gpus[0]],&…

什么是跨域问题?后端如何解决跨域问题?

跨域问题是指浏览器为了安全&#xff0c;对不同域&#xff08;包含不同协议、不同端口或不同主机名&#xff09;的请求进行限制&#xff0c;从而导致请求无法正常访问后端接口。 跨域问题的产生源于浏览器的同源策略&#xff08;Same-Origin Policy&#xff09;&#xff0c;这…

vue | rollup 打包 | 配置 rollup.config.js 文件,更改 rollup的行为

原因&#xff1a;将入口文件 转为 esm 和 umd 两种格式&#xff0c;要配置 rollup Rollup 已内置到 vite 工具中&#xff0c; 命令行打包&#xff0c;参数多&#xff0c;麻烦——》解决&#xff1a;创建配置文件&#xff0c;js 写的&#xff0c;rollup.config.js 配置 rollup.…

服务器中物理处理器和逻辑处理器的区别?

在服务器或任何计算机系统中&#xff0c;**物理处理器&#xff08;Physical Processor&#xff09;和逻辑处理器&#xff08;Logical Processor&#xff09;**是两个不同的概念&#xff0c;它们分别代表了硬件层面和操作系统层面的处理能力。 物理处理器&#xff08;Physical P…

【Gin框架】中间件

1. 什么是中间件 (Middleware)&#xff1f; 在 Web 框架的语境下&#xff0c;中间件 (Middleware) 是一种可重用的软件组件或函数&#xff0c;它被设计用来在 HTTP 请求-响应生命周期中的特定点拦截和处理请求或响应。在 Gin 框架中&#xff0c;中间件特指符合 gin.HandlerFun…

STUN (Session Traversal Utilities for NAT) 服务器是一种网络协议

STUN (Session Traversal Utilities for NAT) 服务器是一种网络协议&#xff0c;主要用于帮助位于网络地址转换 (NAT) 设备&#xff08;如路由器&#xff09;后面的客户端发现自己的公共 IP 地址和端口号。这对于建立点对点 (P2P) 通信至关重要&#xff0c;尤其是在 VoIP&#…