Linux系统下速通stm32的clion开发环境配置

news2025/1/31 2:52:01

陆陆续续搞这个已经很久了。

因为自己新电脑是linux系统无法使用keil,一开始想使用vscode里的eide但感觉不太好用;后面想直接使用cudeide但又不想妥协,想趁着这个机会把linux上的其他单片机开发配置也搞明白;而且非常想搞懂cmake编译的一些原理,顺便可以看看bootloader的内容;并且厌倦了再用库函数的方式写hal库的代码,想更加专注于代码逻辑;

综上所述,其实是在强迫自己重新学一遍cortex-m3/m4这类单片机的基本原理和他们不同的烧录方式,并把一些基础概念过一遍,比如说mpu,mmu,mcu,soc的含义之类。

这篇文章大概是这个追根究底系列里的第一篇内容。


clion的下载

去官网下载即可,或者用命令行下载。

yay -S clion


openocd的下载

这是用来烧录的

yay -S openocd


STM32cubemx的下载

当然是去官网下载,但是yay库其实真的很包罗万象,也可以用命令行下载

yay -S stm32cubemx


GCC编译器与工具链的下载

 绝对不可以使用自带的x86 gcc工具链编译stm32工程,交叉编译时也需要再设置一下CMakeLists.txt,否则会出现如下问题:

cc: 警告:已弃用‘-mcpu=’;请改用‘]8;;https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/x86-Options.html#index-mtune-17-mtune=]8;;’或‘]8;;https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/x86-Options.html#index-march-16-march=]8;;’
cc: 错误:unrecognized command-line option ‘-mthumb’
cc: 错误:unrecognized command-line option ‘-mthumb-interwork’
make[2]: *** [CMakeFiles/stm32project1.elf.dir/build.make:79:CMakeFiles/stm32project1.elf.dir/Core/Src/can.c.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:87:CMakeFiles/stm32project1.elf.dir/all] 错误 2
make: *** 

如果使用x86的gcc编译器完成交叉编译,会发现即使所有都设置好了,也会出现上述报错。

所以,需要下载arm-none-eabi-bin或者到官方网站下载工具链,版本是14.2.1。

sudo pacman -S gcc-arm-none-eabi-bin

sudo vim /etc/profile

在这个文件的最后添加环境变量,确保系统可以找到新下载的工具链。/usr/arm-none-eabi/bin是安装的工具链的目录,可以改成自己安装的目录。

export PATH=$PATH:/usr/arm-none-eabi/bin

之后验证一下,确保自己已经安装上了

 如果出现arch什么的,说明这并不是arm的工具链,需要重新下载。


 创建工程

 打开clion,新建一个项目,这里可以直接新建关于cubemx的新项目

 

 这个项目的mcu是固定的,改不了,所以我们需要在弹出的窗口内新建一个cubemx项目,并在配置完之后覆盖保存project,需要注意这里面project名字要和一开始一致。我这里新建了一个f407vet6的项目。

 

 

之后就是配置并生成代码了,这里要按照cubeide的方式生成代码。

 

我自己更喜欢设置分别生成代码,而不是把代码堆在同一个文件里 。


编译配置

打开file-setting-toolchain,新建一个设置,这是我的相关设置:

这个构建工具可以选择make或ninja(如果什么都没有设置就会自动选择ninja),最终都是使用cmake完成整个构建过程。

其实使用ninja也可以顺利生成工程文件和build.ninja,但是cubemx会自动生成一个makefile文件。我认为使用unix makefile的方式调试和构建会更好。

点开下面cmake选项卡,设置相同的工具链和生成器。

理论来说,到这步直接运行编译,应该是没有什么问题的。cubemx自己生成的cmakelist.txt和makefile也一切正常,但如果还会出现

cc: 警告:已弃用‘-mcpu=’;请改用‘]8;;https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/x86-Options.html#index-mtune-17-mtune=]8;;’或‘]8;;https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/x86-Options.html#index-march-16-march=]8;;’
cc: 错误:unrecognized command-line option ‘-mthumb’
cc: 错误:unrecognized command-line option ‘-mthumb-interwork’
make[2]: *** [CMakeFiles/stm32project1.elf.dir/build.make:79:CMakeFiles/stm32project1.elf.dir/Core/Src/can.c.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:87:CMakeFiles/stm32project1.elf.dir/all] 错误 2
make: *** 

这个问题,说明交叉编译失败,默认使用的还是x86的gcc编译器。可以通过改cmakelist.txt强行让他使用arm工具链。

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR arm)
cmake_minimum_required(VERSION 3.29)

# specify cross-compilers and tools
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER  arm-none-eabi-gcc)
set(CMAKE_AR arm-none-eabi-ar)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(SIZE arm-none-eabi-size)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
set(CMAKE_C_FLAGS "-mcpu=cortex-m4 -mthumb")
# project settings
project(stm32project1 C CXX ASM)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)

注意不要运行makefile,而是运行OCD project,需要改一下调试配置如下图,让他生成elf文件,先编译,再运行,最后调试。

可以改面板配置文件,我这里的配置文件是示例的配置文件。

更新cubemx工程,更新cmake(这俩功能在工具-cmake选项里)

重新编译,结果如下,hex文件可以用于烧录:


这几天一直使用远程控制电脑的方式,完成编译配置并写出这篇文章,体验感很好。

远程控制电脑的配置文章在这里:

如何在linux系统上完成定时开机和更新github端口的任务-CSDN博客


 


问题集锦:

1. 发现cubemx生成代码后没有driver文件夹

cubemx未下载资源包

需要打开help-embedded software package manager并下载相关资源包

 看一下生成文件夹:

2. 怎么快速把linux上写的项目环境搬运到win系统

当然不是通过ioc文件重新生成keil环境代码()

使用cubeide就可以了,下载最新版的,然后在里面加载project文件

记得设置生成hex文件,默认只生成elf文件

我目前有点嫌费劲,暂时使用flymcu烧录hex文件,今天就会配置使用软件烧录的方式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCSG月度更新2025.1

1月的OpenCSG取得了一些亮眼的成绩 在2025年1月,OpenCSG在产品和社区方面继续取得了显著进展。产品方面,推出了AutoHub浏览器自动化助手,帮助用户提升浏览体验;CSGHub企业版功能全面升级,现已开放试用申请&#xff0c…

AWTK 骨骼动画控件发布

Spine 是一款广泛使用的 2D 骨骼动画工具,专为游戏开发和动态图形设计设计。它通过基于骨骼的动画系统,帮助开发者创建流畅、高效的角色动画。本项目是基于 Spine 实现的 AWTK 骨骼动画控件。 代码:https://gitee.com/zlgopen/awtk-widget-s…

go到底是什么意思:对go的猜测或断言

go这个单词,简单地讲,表示“走或去”的意思: go v.去;走 认真想想,go是一个非常神秘的单词,g-和o-这两个字母,为什么就会表达“去;走”的意思呢?它的字面义或本质&…

学习数据结构(2)空间复杂度+顺序表

1.空间复杂度 (1)概念 空间复杂度也是一个数学表达式,表示一个算法在运行过程中根据算法的需要额外临时开辟的空间。 空间复杂度不是指程序占用了多少bytes的空间,因为常规情况每个对象大小差异不会很大,所以空间复杂…

DeepSeek--通向通用人工智能的深度探索者

一、词源与全称 “DeepSeek"由"Deep”(深度)与"Seek"(探索)组合而成,中文译名为"深度求索"。其全称为"深度求索人工智能基础技术研究有限公司",英文对应"De…

Unity游戏(Assault空对地打击)开发(1) 创建项目和选择插件

目录 前言 创建项目 插件导入 地形插件 前言 这是游戏开发第一篇,进行开发准备。 创作不易,欢迎支持。 我的编辑器布局是【Tall】,建议调整为该布局,如下。 创建项目 首先创建一个项目,过程略,名字请勿…

(三)Session和Cookie讲解

目录 一、前备知识点 (1)静态网页 (2)动态网页 (3)无状态HTTP 二、Session和Cookie 三、Session 四、Cookie (1)维持过程 (2)结构 正式开始说 Sessi…

1.Template Method 模式

模式定义 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method 使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特…

【PyTorch】5.张量索引操作

目录 1. 简单行、列索引 2. 列表索引 3. 范围索引 4. 布尔索引 5. 多维索引 个人主页:Icomi 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为…

[EAI-023] FAST: Efficient Action Tokenization for Vision-Language-Action Models

Paper Card 论文标题:FAST: Efficient Action Tokenization for Vision-Language-Action Models 论文作者:Karl Pertsch, Kyle Stachowicz, Brian Ichter, Danny Driess, Suraj Nair, Quan Vuong, Oier Mees, Chelsea Finn, Sergey Levine 论文链接&…

2025年AI手机集中上市,三星Galaxy S25系列上市

2025年被认为是AI手机集中爆发的一年,各大厂商都会推出搭载人工智能的智能手机。三星Galaxy S25系列全球上市了。 三星Galaxy S25系列包含S25、S25和S25 Ultra三款机型,起售价为800美元(约合人民币5800元)。全系搭载骁龙8 Elite芯…

在虚拟机里运行frida-server以实现对虚拟机目标软件的监测和修改参数(一)(android Google Api 35高版本版)

frida-server下载路径 我这里选择较高版本的frida-server-16.6.6-android-x86_64 以root身份启动adb 或 直接在android studio中打开 adb root 如果使用android studio打开的话,最好选择google api的虚拟机,默认以root模式开启 跳转到下载的frida-se…

如何实现滑动删除功能

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了GestureDetector Widget相关的内容,本章回中将介绍Dismissible Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的Dismissible是一个事件响应Widget,它和GestureDetector类…

golang通过AutoMigrate方法自动创建table详解

一.AutoMigrate介绍 1.介绍 在 Go 语言中,GORM支持Migration特性,支持根据Go Struct结构自动生成对应的表结构,使用 GORM ORM 库的 AutoMigrate 方法可以自动创建数据库表,确保数据库结构与定义的模型结构一致。AutoMigrate 方法非常方便&am…

JAVA:利用 Content Negotiation 实现多样式响应格式的技术指南

1、简述 Content Negotiation(内容协商) 是 RESTful 服务的重要特性,允许客户端和服务器根据请求的不同特性动态选择适合的响应格式。它是一种在 HTTP 协议中实现的机制,通过它,服务器能够根据客户端需求返回适合的内…

Effective Objective-C 2.0 读书笔记—— objc_msgSend

Effective Objective-C 2.0 读书笔记—— objc_msgSend 文章目录 Effective Objective-C 2.0 读书笔记—— objc_msgSend引入——静态绑定和动态绑定OC之中动态绑定的实现方法签名方法列表 其他方法objc_msgSend_stretobjc_msgSend_fpretobjc_msgSendSuper 尾调用优化总结参考文…

使用EVE-NG-锐捷实现OSPF

一、OSPF基础知识 Open shortest Path First(OSPF)开放式最短路径优先协议 1.OSPF的关系状态 (1)邻居关系(TWO-WAY) 只发送hello包不发送LSA包(链路状态通告包) (2)邻接关系(FULL) OSPF设备与设备之间相互建立OSPF关系,初始为邻居关系(TWO-WAY)状态&#xff0…

Baklib赋能下的内容中台智能化推荐系统解析与展望

内容概要 在数字化时代,内容中台的智能化推荐系统正逐渐成为各类企业提升用户体验与运营效率的重要工具。该系统通过集成和分析大量用户数据及内容信息,能够实现精准的个性化推荐,为用户提供最相关的内容。 以下是内容中台智能化推荐系统的…

2024年记 | 凛冬将至

放弃幻想,准备斗争! 考研or就业? 上大学以来,考研上名校在我的心里一直是一颗种子,2024年初,当时的想法是考研和就业两手抓。买了张宇的高数现代,想要死磕! 也记了挺多笔记... 如果…

数据分析系列--②RapidMiner导入数据和存储过程

一、下载数据 点击下载AssociationAnalysisData.xlsx数据集 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从本地选择.csv或.xlsx 三、界面说明 四、存储过程 将刚刚新建的过程存储到本地 Congratulations, you are done.