[STM32]从零开始的STM32标准库环境搭建(小白向)

news2024/9/20 0:40:46

一、我们为什么要搭建STM32标准库开发环境

        如果你对STM32有一定的了解,相信你已经认识了STM32的几种开发方式。基于STM32寄存器开发,基于ST官方的标准库开发,基于ST官方的HAL库开发。我们现在来了解一下这些库的优缺点。首先就是基于寄存器开发,这种开发方式类似于51单片机,这种开发方式也最为底层,执行效率也最快,但是STM32的寄存器数量不是51单片机能比的,你很有可能记不住那么多寄存器,在开发时你需要反复查询手册。其次就是标准库开发,我们最常用的时ST官方提供的标准库。虽说库的本质也是在操作寄存器,但是库将那些抽象的寄存器定义成我们能够看懂的字串,极大的提高了代码的阅读性和开发速度。比起寄存器开发,标准库由于是上层的封装,所以,它的执行效率肯定没有寄存器开发那么高。最后就是HAL库开发,HAL库是一个很上层的封装库,可以搭配cube MX进行部分图形化开发。HAL库的出现极大的减小了STM32的上手难度。它提供的各种函数包括延时,中断回调,都是非常易用的,它可以让开发者完全处于上层开发。但是,因为它的多层封装,也导致了它的执行效率低于标准库。因为封装得太严重,使得用户很难接触底层,如果用户想修改底层函数需要在层层封装中一层一层往下找。我们可以发现,每一种开发方式都有它的优缺点。如果你作为一个STM32新手,我建议你从标准库开发起手,等你熟悉的标准库开发以后,你可以直接转战HAL库,它们的语法很相似,你可以直接上手HAL库开发。当你将标准库和HAL库都使用得很熟了以后,在你开发的过程中可能会遇到操作寄存器的时候,这时你再尝试去查手册然后再去操作寄存器,这是一个层层理解的过程。所以,本次教程,我会教大家如何搭建一个标准库的例程,以后我们的开发都会再这个库上进行。

二、需要准备什么?

        在开始搭建环境之前,你需要有一个keil的开发软件,并且已经激活,如果你还不会安装keil可以参考我下面的文章:

keil的安装以及配置:[STM32]如何正确的安装和配置keil?(详细)-CSDN博客

我们这里会使用最常见的单片机作为演示,本文章演示的单片机是“STM32F103C8T6”,这是STM32初学者都会接触到的一款单片机,我也建议大家在初学阶段使用这款单片机,最小系统板的价格并不贵,如果你的经济条件允许,就请你在准备学习STM32时买一块最小系统吧。

当你安装好keil以后,我们就可以进行下一步了。

下面我也会进行尽量详细的讲解,包括芯片包的安装等。

在开始前,请将我提供的资料下载下来,如果你是小白,我建议你下载我提供的资料。资料中包含了可用的芯片包,库等。这些资料也可以去官网下载,但是官网需要登录以后才能下载,所以,如果你是小白,我建议你直接下载我提供的资料,不要把一开始的耐心浪费在找资料上。

本次会用到的资料:https://pan.baidu.com/s/1fyMFzbjIYYN5KMNms_xy8Q?pwd=clxm 
提取码:clxm

下载好资料以后就可以进行下一步了。

三、芯片包的安装

        芯片包是为了让keil能够识别到相关芯片。我们芯片包的安装有两种方式,一种是在线安装另一种是使用pack包安装。这两种安装方式都在keil安装的文章中讲解得非常清楚,如果你需要详细得芯片包安装教程可以去查看keil安装教程。下面我会为大家演示使用pack包安装stm32芯片包。我们将下载的资料解压得到以下文件夹:

进入这个文件夹下的芯片包文件夹,看到pack文件:

双击打开这个芯片包。打开安装引导界面。如果你打开安装引导界面以后,提示找不到keil你可以尝试重新安装keil或者使用在线安装的方式,这都可以参考下面的文章。我们可以看到这里芯片包的名字是带有“F1”的,这表示这是F1的芯片包,里面包含了所有F1系列的单片机。注意,不同系列STM32的芯片包也不通用,如果你想开发别的系列的单片机,你就需要安装别的系列芯片包:

参考文章:[STM32]如何正确的安装和配置keil?(详细)-CSDN博客

打开芯片包以后,看到以下安装引导界面:

这里显示了我们keil的路径,我们点击“Next”,点击了以后就开始安装了:

出现下面的界面就表示安装完成了,大家将这个窗口关掉即可:

这个时候我们可以打开keil查看安装是否成功。

打开keil后我们点击魔术棒:

随后点击“Device”:

在这里我们可以看到刚才我们安装的F1的芯片包,当我们有了这个芯片包以后,就可以进行下一步了。

这里需要注意,只有当你完成这一步以后,才能进行下一步。

四、创建STM32的keil工程

        我们先在某个地方新建一个文件夹用于存放我们的keil工程,这里最好选择一个文件夹来专门存放工程。我这里就在桌面上新建一个文件夹作为我们存放keil工程的文件夹,并且命名为Project:

我们再次打开keil,然后点击左上角的“Project”,随后点击“New Project”:

这里选择我们刚才创建的文件夹:

我们在下面的文件名中,可以输入一个比较通用的名字,后面我们要将这个工程运用到别的地方我们只需要修改外面的文件夹名即可,内部创建好的初始工程我们直接复制即可:

在做完以上步骤以后,我们点击保存:

点击保存以后,这里会让我们选择单片机:

因为我们这里要创建“STM32F103C8T6”的工程,所有我们这里要依次选择到“STM32F103C8T6”,我们可以点击加号展开,按照以下进行选择“STMicroelectronics>STM32F1 Series>STM32F103>STM32F103C8”,如果你用的是STM32F103C6T6,这里选择C6即可:

在选择完单片机以后点击“OK”,弹出的窗口是STM32创建工程的一个助手能帮我们快速创建,我们这里关掉即可:

我们可以看到右边已经出现了一些文件夹,这就表示我们的STM32keil工程已经创建成功了:

大家一定要在完成了这一步以后再进行下一步。这一步是下一步的前提。

五、复制相关库文件到keil工程文件夹:

        既然要使用库函数进行开发,那么我们就需要把相关库添加到我们的工程文件夹中。首先看到我给大家提供的资料,我们打开解压后的文件夹,进入文件夹下的“固件包”文件夹,看到以下文件:

这就是我们库函数的压缩包了,我们将其解压,得到以下文件夹:

我们后续会在这个文件夹中复制相关文件。

我们现在回到我们的keil工程文件夹中,我们可以看到它在创建工程时已经生成了很多文件和文件夹,这些文件和文件夹都是必须的,大家不要删了,更不要以为只有uvprojx是工程的本体:

我们在工程文件夹下新建一个文件夹名为“Start”,我们当然也可以直接把我们的库文件放在工程文件夹下,但是这样会显得比较乱,所以,我们要新建文件夹进行文件的整理和分类:

我们下面开始复制文件,目前文件比较多,大家不要复制丢了。

我们首先去固件库文件夹中找到启动文件,它被放在“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm”下:

来到这个文件夹中,我们可以看到非常多的.s的文件,当然,我们只需要选择一个就行了,我们STM32的启动文件也只能有一个,我们需要根据单片机的型号来选择相对应的启动文件,如果启动文件没选对,就算代码在编译时没有错误,代码也不会在单片机中跑起来。我们这里创建的是“STM32F103C8T6”的工程,这个单片机对应的启动文件是“startup_stm32f10x_md.s”,如果你想知道别的型号的单片机对应的是什么启动文件可以去网络上搜索相关资料。我们将这个启动文件复制到我们一开始在工程文件夹中创建的“Start”文件夹中:

复制完启动文件以后,接下来我们来复制STM32的寄存器描述文件和系统文件,它们被放在了“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”文件夹下:

这里的“stm32f10x.h”是我们STM32的外设寄存器描述文件,用以描述STM32有哪些寄存器和对应的地址,“system_stm32f10x.c”,“system_stm32f10x.h”文件主要用于配置系统时钟。我们将这三个文件复制,同样粘贴到工程文件夹的“Start”文件夹中:

下面我们来复制内核相关文件,内核文件被放在了“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport”下:

这里的两个文件就是STM32内核寄存器的描述文件。我们同样将其复制到我们工程目录下的“Start”文件夹中:

经过了以上步骤,我们的Start文件夹的文件就全部添加完成了,STM32的内核以及基本外设的寄存器就可以通过上面的文件基本运行起来了,为了我们编程方便,我们还需要使用函数库,下面我们来添加STM32的函数库。首先我们要在工程文件夹下创建一个文件夹名为“Library”:

我们下面所有的库函数文件都会放在这个“Library”文件夹中。

我们首先来复制库文件的头文件,它们被放在了“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc”文件夹下:

我们将这下面的.h文件全选,复制到我们刚才在工程目录下创建的“Library”文件夹下:

下面我们来复制库的源文件,它们被放在了“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src”文件夹下:

我们将这些.c的文件复制到“Library”文件夹下:

至此,我们所有的库函数就已经复制完成了。

下面我们来配置用户相关文件,我们在工程目录下新建一个“User”文件夹:

我们现在进入这个文件夹,在这个文件夹中新建一个“main.c”文件来放我们的main函数和一些用户函数。你可以先新建文本文件再将后缀改成.c:

在创建好这个文件以后,我们继续复制固件库中的文件,我们现在要复制固件库中.h包含关系的配置文件与中断函数相关文件。它们被存放在“STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template”下:

这里的“stm32f10x_conf.h”就是我们库中头文件包含关系的配置文件,“stm32f10x_it.c”,“stm32f10x_it.h”就是我们中断函数相关文件,我们将其复制到工程目录下的“User”文件夹中:

至此,我们所有的相关文件都已经复制完成,大家可以多检查几遍有没有少复制,少复制文件可能会导致报错。

六、在keil中添加文件

        在上面,我们只是将所有的文件复制到了工程文件夹中,并没有添加到keil中,我们打开keil可以发现keil中还是空的一片,我们现在可以开始往keil中添加文件。

我们点击“Project.uvprojx”打开我们的工程:

打开keil后我们点击三个箱子的按钮:

出现以下窗口:

我们可以看到中间的框,我们将在中间的框和右边的框中进行操作。我们先把中间的框中原本的文件夹删了,你只需要选中这个文件夹在点击中间框上面的X即可:

我们在删除中间框中原本的文件夹以后,我们在中间的框中点击如下图中的图标添加文件夹:

我们在这里添加“Start”,“Library”,“User”文件夹,这三个文件夹与外面的三个文件夹对应,我们要将外面三个文件夹中的文件对应的添加到这里面的三个文件夹中:

我们选中文件夹,点击“Add Files”:

这里的文件类型,我们选择“All Files”:

我们再进入“Start”文件夹,将文件全选,点击“Add”:

我们可以看到这里的这里“Start”的文件已经被添加进来了:

我们按照上面的步骤,再将“Library”和“User”的文件添加进来,记得每次都要在文件类型中选择“All  Files”:

在所有文件都添加进来以后,我们点击窗口下的“OK”,这里一定要点击“OK”,不能直接将窗口关掉或者点“Cancel”:

在点击了“OK”以后,我们窗口的左边出现了几个文件夹,这几个正是我们刚才添加的,大家可以点击加号展开看看里面的文件:

至此我们在keil中添加文件就已经完成了。

我们为了让编译器能够找到头文件,我们还需要将头文件的路径添加到环境变量中,我们这里点击魔术棒:

我们这里点击“C\C++”:

然后我们点击窗口下面的“Include Paths栏”右边的三个点:

我们点击图中框出的图标:

点击了以后,我们再点击三个点:

我们这里选择“Start”文件夹,最后点击“选择文件夹”:

我们可以看到这里的“Start”文件夹已经被添加进来了:

我们使用上面的方法,将“Library”和“User”文件夹都添加进来,添加好以后如下图,我们在添加好以后点击“OK”,回到下一个窗口中我们同样点击“OK”:

七、在keil中添加宏定义和编译器

        我们现在需要在keil添加一个宏定义代码才能够正常被编译,在某些时候,我们还可能要自己添加编译器,这取决于你安装的keil有没有附带arm5的编译器。现在我们先来添加宏定义。

我们还是点击魔术棒:

我们再次点击“C\C++”:

我们在“Define”中写入以下字串:

USE_STDPERIPH_DRIVER

在添加字串以后,我们点击“OK”即可。

我们目前的路径和环境变量都已将添加完成,我们现在按道理说已经可以开始编译了,我们现在还需要检查一下自己的编译器,我们依然点击魔术棒来到以下界面:

我们检查上面有没有v5开头的编译器,可以看到,我这里就有一个“v5.06”的编译器。我们这里必须要使用v5的编译器,如果使用v6的编译器就会报错,如果你检查了这里没有v5的编译器的话,那你就需要继续看下面的教程,如果你这里有v5版本的编译器,那你可以直接跳到第八步。

好的,如果你还没有走开,那说明你这里没有v5的编译器,我们现在开始安装v5的编译器

我们继续打开我给的资料文件夹中的“编译器”文件夹,编译器的安装文件被放在了“ARMCompiler_506_Windows_x86_b960\Installer”下:

我们点击这个“setup.exe”开始安装编译器:

这里打上勾以后,点击“Next”:

下面我们选择安装路径,我们常常把安装路径定在keil安装目录下的ARM下的ARMCC文件夹中,如果你keil的安装路径下的ARM文件夹中没有ARMCC文件夹请自行创建一个:

这里我们点击安装:

随后便开始安装了:

这里已经提示我们安装完成了,将窗口关闭即可:

目前只是编译器安装完成了,我们还需要将编译器添加到keil中。下面我们继续回到keil中,我们这里再次点击三个箱子的按钮:

随后再点击“Folders/Extensions”:

随后再点击图中的三个点:

点击下面的“Add ..............”:

这里要选中我们刚才安装编译器的“ARMCC”文件夹,如果这里选择了不正确的文件夹会提示这个个文件夹中不存在编译器:

我们可以看到我们的v5编译器已经被添加进来了:

最后我们将这个窗口关闭,在外面的窗口中点击“OK”。

我们添加好编译器以后,再次点击魔术棒,我们应该就能看到编译器已经进来了:

至此,我们的编译器就已经添加完成了。

八、开始编译代码

        在开始编译之前,我们还是需要点击魔术棒,点击以后,我们点击“Output”:

我们将“Create HEX File”打上勾,随后点击OK;

我们在main.c文件中写入一下字段,不写的话编译会报错:

#include "stm32f10x.h"                  

int main(void)
{
	while(1)
	{
		
	}
}

我们点击编译按钮开始编译:

按道理说,编译是没有错误也没有警告的。如果你出现“xxx头文件找不到”你可以考虑文件环境有没有正确安装,如果你出现了诸如446,31,4这种具有特征的报错数字,你可以尝试检查你的宏定义有没有输入正确,或者你的编译器是否设置正确。

当你编译没有错误以后,你可以去项目文件夹下的“Objects”文件夹查看有没有一个.hex文件:

当你看到这个hex文件以后,也就表示我们的环境已经配置完成,并且已经成功编译。

九、结语

        当你创建好这个标准库工程时,在以后你想做别的实验,你都可以复制这个工程来修改。以上就是我们STM32F103C8T6标准库工程创建的全部内容了,感谢大家观看。

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

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

相关文章

【计算机组成原理】七、输入/输出系统:1.I/O基本概念、I/O设备(外部设备)

七、输入/输出系统 文章目录 七、输入/输出系统1.基本概念4. I/O设备(外部设备)4.1输出设备4.1.1键盘4.1.2鼠标 4.2输出设备4.2.1显示器4.2.2打印机 4.3外存设备 1.基本概念 “I/O”就是“输入/输出”( Input/Output)。 I/O系统由I/O软件和I/O硬件两部分…

精益管理:怎样选择适合的库存管理策略?

如果顾客在下单后愿意耐心等待产品制作完成,对于生产管理者而言,自然是最为方便的。一般而言,水电工程行承接的订单,顾客都只能耐心等待工作完成;但这只是个别情况,实际上大部分顾客并没有这么多耐心&#…

【k8s系列】Kubernetes Service 深度解析:从基础到实战

一、前言 在当今的云原生世界中,Kubernetes 已经成为容器编排和管理的事实标准。它提供了一种强大的方式来部署、扩展和管理容器化应用。然而,随着应用规模的扩大和复杂性的增加,如何有效地暴露和管理这些应用的网络服务成为了一个关键问题。…

Google Gemini 使用 | 中小型企业借助谷歌 Gemini 提高生产力的 5 种方法

Gemini Business for Workspace 融合了谷歌最强 AI 技术,并集成到办公产品组件中的解决方案。 无论是中型的家族企业,还是刚起步的小型创业团队,你们是否觉得一天 24 小时根本不够用?既要忙着客户维系和拉新,又要管理员…

pda移动护理终端医用手持机

随着物联网技术的发展,智能设备之间形成了紧密的网络互联。 医疗行业越来越注重智能设备的使用,医用手持机可以采集病人、药品、材料等信息,很大程度地改善了医院患者的管理,进一步提升医护人员的工作效率。 医护人员通过使用pda移…

【开学季】告别一次性AI写作工具,打造你自己的专属AI助手!

新学期的钟声敲响,校园里充满了书本的香气和求知的热情。📚可许多学生和职场人士,仍然依赖那些一次性的AI写作工具来完成自己的写作任务。我想问你:为什么不尝试自己构建一个属于自己的AI写作工作流呢?🤔 前…

机器学习:自然语言处理之关键词提取(TF-IDF)

目录 前言 一、TF-IDF 1.TF 2.IDF 3.TF-IDF计算法则 4.TF-IDF的本质 二、代码实现 1.导入库 2.读取文本数据 3. 初始化TfidfVectorizer并转换文本数据 4. 获取词汇表并创建 DataFrame 5.处理每篇文章的特征 总结 前言 TF-IDF(Term Frequency-Inverse D…

MySql字段有null值与其他值的比较

MySql字段有null值与其他值的比较 SELECT count(1)在这里插入代码片FROM LAW_ENFORCEMENT_TROUBLE TBWHERE TB.STATUS 1AND TB.DUTY_LIMIT_DATE < NOW()AND TB.TROUBLE_STATUS ! 2查出结果为0条&#xff0c;但是应该为3条&#xff0c;查看表数据发现&#xff0c;TROUBLE_S…

常见图像图片属性的介绍与说明

图像属性是指图像的一些基本特征和参数&#xff0c;它们定义了图像的外观和存储方式。以下是一些常见的图像属性&#xff1a; 1. 分辨率&#xff1a; 分辨率通常以像素数&#xff08;如800x600&#xff09;来表示&#xff0c;指的是图像的宽度和高度上的像素点数。分辨率越高&…

mysql5.7 TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ 换版8版本 引发的问题

mysql5.7 TIMESTAMP NOT NULL DEFAULT 0000-00-00 00:00:00 换版引发的问题 问题背景sql_mode上机演示5.78.4 问题背景 在项目mysql版本由5.7 换版到8.4版本后&#xff0c;我们进行回归测试时&#xff0c;却发现一个积年代码报错了&#xff0c;是数据库插入报的错 xxx can not…

自用Office 365家庭版全家桶 + OneDrive 1TB拼车,40/年,来长期拼的!

自用Office 365家庭版全家桶 OneDrive 1TB拼车&#xff0c;40/年&#xff0c;来长期拼的! &#x1f50d;1.背景描述&#x1f50d;&#x1f421;2. 常见问题解答&#x1f421;【问】是正版吗&#xff1f;【问】跟普通版本有什么区别&#xff1f;【问】会不会是假货? &#x1f…

1、Java简介+DOS命令+java的编译运行(字节码/机器码、JRE/JVM/JDK/JIT的区别)+一个简单的Java程序

前言&#xff1a;本文属于黑马程序员和javaguide的混合笔记&#xff0c;仅作学习分享使用&#xff0c;建议感兴趣的小伙伴去看黑马原视频或javaguide原文。如有侵权&#xff0c;请联系删除。 Java类型&#xff1a; JavaSE 标准版&#xff1a;以前称为J2SE&#xff0c;主要用来…

掌握一招:‌输入什么命令,‌轻松查看电脑IP地址?‌

在日常使用电脑的过程中&#xff0c;‌无论是进行网络设置、‌远程连接还是解决网络问题&#xff0c;‌了解并查看自己的电脑IP地址都是一项基础且重要的操作。‌对于许多用户来说&#xff0c;‌可能并不清楚如何快速准确地获取这一信息。‌本文将为你揭秘一个简单实用的命令&a…

【数据结构与算法】:十大经典排序算法

文章目录 前言一、冒泡排序&#xff08;Bubble Sort&#xff09;1.1 冒泡排序原理1.2 冒泡排序代码1.3 输出结果 二、选择排序&#xff08;Selection Sort&#xff09;2.1 选择排序原理2.2 选择排序代码2.3 输出结果 三、插入排序&#xff08;Insertion Sort&#xff09;3.1 插…

可重入VI,VI模板和动态VI之间的差异 转

可重入VI 当您想要同时运行同一VI的多个实例时&#xff0c;将使用可重入VI。当VI不可重入时&#xff0c;VI只有一个数据空间。因此&#xff0c;一次只能有一个调用者运行VI&#xff0c;因此调用者可能必须“等待轮到它”时才能使用VI。这是VI的默认选项&#xff0c;但您可以将V…

精通大模型:八本必读书籍,一篇搞定所有知识点!

如果你想深入了解大模型领域&#xff0c;无论是为了学术研究还是实际应用&#xff0c;选择合适的书籍是非常重要的。以下是精选的八本大模型相关书籍&#xff0c;涵盖了从基础理论到高级实践的内容&#xff0c;可以帮助你构建全面的知识体系。 《大模型应用开发极简入门》 简介…

Hadoop之HDFS的原理和常用命令及API(java)

1、简介 书接上回&#xff0c;上篇博文中介绍如何安装Hadoop和基本配置&#xff0c;本文介绍Hadoop中分布式文件组件--HDFS&#xff0c;在HDFS中&#xff0c;有namenode、datanode、secondnamenode这三个角色&#xff0c;本文将详细介绍这几个组件是如何进行协作的&#xff0c;…

PHP一键预约便捷高效咨询小程序系统源码

一键预约&#xff0c;开启便捷高效咨询新时代 —— 你的专属咨询小程序 &#x1f680; 【开篇&#xff1a;告别繁琐&#xff0c;拥抱便捷新体验】 在这个快节奏的时代&#xff0c;时间就是金钱&#xff0c;效率就是生命。你还在为寻找咨询服务而四处奔波&#xff0c;或是为了预…

社区团购小程序系统源码+界面diy+分销+团长+供应商+拼团+菜谱+秒杀+预售+配送,开启社区营销新模式

社区团购小程序类似美团优选,兴盛优选平台.是一款针对小区居民开发的在线购物平台&#xff0c;旨在为用户提供便捷、实惠的购物体验&#xff1b;同时还提供了“限时抢购”和“优惠券营销”等多种实惠的购物体验&#xff0c;是小区居民们的不二之选。 一、 特点与优势 社区化运…

SprinBoot+Vue健康管管理微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…