文章目录
- 一、前言
- 二、嵌入式及STM32简介
-
- [2.1 嵌入式开发的定义](#2.1 嵌入式开发的定义)
- [2.2 STM32简介](#2.2 STM32简介)
-
- [2.2.1 STM32的基础定义与核心特性](#2.2.1 STM32的基础定义与核心特性)
- [2.2.2 STM32主要系列分类](#2.2.2 STM32主要系列分类)
- 三、编程工具------keil5的使用
-
- [3.1 keil5简介](#3.1 keil5简介)
- [3.2 使用keil5新建工程](#3.2 使用keil5新建工程)
- [四、开发STM32 Pin13脚完成点灯操作](#四、开发STM32 Pin13脚完成点灯操作)
-
- [4.1 寄存器开发STM32实现点灯](#4.1 寄存器开发STM32实现点灯)
- [4.2 库函数操作STM32实现点灯](#4.2 库函数操作STM32实现点灯)
- 五、总结
一、前言
编程如同球场,唯有自己不断突破,才能取得最后的胜利
🚀鑫-萍的个人主页🚀
😀鑫-萍的Gittee仓库
🛬人生名言------与其被动迎敌,不如主动出击🛬
各位宝子们,今天的你是否还在坚持学习呢?回想这一路走来,从最初的C语言学习,再到后面数据结构与算法的接触,以及到现在的C++深入学习,我想大家已经具备了非常优秀的编程能力了吧?软件这一方面,大家的能力肯定毋庸置疑,那把我们的软件知识和硬件知识相结合,又会碰撞出怎样的火花呢?那么今天,就让我们再学一门新的知识:嵌入式开发学习------STM32单片机入门。
二、嵌入式及STM32简介
2.1 嵌入式开发的定义
首先,什么是嵌入式开发呢:嵌入式开发是针对嵌入在各类设备内部的专用计算机系统(嵌入式系统)开展的软硬件协同开发工作, 核心是基于微控制器(MCU)或微处理器(MPU),结合受限的硬件资源,编写驱动程序、移植实时操作系统(RTOS)或轻量化嵌入式系统,开发适配特定功能的应用软件,以满足设备在实时性、低功耗、高可靠性等方面的需求。其特点是强针对性,只为实现设备特定功能服务,广泛应用于消费电子、工业控制、汽车电子、物联网等领域,是连接硬件与实际应用的关键技术。
其中,STM32单片机就属于微控制器(MCU)系列
2.2 STM32简介
这是一颗独立的 32 位微控制器(MCU)芯片,表面印有STM32和 Cortex 标识,是整个嵌入式系统的核心计算单元。**仅包含芯片本体,需要搭配外部电路(如电源、时钟、复位电路)才能工作,无法直接用于开发。**主要用于产品量产阶段,需要工程师根据需求设计 PCB,将其焊接到自己的硬件系统中,以实现特定功能。
这是一个集成了 STM32 芯片、电源电路、调试接口、指示灯、按键等外设的完整开发工具。**已经完成了最小系统的硬件设计,开箱即可连接电脑进行编程和调试,无需额外搭建复杂电路。**主要用于学习、原型验证和项目开发阶段。开发者可以直接在开发板上编写、下载和调试代码,快速验证功能,降低了嵌入式开发的硬件门槛。
2.2.1 STM32的基础定义与核心特性
STM32是意法半导体(STMicroelectronics,简称 ST)推出的一系列32 位微控制器(MCU)产品,核心架构基于 ARM 公司的Cortex-M系列内核(属于精简指令集RISC架构),主打高集成度、低功耗、低成本、高性能,是目前嵌入式开发领域使用最广泛、生态最完善的MCU之一,几乎是嵌入式入门的标配。
看到这里,大家肯定有点懵懵的吧------一上来就叙述这么多专业术语,完全理解不了啊!不要着急,其实通俗易懂的理解:STM32就是一款 "开箱即用" 的微型控制芯片,内部集成了嵌入式系统所需的核心资源,无需额外搭建复杂硬件,就能实现对各类外设的控制和数据处理。
现在,大家又会有问题了------为什么STM32就这么受欢迎呢?这就要从STM32的核心特性说起了。
1、32 位内核,性能与功耗平衡
内核采用ARM Cortex-M系列(从低性能到高性能依次为 M0+/M0、M3、M4、M7、M33、M55 等),32位数据总线相比传统8位 MCU(如 51单片机),数据处理能力更强(能直接处理32位整数、浮点数据),运行频率最高可达数百MHz(如 STM32H7 系列可达 480 MHz)。支持多种低功耗模式(睡眠、停止、待机等),满足便携式设备(如智能手环、传感器节点)的电池供电需求,部分型号待机功耗可低至微安级甚至纳安级。
2、超高集成度,无需额外外接大量硬件
这是STM32最核心的优势之一,芯片内部集成了嵌入式系统工作所需的大部分资源,外部仅需搭配电源电路、复位电路、下载调试电路,就能独立运行:
存储资源:片内Flash(用于存储程序,容量从几KB到数MB不等)、片内RAM(用于运行程序时临时存储数据,容量从几KB到数百KB不等)。
丰富片上外设(Peripheral):这是STM32实现各类功能的关键,常见外设包括:通用输入输出口(GPIO)、通信接口、模拟外设、控制类外设、DMA、看门狗。
3、完善的生态系统,降低开发门槛
这是STM32成为入门首选的重要原因,新手无需面对复杂的技术壁垒:
官方资料齐全:ST提供完整的中文手册(数据手册、参考手册、用户手册)、官方固件库(STM32Cube HAL/LL库)、示例代码。
开发工具丰富:支持免费的Keil MDK、STM32CubeIDE(ST 官方推出,免费开源,集成编译、调试、烧录)、IAR Embedded Workbench 等。
调试方便:支持SWD(串行调试)、JTAG两种调试方式,SWD仅需2根线即可实现程序下载和在线调试(查看变量、断点、单步执行),硬件成本低。
社区资源庞大:国内外有大量的教程、项目案例、问题解答(如 CSDN、知乎、B站),遇到问题容易找到解决方案。
开发板成熟:市面上有大量性价比极高的入门开发板,价格几十元到几百元不等,开箱即可上手。
4、型号丰富,按需选择,成本可控
STM32拥有庞大的产品家族,覆盖从低性能低功耗到高性能高集成的各类场景,价格从几元到几十元不等,开发者可以根据项目需求精准选型,避免资源浪费和成本过高。
2.2.2 STM32主要系列分类
如上表:按CPU位数分为32位STM32系列和8位STM8系列两大类别,其中STM32系列基于不同性能的ARM Cortex-M内核,细分为入门级、基础型、高性能、低功耗等多个子系列,而STM8系列则基于超级版6502内核,涵盖标准、汽车应用和低功耗等子系列,能帮助开发者根据项目的性能、功耗等需求快速匹配对应的产品。
三、编程工具------keil5的使用
3.1 keil5简介
现在我们已经对STM32有了相对清晰的了解了,那具体进行32开发的过程是怎样的呢?这时,就需要借助到编程工具了。博主这里所用到的工具是keil5软件(Keil MDK-ARM)。
Keil5正式全名为Keil MDK - ARM(Microcontroller Development Kit for ARM),其核心IDE界面是 Keil µVision5,它是ARM公司推出的面向 ARM Cortex - M 系列微控制器的集成开发工具套件,**集成了代码编辑、ARM Compiler 5/6编译器、调试器、模拟器等组件,支持C/C++编程,通过Pack包管理器可适配众多厂商的MCU,具备断点调试、变量监控、软/硬件仿真等功能,还能集成RTX5等RTOS与各类中间件,广泛用于嵌入式学习、原型开发与产品量产,**是STM32等主流ARM MCU开发的常用工具,同时也兼容8051等传统单片机开发。
3.2 使用keil5新建工程
在下载安装好了keil5软件之后,我们又该如何使用呢?我们先以一个最简单的示例开始------完成pin13脚所外接的指示灯,进行点灯操作。
1、首先我们先来新建一个工程项目:
第一步:我们先建立一个存放工程的文件夹(C盘或者D盘或者桌面),然后我们再打开keil5软件,点击Project->New uVision Project,然后选择我们刚才所建立的文件夹,在里面在新建一个文件夹。
注意:使用的文件夹以及文件的命名方式尽量以英文为主,避免可能发生的报错。
第二步:然后我们点进刚刚建立的twomode文件,接下来给工程文件取一个名字(我这里通用就起一个Project),再点击保存,然后就是选择器件与型号,这里我们所用到的器件型号是STM32F103C8T6(直接选择STM32F103C8即可),点击OK之后可能会出现一个小助手界面,但是此时我们还用不到,就先叉掉,之后就出现一个空空如也的工程界面。
2、给工程项目添加必要文件
第一步:找到并打开固件库的文件夹,复制里面的所有文件,再回到之前所创立的工程文件夹,新建一个文件夹命名为Start,用来存放刚刚再arm里复制的所有文件。
第二步:接着我们再回到固件库的STM32F10X文件夹,把红圈圈的3个文件一起复制到Start文件夹中,然后再找到CM3,coresupport文件夹,把内核寄存器文件也一起复制到Start文件夹中,此时我们工程的必要文件就复制完成了。
3、回到keil5软件,将复制的文件添加到工程中并添加头文件路径
第一步:方便起见,把Source Group1组改名为Start,接着右击Start组,添加已经存在的文件到组中,文件类型选择为All files,然后依次添加启动文件,md.s和所有的.c和.h文件,按Add添加,close关闭,添加完之后就能在Start组中看到了。
第二步:点击魔术棒按钮,打开工程选项,选择C/C++项,找到Include Paths栏,点击3个点的按钮,将Start组的路径添加进去,添加完毕之后点击OK。
4、新建main.c文件检查工程是否可行
第一步:回到twomode文件夹中,新建一个User文件夹,回到keil5软件,右击Target 1 ->Add Group添加组,将新添加的组改名为User,再右击User,添加新文件,为main.c文件,将main.c文件的路径改为User的路径,防止main.c文件被创建到User文件夹之外。
第二步:在main.c文件中写一个简易程序,点击编译按钮,查看是否有错误或警告
注意:一定要点击魔术棒按钮中的Target项,把编译器版本换到uVersion 5 版本,否则会出现报错!
到这里,一个最基本的工程文件就建立好了,但是目前这个工程还没有添加STM32的库函数,所以它还是一个基于寄存器开发的工程。
四、开发STM32 Pin13脚完成点灯操作
那么现在我们又回到了最初的那个问题------如何完成pin13脚所外接的指示灯,进行点灯操作?为实现目的,博主这里一共有两种实现方式:寄存器开发STM32和库函数开发STM32。
4.1 寄存器开发STM32实现点灯
首先,我们得具体一下硬件:STLINK烧录器、STM32最小系统板、4根杜邦线、USB电源。然后按照以下方式实现硬件接线:
注意:一定要严格按照上图接线标准进行硬件接线,否则会造成元器件损坏或者安全事故!
接着就是keil5软件代码的编写:
第一步:我们先点击魔术棒按钮,点击Debug选项,将Use选项选为ST-Link Debugger,然后再点击setting按钮,点击Flash Download选项,勾选Reset and run。这样程序一旦下载就会立刻复位并且执行,更加方便。最后点击确定和Ok返回。
第二步:代码编写。
1、因为我们要配置的Pin13脚实现点灯,而Pin13是通过GPIOC连接的,所以我们要给GPIOC配置时钟使能。
2、这时我们先打开STM32F10XXX参考手册,点击7.3.7章节,查阅手册发现,位4是定义IO端口C时钟使能的,置1时时钟开启,置0时时钟关闭,所以我们给4位置1,其他位全部置0。
3、配置Pin13脚的模式,翻到手册8.2.2,端口配置高寄存器,CNF13和MODE13就是用来配置13口,输出模式为通用推娩输出,23和22位置0,配速50MHZ,21和20位置1.
4、给Pin13口输出数据,翻到手册8.2.4,端口输出数据寄存器,ODR13写1为高电平,写0为低电平。
5、编译程序并将程序烧录到STM32最小系统板中
此时,寄存器操作点灯的代码就写完了。如下:
通过寄存器操作点亮和熄灭PC13口的led指示灯
c
//此代码仅为main.c全部代码,其他代码文件需进行之前所讲的文件配置
#include "stm32f10x.h" // Device header
int main(void)
{
RCC->APB2ENR = 0x00000010;
GPIOC->CRH = 0x00300000;
// GPIOC->ODR = 0x00000000;//ODR置低电平点亮
GPIOC->ODR = 0x00002000;//ODR置高电平熄灭
while(1)
{
}
}
现在我们就实现了使用寄存器实现点灯,这就需要我们对非常熟悉STM32的资料手册,对每一个寄存器都完全掌握。不过,这样的方式虽然代码简洁,但始终还是存在弊端,譬如把PC13位之外的所有位都置为0,会影响到其他端口的原有配置。所以寄存器操作的方式博主并不是很推荐。
4.2 库函数操作STM32实现点灯
那如何不影响其他端口的原有配置,又能实现PC13口的点灯操作呢?真的有这样的方法吗?我只能说------有的,朋友,有的。这种方式就是通过库函数操作的方式。
第一步:在之前所建工程的基础上,在工程文件夹新建文件夹Library,用来存放库函数。
找到固件库中STM32F10X_StdPeriph_Driver中的inc和src文件夹,把其中所有文件复制粘贴到新建的Library文件夹中,接着Target1->Add Group添加新组,命名为Library,右击Library添加已经存在的文件,找到Library文件夹中所有文件,全部添加。
第二步:找到STM32F10X_StdPeriph_template文件夹中红圈圈的3个文件,将其复制粘贴到工程文件夹中的User文件夹中,再回到keil5软件,在User组里添加刚刚粘贴的3个文件,然后再右击头文件,打开文件找到8296行宏定义,接着点击魔术棒中的C/C++按钮,在Define栏把宏定义复制粘贴,最后再在Include Paths栏添加User和Library头文件的路径就行啦。
第三步:编译整个工程文件,查看是否无报错无警告。
第四步:代码编写。
首先配置RCC_APB外设时钟控制,找到需要配置的两个参数,再配置端口模式,使用GPIO_Init()函数进行配置,右击函数名转到定义找到需要配置的两个参数,因为第二个参数是一个结构体,所以先右击转到各自的定义,找到定义所指向的值,再ctrl+F搜索找到最终需要配置的值,再进行高低电平的配置,最后编译程序并将程序烧录到STM32最小系统板中
注意:一定要将魔术棒中C/C++选项中C99Mode勾选上,否则会报错。
此时,库函数实现STM32点灯的操作也完成了,如下:
通过库函数操作点亮和熄灭PC13口的led指示灯
c
//此代码仅为main.c全部代码,其他代码文件需进行之前所讲的文件配置
#include "stm32f10x.h" // Device header
int main(void)
{
// RCC->APB2ENR = 0x00000010;
// GPIOC->CRH = 0x00300000;
// GPIOC->ODR = 0x00000000;//ODR置低电平点亮
// GPIOC->ODR = 0x00002000;//ODR置高电平熄灭
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//RCC_APB2外设时钟控制
GPIO_InitTypeDef GPIO_InitStructure;
//结构体各参数设置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_13);//PC13口置为高电平
// GPIO_ResetBits(GPIOC,GPIO_Pin_13);//PC13口置低电平
while(1)
{
}
}
怎么样?相对于寄存器开发,库函数开发操作更加高效且容易上手吧?不需要我们去死记硬背寄存器的地址与位定义了, 并且库函数操作方式,兼容性更强、维护成本更低、可移植性也极强,往往是一名优秀嵌入式开发者的不二之选。
五、总结
OK啊!到这里,STM32单片机入门学习的知识点就分享得差不多了,大家再跟着博主学习了一篇之后,可能觉得比较通俗易懂,但是硬件与软件相结合的困难程度也是相当大的,大家一定要静下心来,好好沉淀,只要你之前软件知识的学习打牢了基础,你也肯定会在嵌入式学习方面大有一番作为的!加油吧,少年!
本文资料获取可参考评论区或者哔哩哔哩哦



























