STM32CubeIDE 创建 / 导入 .c / .h 文件

目录

CubeMX创建工程

项目管理

将CubeMX创建的工程导入到CubeIDE

创建用于演示的ADD.c文件和ADD.h文件

方式一:在IDE的项目浏览器内创建

方式二:在文件窗口处创建 / 从其他地方复制粘贴过来

将ADD.h添加到头文件搜索路径

将ADD.c添加到源文件搜索路径

在ADD.c文件内定义一个加法函数,在ADD.h文件声明这个函数,在main.c调用这个函数,构建项目,如果构建没有问题,就说明我们成功了

相对路径、绝对路径的优缺点


我们将会按照以下步骤进行操作

  • 在CubeMX创建一个最简单的工程
  • 将CubeMX创建的工程导入到CubeIDE
  • 创建用于演示的ADD.c文件和ADD.h文件
  • 将ADD.h添加到头文件搜索路径
  • 将ADD.c添加到源文件搜索路径
  • 在ADD.c文件内定义一个加法函数,在ADD.h文件声明这个函数,在main.c调用这个函数,构建项目,如果构建没有问题,就说明我们成功了

CubeMX创建工程

打开CubeMX,点击Help -> Updater Settings,弹出一个页面,页面中有一个内容,Firmware Repository(固件储藏室),就是用于管理固件包的下载路径的。需要注意,路径不可以带有汉字和空格。

点击Help -> Manage embedded software packages,弹出一个页面,在这里可以管理固件包以及下载固件包。

弄好上面的设置之后,点击主界面上的ACCESS TO MCU SELECTOR。

在1处输入你的芯片型号,在2处选择具体的型号,选好后,点击3处,开始创建工程。

然后就是下面的界面了。

由于我们这个项目只是用于演示,如何使用CubeMX并不是我们的重点,所以我使用CubeMX配置MCU会比较简单

按照下图进行操作,激活HSE的外部晶振设置

按照下图进行操作,配置好时钟树,注意输入正确的外部晶振频率

按照下图进行操作,激活调试接口,将其设置为SWD调试

此时芯片已经可以运行了,但是为了让这个工程不那么“虚”,就设置两个GPIO吧。

在引脚视图上,将PF9和PF10的引脚功能设置为GPIO_Output

按照下图进行操作,设置一下GPIO的输出电平以及用户标签。

现在就配置好芯片了。

项目管理

下一步进行生成项目管理。

我的项目框架的生成路径是单独的一个文件夹,你也可以将路径设置为CubeIDE的Workspace,只是我习惯这样。

这样,我们就成功使用CubeMX创建了一个项目框架了。


将CubeMX创建的工程导入到CubeIDE

说明:在下面,项目 == 工程

这个时候我们已经有一个工程了。将工程复制一份到CubeIDE的工作空间(Workspace)。

将工程导入到IDE:

  • 方法一:打开CubeIDE,点击CubeIDE左上角的File -> Open projects from file system,点击Direction,选中工作空间下想要导入的工程文件夹,最后点击 Finish。
  • 方法二:在工作空间文件夹内,打开项目文件夹,打开.project文件,或者打开.cproject文件。

导入成功后,构建一下,没有问题。

下图中,左边是IDE里面项目浏览器看到的工程目录,右边是工作空间下工程文件内的工程目录。

我的工作空间路径:E:\STM32Cube\STM32CubeIDE_Workspace

我的工程路径:        E:\STM32Cube\STM32CubeIDE_Workspace\test20231005


创建用于演示的ADD.c文件和ADD.h文件

接下来,我将会在工程内创建一个ADD文件夹,并在这个文件夹内创建ADD.c文件和ADD.h文件

创建文件夹和文件有两种方式:

方式一:在IDE的项目浏览器内创建

 在IDE的项目浏览器处,选中工程,右键,点击 “NEW” ,就可以看到上面的东西了。

点击 “File” 或者 “File from Template” 或者 “Folder” ,会弹出如下图所示的界面,可以设置文件夹、文件创建的位置以及名称。

“File” 和 “File from Template” 本质上是一样的,只是后者有个模板。

创建完成后,就可以在项目浏览器处看到文件夹,以及文件夹下的文件了。

使用头文件模板创建出来的.h文件,如图。


方式二:在文件窗口处创建 / 从其他地方复制粘贴过来

在工作空间下,工程文件内,在文件窗口处创建一个文件夹,命名为ADD。打开ADD,在这个文件夹内创建ADD.c和ADD.h这两个文件。在新建那里是找不到 .c 和 .h 的,可以创建文本文档文件(.txt文件),然后修改其文件后缀名。

如果看不到文件后缀名,可以点击文件夹上方的“查看”,然后勾选“文件扩展名”,这样就可以看到文件的后缀名了。

在文件窗口处创建文件夹和文件,或者你的文件夹和文件是从别处复制粘贴过来的,那么,IDE的项目浏览器并不会马上显示刚刚创建的文件夹和文件。这个时候需要在IDE的项目浏览器处右键,点击“Reflash”刷新,或者构建项目,就可以在项目浏览器处看到刚刚创建的文件夹和文件了。

现在我们在IDE的项目浏览器处可以看到我们创建的文件夹和文件,但是工程还没有包含他们的搜索路径。

如果我们现在在main.c里include了ADD.h,然后构建/编译,是会出错的,提示找不到文件。如下图所示。


将ADD.h添加到头文件搜索路径

 点击Project -> Properties(属性)

点击C/C++ General->Paths and Sybols

出现如图界面,中间部分的内容为已经包含的头文件路径。

目前来说,这些路径都是相对路径,基地址是工程路径

点击Add,出现如图界面。

想要把ADD文件夹添加进头文件搜索路径,有三种方式。

  • 方式一:在输入框A内输入ADD,点击OK。这种方式添加的是相对于工程路径的相对路径。
  • 方式二:点击Workspace,找到ADD,点击OK。这种方式添加的是相对于工作空间路径的相对路径。用这种方式时,Is a workspace path 这个选项需要被勾选上,如果没有勾选上,就是相对于工程路径的相对路径,构建/编译会出错。
  • 方式三:点击File system,找到ADD,点击OK。这种方式添加的是绝对路径

文章的末尾有相对路径、绝对路径的优缺点(来自GPT)

我这里添加的是相对于工作空间路径的相对路径

图中所示的是相对于工作空间路径的相对路径。

如果添加错了,可以选中想要删除的路径,点击Delete来把路径删除掉

记得点击Apply保存。


将ADD.c添加到源文件搜索路径

点击Source Location -> Add Folder,选中ADD文件夹内,OK,Apply即可。

记得点击Apply保存。

Add Folder 与 Link Folder 的区别:

Add Folder:add(添加)工程内部的文件夹

Link Folder:link(引用)工程外部的文件夹

添加成功后:


在ADD.c文件内定义一个加法函数,在ADD.h文件声明这个函数,在main.c调用这个函数,构建项目,如果构建没有问题,就说明我们成功了

ADD.c

ADD.h

不知道为什么,如果不包含<stdint.h>,就会报错,错误提示如下

unknown type name 'uint32_t'

包含<stdint.h>就没事了,以前我不包含也不会报错的(有朋友知道为什么的话,欢迎在评论区告诉我,非常感谢)

main.c

头文件的包含

函数的调用

有一个警告,警告提示是我们定义的Result没有被使用。无关紧要。

现在,我们已经成功包含了.c/.h的搜索路径并验证。

如果还有什么疑问,欢迎评论区留言。


相对路径、绝对路径的优缺点

(来自GPT)

相对路径的优点:

1.简洁性:相对路径是相对于当前工作目录或者源文件所在目录进行解析,可以使用相对较短的路径来指定头文件的位置。

2.可移植性:相对路径相对于当前环境的目录结构,当项目移植到其他位置或其他机器时,相对路径可能更容易适应新的工作环境。

相对路径的缺点:

1.可靠性:相对路径可能依赖于文件结构和工作目录的变化,如果文件结构发生改变,那么相对路径可能无法正确找到头文件,导致编译错误。

2.可读性:相对路径可能不够明确,他人难以迅速理解头文件的具体位置。

绝对路径的优点:

1.精确性:绝对路径表明了头文件的确切位置,不受工作目录和文件结构的影响。无论当前工作目录在何处,都能准确找到头文件。

2.可读性:绝对路径提供了清晰明确的信息,他人易于理解和追踪头文件的位置。

绝对路径的缺点:

1.不够灵活:绝对路径是固定的路径,如果项目需要移植到其他位置或其他机器上,就需要手动更改绝对路径设置。

2.冗长性:绝对路径通常比较长,使用起来可能不太方便,尤其是在大型项目中含有多个嵌套文件夹的情况下。

在项目开发过程中,相对路径通常是更常见和推荐的选择,因为它具有简洁性和可移植性,可以更好地适应不同环境和项目结构的变化。

但在某些情况下,使用绝对路径可能更合适,特别是当项目的文件结构较为固定,或者需要确保代码在不同环境中都能准确找到头文件时。

无论使用哪种路径,都要确保代码的可读性和可维护性,并避免出现头文件路径错误导致的编译问题。


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

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

相关文章

电脑找不到xinput1_3.dll怎么修复,快速处理dll问题的5个方法分享

在使用电脑的过程中&#xff0c;我们常常会遇到一些常见的问题&#xff0c;其中之一就是“电脑缺少xinput1_3.dll”。这个问题可能会影响到我们对电脑的使用体验&#xff0c;甚至导致某些软件无法正常运行。在我遇到这个问题并解决之后&#xff0c;我深刻地体会到了解决问题的重…

redis运维(十七)事务

一 redis事务 事务核心参考 ① 基础概念 1、场景引入核心&#xff1a;通过现象思考原因? 2、事务的概念 3、事务四大特性说明&#xff1a; redis只具备部分特性 重点1&#xff1a; 原子性和一致性 重点2&#xff1a; 隔离性和持久性 ② redis的事务 1、基础铺垫备注&…

王道p150 20.将给定的表达式树转化为等价的中缀表达式(通过括号反应操作符的计算次序)

本题代码如下 void btreetoexp(tree t, char deep) {if (t NULL)return;else if (t->lchild NULL && t->rchild NULL)printf("%c", t->data);//输出操作数&#xff0c;不加括号else {if (deep > 1)printf("(");btreetoexp(t->l…

『 C++类与对象 』多态之单继承与多继承的虚函数表

文章目录 &#x1fae7; 前言&#x1fae7; 查看虚表&#x1fae7; 单继承下的虚函数表&#x1fae7; 多继承下的虚函数表 &#x1fae7; 前言 多态是一种基于继承关系的语法,既然涉及到继承,而继承的方式有多种: 单继承多继承棱形继承棱形虚拟继承 不同的继承方式其虚表的形…

外部网关协议_边界网关协议BGP

一.边界网关协议BGP的基本概念 边界网关协议(Border Gateway Protocol&#xff0c;BGP&#xff09;属于外部网关协议EGP这个类别&#xff0c;用于自治系统AS之间的路由选择协议。由于在不同AS内度量路由的“代价”(距离、带宽、费用等&#xff09;可能不同&#xff0c;因此对于…

qml ParticleSystem3D使用介绍

在 Qt Quick 3D 中,ParticleSystem3D 是用来创建和控制3D粒子系统的元素。粒子系统是图形编程中用于模拟液体、烟雾、火、星空等现象的技术,它通过生成大量小粒子来模拟这些效果。ParticleSystem3D 提供了一个框架,允许开发者定义粒子的各种属性,如生命周期、速度、颜色、大…

连接的原理(待修改)

搞数据库⼀个避不开的概念就是Join&#xff0c;翻译成中⽂就是连接。 相信很多⼩伙伴在初学连接的时候有些⼀脸懵逼&#xff0c;理解了连接的语义之后⼜可能不明⽩各个表中的记 录到底是怎么连起来的&#xff0c;以⾄于在使⽤的时候常常陷⼊下边两种误区&#xff1a; 误区⼀&…

C++初阶 类和对象(上)

前言&#xff1a;C初阶系列&#xff0c;每一期博主都会使用简单朴素的语言将对应的知识分享给大家&#xff0c;争取让所有人都可以听懂&#xff0c;C初阶系列会持续更新&#xff0c;上学期间将不定时更新&#xff0c;但总会更的 目录 一、什么是面向对象编程 二、什么是类和如…

Python 十五个炫酷代码

1 炫酷彩虹 视频是动态的&#xff0c;不信你运行试试。 from turtle import *colors ["red", "yellow", "blue", "lime"] bgcolor("black")x 6 t [Turtle(), Turtle()]for index, i in enumerate(t):i.speed(0)i.color(&…

【排序算法】希尔排序(C语言)

【排序算法】—— 希尔排序 目录 一、希尔排序原理1. 插入排序的问题2. 希尔排序的思路 二、希尔排序的相关问题1. 为什么插入排序那么多但效率却很高2. 如何选择希尔增量 三、代码实现1. 代码实现思路2. 实现代码 希尔排序是对直接插入排序的优化&#xff0c;在学习之前&…

C++ 之命名空间namespace【详解】

文章目录 一&#xff0c;命名空间出现的意义二&#xff0c;命名空间的定义命名空间里面可以包含变量&#xff0c;函数&#xff0c;类型&#xff1a;命名空间不可以定义在局部作用域&#xff1a;命名空间可以嵌套&#xff1a; 三&#xff0c;同一个工程中允许存在多个相同名称的…

Axios 通过a标签下载文件 跨域下载

<!-- a标签占位 --><a ref"down" ></a>getTest() {this.$axios.request({url: https://cnv13.55.la/download?file_key3695fa9461a0ae59cf3148581e4fe339&handle_typeexcel2pdf,method: get,responseType: blob, // 切记类型 blob}).then(re…