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

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

因为自己新电脑是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博客

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

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

相关文章

leetcode_3092. 最高频率的 ID

https://leetcode.cn/problems/most-frequent-ids/description/ 看到这个数据范围 最极端情况 如果nums全为一个数 并且数量取到最大 那么范围是10的10次方 需要longlong储存 这题主要运用了哈希表配合multiset实现 哈希表主要用作存储某个数的出现次数 mst则用于记录出现次…

【深度学习】 自动微分

自动微分 正如上节所说,求导是几乎所有深度学习优化算法的关键步骤。 虽然求导的计算很简单,只需要一些基本的微积分。 但对于复杂的模型,手工进行更新是一件很痛苦的事情(而且经常容易出错)。 深度学习框架通过自动…

如何把jupyter的一个.ipynb文件的多个单元格cell合并为1个cell

1 jupyter的一个.ipynb文件的多个单元格cell合并为1个cell 步骤 1:打开 your_notebook.ipynb 文件 启动 Jupyter Notebook。 导航到你的工作目录(例如 F:\main)。 打开 your_notebook.ipynb 文件。 步骤 2:选择所有单元格 点击…

集成Sleuth实现链路追踪

文章目录 1.新增sunrays-common-cloud模块1.在sunrays-framework下创建2.pom.xml3.查看是否被sunrays-framework管理 2.创建common-cloud-sleuth-starter1.目录结构2.pom.xml3.sunrays-dependencies指定cloud版本4.SleuthAutoConfiguration.java5.spring.factories 3.创建commo…

WPF基础 | 初探 WPF:理解其核心架构与开发环境搭建

WPF基础 | 初探 WPF:理解其核心架构与开发环境搭建 一、前言二、WPF 核心架构2.1 核心组件2.2 布局系统2.3 数据绑定机制2.4 事件处理机制 三、WPF 开发环境搭建3.1 安装 Visual Studio3.2 创建第一个 WPF 应用程序 结束语优质源码分享 WPF基础 | 初探 WPF&#xff…

字节跳动自研HTTP开源框架Hertz简介附使用示例

字节跳动自研 HTTP 框架 Hertz Hertz 是字节跳动自研的高性能 HTTP 框架,专为高并发、低延迟的场景设计。它基于 Go 语言开发,结合了字节跳动在微服务架构中的实践经验,旨在提供更高效的 HTTP 服务开发体验。 1. 背景介绍 随着字节跳动业务…

实战演示:利用ChatGPT高效撰写论文

在当今学术界,撰写论文是一项必不可少的技能。然而,许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是,人工智能的快速发展为我们提供了新的工具,其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…

在线可编辑Excel

1. Handsontable 特点: 提供了类似 Excel 的表格编辑体验,包括单元格样式、公式计算、数据验证等功能。 支持多种插件,如筛选、排序、合并单元格等。 轻量级且易于集成到现有项目中。 具备强大的自定义能力,可以调整外观和行为…

spring-springboot -springcloud

目录 spring: 动态代理: spring的生命周期(bean的生命周期): SpringMvc的生命周期: SpringBoot: 自动装配: 自动装配流程: Spring中常用的注解: Spring Boot中常用的注解: SpringCloud: 1. 注册中心: 2. gateway(网关): 3. Ribbon(负载均…

DAY9,递归实现计算 :1 + 1/3 - 1/5 + 1/7 - 1/9 + .... 1/n 的值

题目 用递归实现计算 :1 1/3 - 1/5 1/7 - 1/9 .... 1/n 的值,n通过键盘输入 思路 递进阶段:n、...... 、9、7、5、3、1 函数出口:递进到1 开始返回;函数返回值视为“总和” 回归阶段:对当前n取倒数;“总…

Formality:不可读(unread)的概念

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中有时会遇到不可读(unread)这个概念,本文就将对此…

【27】Word:徐雅雯-艺术史文章❗

目录 题目​ NO1.2 NO3 NO4 NO5 NO6.7 NO8.9 NO10.11 注意:修改样式的字体颜色/字号,若中英文一致,选择所有脚本。格式相似的文本→检查多选/漏选格式刷F4重复上一步操作请❗每一步检查和保存 题目 NO1.2 F12另存为布局→行号布局…

关于ARM和汇编语言

一图流 ARM 计算机组成 输入设备 输出设备 存储设备 运算器 控制器 处理器读取内存程序执行的过程 取指阶段:控制器器通过地址总线向存储器发送想要获取的指令的地址编号,存储器将指定的指令发送给处理器 译码阶段:控制器对指令进行分…

PyTorch使用教程(9)-使用profiler进行模型性能分析

1、简介 PyTorch Profiler是一个内置的性能分析工具,可以帮助开发者定位计算资源(如CPU、GPU)的瓶颈,从而更好地优化PyTorch程序。通过捕获和分析GPU的计算、内存和带宽利用情况,能够有效识别并解决性能瓶颈。 2、原…

2025-01-22 Unity Editor 1 —— MenuItem 入门

文章目录 1 Editor 文件夹2 MenuItem3 使用示例3.1 打开网址3.2 打开文件夹3.3 Menu Toggle3.4 Menu 代码复用3.5 MenuItem 激活与失活4 代码示例 1 Editor 文件夹 ​ Editor 文件夹是 Unity 中的特殊文件夹,Unity 中所有编辑器相关的脚本都需要放置在其中&#xf…

docker 安装 mysql 详解

在平常的开发工作中,我们经常需要用到 mysql 数据库。那么在docker容器中,应该怎么安装mysql数据库呢。简单来说,第一步:拉取镜像;第二步:创建挂载目录并设置 my.conf;第三步:启动容…

linux-samba服务配置与应用

1.了解samba的配置文件 2.熟悉samba服务的实例 以前我们在windows上共享文件的话,只需右击要共享的文件夹,然后选择共享相关的选项设置即可,然后如何实现windows和linux的文件共享呢,这就涉及到了samba服务,这个软件…

Spring Boot 整合 Redis 步骤详解

文章目录 1. 引言2. 添加依赖3. 配置 Redis 连接信息4. 创建 Redis 操作服务类5. 使用 RedisTemplate 或 ReactiveRedisTemplate6. 测试 Redis 功能7. 注意事项8. 总结 Redis 是一个高性能的键值存储系统,常用于缓存、消息队列等多种场景。将 Redis 与 Spring Boot …

缓存商品、购物车(day07)

缓存菜品 问题说明 问题说明:用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大。 结果: 系统响应慢、用户体验差 实现思路 通过Redis来缓存菜品数据,减少数据库查询…

K8S中Service详解(三)

HeadLiness类型的Service 在某些场景中,开发人员可能不想使用Service提供的负载均衡功能,而希望自己来控制负载均衡策略,针对这种情况,kubernetes提供了HeadLiness Service,这类Service不会分配Cluster IP,…