CLion + STM32環境配置,親測有效(2025.06.19記)

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&#…