嵌入式基础教程
——
STM32单片机卷1前置知识
节04STM32概述

最新版本V1.0
王道嵌入式团队
COPYRIGHT ⓒ 2021-2025 王道版权所有

STM32是什么

Gn!

在本小节中,我们将简要的介绍一下与STM32相关的一些概念,主要涉及以下名词:ARM、ST、STM32以及我们使用的MCU的简单介绍。

ARM

Gn!

为了更好地理解STM32微控制器,我们需要先了解一下ARM这个名词。

ARM公司

ARM,首先是一家半导体公司,安谋国际科技股份有限公司[Arm Limited (or its affiliates)] ,即ARM有限公司或它的附属公司。

ARM是一家英国的公司,2016年被日本软件银行集团(SoftBank)收购,2020年曾被英伟达(NVIDIA)收购,但没有成功。

ARM-商标图

ARM不直接从事芯片的生产和销售工作,而是专门从事ARM架构、ARM处理器核心(CPU)RoRdOg的研发设计工作,然后卖给下游合作伙伴厂商,由下游合作商设计生产出具体的产品进行售卖。

ARM在这个过程中,只卖解决方案,进行知识产权授权。

当然下游的合作厂商卖出了产品,赚到了钱,肯定是要分给ARM公司的。ARM公司的这种商业模式堪称"躺着赚钱"。

ARM架构

ARM架构最主要的特点就是高性能、低功耗以及灵活性,这种特点使得ARM架构在移动端和嵌入式领域具有绝对垄断级别RoRdOg的领先:

  1. 几乎所有智能手机、平板电脑的核心处理器都采用ARM架构。RoRdOg比如苹果公司的A系列处理器,高通的骁龙系列处理器,华为的麒麟(Kirin)系列处理器等等。

  2. 苹果公司推出的M系列处理器也属于ARM架构的处理器,苹果公司还率先将它用于PC端处理器,使得MacBook笔记本的性能强劲,功耗低,续航极强。

  3. 嵌入式领域最常用的STM32系列微控制器,也是基于ARM架构设计研发的。

一个非常典型的例子就是:苹果公司的A系列和M系列芯片,它们都是基于ARM架构再研发的芯片。

 

ARM处理器核心(CPU)

除了设计研发系统架构,ARM公司还基于自身设计的ARM架构,研发了一系列成品处理器核心(CPU),下游合作厂商如果想要更省事可以直接拿设计好的成品处理器核心进行二次研发。

一个经典的例子就是:STM32微控制器。STM32直接使用ARM公司设计好的处理器核心,并将其集成到微控制器中。STM32并没有自行设计处理器核心,而是直接使用ARM的处理器核心。

总之,ARM在不同的语境中,可以有以下三种含义:

  1. ARM公司:专注于设计ARM架构和处理器核心,并将其授权给下游厂商。

  2. ARM架构:一种处理器架构,类似于桌面端的x86架构,广泛应用于移动端、嵌入式系统等领域。ARM架构以低功耗、高性能和灵活性为特点。

  3. ARM处理器核心:ARM公司设计的具体处理器核心(如Cortex-A、Cortex-M系列),厂商可以选择使用这些现成的核心来构建自己的产品。

ARM架构的发展历史

Gn!

ARM作为一种架构,从1985年的ARMv1架构开始,一直发展到今天。最新的ARM架构版本是2021年正式发布的ARMv9架构。

ARM架构是一种使用精简指令集(RISC)RoRdOg的系统架构,其特点是通过减少指令集的数量,仅重复执行简单的指令,实现了更简单、更高效、功耗更低、体积更小的处理器设计。

这使得ARM架构的处理器特别适用于移动端和嵌入式领域,如智能手机、平板电脑、物联网设备和消费电子产品。

与之对应的x86架构,则是一种使用复杂指令集(CISC)RoRdOg的系统架构。

复杂指令集包含了更多种类和更复杂的指令,每条指令可以执行更为复杂的操作。这种设计虽然增加了指令的灵活性和功能性,但也导致了处理器设计的复杂性和功耗的增加。

因此,x86架构的处理器通常性能强大,适用于桌面计算机、服务器和高性能计算领域,但在功耗和散热方面不如ARM架构的处理器高效。

ARM架构和X86架构的区别可以查看下表:

ARM与x86架构的主要区别
特性ARM架构x86架构
指令集类型精简指令集(RISC)复杂指令集(CISC)
功耗低功耗,适合电池供电设备相对较高功耗,适合需要高性能的设备
性能高能效比,适合移动和嵌入式应用高单线程性能,适合桌面和服务器应用
应用领域移动设备、嵌入式系统、物联网、消费电子桌面计算机、服务器、高性能计算、多媒体应用
生态系统丰富的软件支持,强大的嵌入式和移动生态系统广泛的软件支持,成熟的桌面和服务器生态系统
成本成本较低,适合大规模集成和定制化应用成本较高,适合高性能和复杂应用
向后兼容性一般向后兼容性较好,但不如x86架构广泛高度向后兼容,确保旧软件和应用能够在新处理器上运行

这些内容了解即可,满足一下好奇心即可。

ARM处理器核心的发展历史

Gn!

上文中已经提到了ARM是一种架构技术名称,同时ARM公司还基于ARM架构设计了一些处理器的实现,这就是ARM处理器。

ARM处理器核心的命名早期采用数字命名,从1985年的ARM1处理器,到2002年的ARM11系列处理器

随后从2004年开始,ARM公司推出了Cortex-M系列处理器核心,正式放弃了数字命名的方式,而是提供了多个处理器核心系列,分别针对不同的市场需求和应用场景。

目前ARM处理器核心主要分为三个系列(这三个系列刚好又是ARM首字母):

  1. Cortex-A系列(Application)

    1. 主要用于智能手机、平板电脑、嵌入式设备和高性能计算场景。

    2. 支持多核处理和复杂的操作系统(如Android、Linux)。

    3. 具有较强的性能和较高的频率,适合运行复杂的应用和多媒体处理。

    4. 示例:Cortex-A53、Cortex-A72、Cortex-A76、Cortex-A78、Cortex-A78C、Cortex-X1等。

  2. Cortex-M系列(Microcontroller)

    1. 主要是低功耗的微控制器,广泛应用于嵌入式系统、物联网设备、传感器、家居自动化、汽车电子等领域。

    2. 低功耗、简化的设计和低成本是Cortex-M系列的特点,适合实时操作系统(RTOS)和简单的嵌入式应用。

    3. 示例:Cortex-M0、Cortex-M3、Cortex-M4、Cortex-M7、Cortex-M33、Cortex-M55等。

  3. Cortex-R系列(Real-time)

    1. 主要针对实时应用设计,适用于硬盘控制器、汽车电子、工业控制等对实时性要求极高的系统。

    2. 强调实时性、确定性和可靠性,提供更高的响应速度和稳定性。

    3. 示例:Cortex-R5、Cortex-R7、Cortex-R8等。

其发展历史可以用下图表示:

ARM处理器核心的发展历史-图

这部分内容也属于简单了解即可。

 

ST

Gn!

下面我们来介绍一下ST,这是一家全球著名的半导体公司。

STMicroelectronics(ST) 是全球领先的半导体公司之一,总部位于瑞士日内瓦。

ST成立于1987年,由意大利SGS微电子公司和法国Thomson Semiconducteurs的合并而成。由于这样的诞生背景,中文直接将ST翻译成意法半导体公司RoRdOg,可以说很简洁精妙。

欧洲地图

半导体是一种导电性能介于导体(如铜、铝等金属)和绝缘体(如橡胶、陶瓷等)之间的材料。常见的半导体材料有硅(Si)、锗(Ge)、砷化镓(GaAs)等,其中硅是应用最为广泛的半导体材料。

与之相关的半导体产业,则是专注于半导体材料、器件及其制造技术的发展。

半导体产业是电子产业的基石,全世界著名的半导体公司有:英伟达(NVIDIA)、高通(Qualcomm)、Intel、AMD、台积电、联发科、三星、华为海思、中芯国际等。

ST公司最著名的产品就是STM32系列微控制器(MCU),具体来说,是ST公司基于ARM Cortex-M系列处理器核心,设计外围电路组件,构建的一系列微控制器。

STM32是嵌入式领域最最著名,最常见,最经典的微控制器之一,它功能强大、性能优异、片上资源丰富、功耗低。某种程度上来说,STM32已经成为当今单片机的代名词。

STM32之所以如此流行,不仅仅是因为芯片本身的强大性能,还得益于ST公司为其提供的完善开发生态。

主要的支持工具包括:

  1. 丰富的开发库:例如标准外设库(标准库)、HAL库、LL库等,使得开发者能够快速上手,减少开发时间。

  2. STM32CubeMX:一款图形化配置工具,帮助开发者轻松配置微控制器外设和中间件,并生成初始化代码。

  3. STM32CubeIDE:基于Eclipse的集成开发环境,支持代码编辑、编译、调试等全流程开发,提供了一站式开发体验。

这些工具和资源大大降低了STM32的学习成本,同时提升了开发效率。

STM32的成功吸引了一大批追随者,现在许多其他芯片公司也效仿ST公司,为自家生产的芯片提供较完备的开发库以及开发工具。

近些年来,随着国产芯片的迅猛发展,国产芯片性能优异价格便宜,越来越有挑战STM32地位的趋势。

但是由于STM32广泛的应用基础和成熟的开发生态,它仍然是嵌入式开发的首选平台,对后续开发其他芯片具有很高的借鉴和指导意义。

STM32

Gn!

上面已经讲过了,所谓STM32指的是ST公司设计生产的,采用ARM Cortex-M系列处理器核心的STM32系列微控制器。

其中:

  1. ST:是意法半导体的缩写,代表该芯片的生产制造商是ST公司。

  2. M:表示 Microcontroller,即微控制器,单片机。

  3. 32:代表该微控制器是 32 位的,意味着它的数据处理能力和寻址空间等都是基于 32 位架构,能进行更复杂、更高效的数据处理和运算,相较于 8 位或 16 位的微控制器,在性能和功能上有较大提升。

ST公司把STM32分为了四个系列,如下图所示:

STM32系列微控制器-图

用户可以根据不同的需求,选择不同的微控制器。

三大核心数据:

  1. CoreMark得分:用数值量化处理器的计算性能,跑分越高,处理器性能越强。

  2. CPU频率:处理器的时钟频率,单位是兆赫兹(MHz),即每秒的时钟周期数,以百万次为单位。简单来说,时钟频率越高,计算速度越快,性能越强。当然功耗和发热也会更严重。

  3. 内核架构:STM32系列微控制器都采用ARM Cortex-M系列处理器核心,这里标注的是它具体采用哪一款处理器核心。Cortex-M0+(低功耗)→M3→M4(平衡)→M7(高性能)的阶梯式升级

四大产品线:

  1. 高性能(High Performance):适用于工业自动化、高端仪器等计算密集型场景,性能最强,功耗最高,价格最贵。

  2. 主流(Mainstream):平衡性能与成本,适合家电、消费电子等高性价比场景。

  3. 超低功耗(Ultra-Low Power):专为物联网传感、穿戴设备优化,功耗低续航强大。

  4. 无线(Wireless):自带蓝牙/Wi-Fi等无线通信模块,面向智能家居、远程监控等场景。

比如我们后续课程使用的STM32微控制属于STM32F1系列,从图中可以得知:

  1. 它的CoreMark跑分是177,时钟频率是72MHz,代表它的性能中等偏弱,属于低功耗的微控制器。

  2. 采用ARM Cortex-M3处理器内核。

这些内容也属于了解即可。

STM32F103C8T6

Gn!

到这里,我们更进一步的告诉大家,我们使用的微处理器型号是:STM32F103C8T6

STM32F103C8T6-芯片图

看到这个型号的命名是不是非常头大,不着急,我们慢慢来解释这个命名。

命名解释

Gn!

STM32微控制器的命名规则如下:

STM32微控制器的命名规则-图

以表格形式展示每个部分的含义,如下表所示:

命名组成部分示例含义
1. 产品线名称STM32代表ST公司的32位MCU产品线,基于 ARM Cortex-M 内核设计。
 STM8代表ST公司的8位MCU产品线,基于 ST 自研的 STM8 内核设计。
2. 产品系列名称F1主流系列的第一代产品,是最早发布的STM32系列之一。
: - F:主流系列(如 F0、F1、F4 等,适合通用应用)。
: - L:低功耗系列(如 L0、L4)。
: - H:高性能系列(如 H7)。
: - G:通用系列(如 G0、G4)。
: - W:无线系列(如 WB、WL)。
3. 子系列03表示具体的子系列:
  - 01/02:超值系列(Value Line),适合低成本应用。
  - 03:性能系列(Performance Line),适合更高性能需求的场景。
  - 05/07:基础系列(Basic Line),提供基础的外设和性能配置。
4. 封装类型C表示芯片的封装类型(Package):
  - C:LQFP48(四方扁平封装,48 引脚)。
  - R:LQFP64(64 引脚)。
  - V:LQFP100(100 引脚)。
  - Z:LQFP144(144 引脚)。
  - K:BGA 或 WLCSP(球栅阵列封装,适合高集成度应用)。
5. 闪存容量8表示芯片内部闪存的大小(单位为 KB,有些标注为字母):
  - 6:32KB 闪存。
  - 8:64KB 闪存。
  - B:128KB 闪存。
  - C:256KB 闪存。
  - E:512KB 闪存。
  - G:1MB 闪存。
  - I:2MB 闪存。
6. 温度等级T表示芯片的工作温度范围:
  - T:工业级(-40°C ~ +85°C)。
  - H:扩展工业级(-40°C ~ +105°C)。
  - K:汽车级(-40°C ~ +125°C)。
7. 电气特性和频率6表示芯片的供电电压范围、工作频率等特性:
  - 4:低频版本,3.3V 工作电压。
  - 6:高频版本,3.3V 工作电压,支持较高频率。
  - 7:增强版本,支持更高的性能和频率范围。

STM32F103C8T6 的完整解读:

  1. STM32:ST 公司设计研发的 32 位微控制器。

  2. F1:主流 STM32 系列的第一代芯片。

  3. 03:F1 系列的增强性能子系列。

  4. C:48 引脚 LQFP 封装。

  5. 8:64KB 的闪存容量。

  6. T:工业级温度范围(-40°C ~ +85°C)。

  7. 6:3.3V 工作电压,支持高频版本。

除此之外关于STM32F103C8T6 ,我们还可以了解一些其它信息,比如:

  1. 内核:ARM Cortex-M3

  2. RAM(内存):20KB(SRAM,即静态 RAM的方式实现)

  3. ROM(可以理解成外存):64KB(以Flash闪存存储器取代了传统的ROM)

  4. ARM Cortex-M3基于ARMv7-M架构设计。

这里可能要解释一下闪存的含义,闪存(Flash)是集成在MCU片内的一个存储器,它的作用是存储程序代码或者某些需要长期保存的数据,在系统断电后它仍然能够正常保存数据。

STM32F10x系列单片机可以称得上是ST公司最经典的单片机系列之一,ST按照芯片闪存容量把它分成了以下几个密度档次:

  1. 低密度(Low-density):16KB ~ 32KB,比如经典的STM32F103C6T6

  2. 中密度(Medium-density):64KB ~ 128KB,比如我们使用的、经典的STM32F103C8T6

  3. 高密度(High-density):256KB ~ 512KB,比如STM32F103RCT6

  4. 超高密度(XL-density): 512KB ~ 1MB,比如STM32F103ZET6

从作用来说,闪存很类似通用计算机系统当中的外存(硬盘),都是用于长期保存程序数据且断电数据不丢失。

但闪存是直接集成到MCU内部的,属于MCU的一部分,属于片内资源,而不属于"外"。在现代微控制器中,Flash 存储器通常取代了传统的ROM,用于存储程序代码和长期保存的数据。

系统结构

Gn!

上面我们讲过,STM32F103C8T6微控制器可以视为一台独立的微型计算机,即所谓单片机。其系统结构可以用下图来描述:

STM32F103C8T6-系统结构图

这张图展示了 STM32F103C8T6 单片机的内部硬件模块及其相互连接的关系。

下面我们尽量把这张结构图给大家讲清楚,大家也要尽量去弄明白这张图。理解这张图对后续课程的学习,会有很大的帮助。

但即便现在没有弄明白也没有关系,因为随着学习进度的深入,再回头看这些内容,相信会有不一样的收获。

片内外设

Gn!

外设(Peripheral)是嵌入式系统或计算机系统中的一个术语,它指的是核心处理器(如 CPU 或微控制器的内核)之外,用于完成特定功能的硬件模块。

所谓片内外设,则专指微控制器这台微型计算机系统,它除了集成核心处理器外,还直接把外设都集成到了芯片内部,所以称之为片内外设。

片内外设是一个特别常用的专有名词,大家要记住它!

需要注意以下几点:

  1. 存储器虽然也在核心处理器之外,但一般不把存储器视为外设,存储器作为一个单独的存储模块和核心处理器交互。

  2. 上图中的片内外设资源可以分为两大类:

    1. 功能模块:直接提供特定功能的硬件模块(如TIM定时器、DMA、GPIO等)

    2. 通信外设接口:用于连接和通信外部设备的接口模块(如 SPI、USART、I2C接口等)

  3. 外设通过总线与核心处理器连接,由芯片处理器控制片内外设实现各种功能。

  4. 实际上,STM32入门的学习就是学会利用芯片来操作各种片内外设,从而实现各种功能。

总线是什么呢?

总线是计算机系统中用来连接各个功能模块(如处理器、存储器、外设等)的通信通道,是一种共享的通信介质。可以把总线看作系统中所有模块之间数据传递的“高速公路”。

片内外设是我们后续课程学习的重点与核心,这里我们先暂时了解一下,知道这个概念即可。

哈弗结构

Gn!

为了更好的理解这张系统结构图,我们需要先了解两种经典的计算机体系结构模型:

  1. 冯诺依曼结构

  2. 哈弗结构

冯诺依曼结构

冯·诺依曼结构由计算机科学家约翰·冯·诺依曼在 1945 年提出,冯诺依曼结构最主要的特点是将程序指令和数据存储在同一个存储器中,使用相同的总线传输指令和数据。

冯诺依曼结构的优点是:

  1. 设计简单,易于实现,成本低:数据和指令共用一个存储器,硬件实现更简单,成本更低。

  2. 易于开发:统一的存储器和总线设计使软件开发更容易。

  3. 灵活:使用单一存储器存放指令和数据,存储器可以根据程序需求动态分配。

但冯诺依曼结构的缺点也显而易见:

  1. 并行效率低:由于程序指令和数据的读写共用一条总线,无法做到同时取指令和数据,限制了处理器的并行效率。

  2. 冯诺依曼瓶颈:存储器的性能远低于CPU,而程序指令和数据又存储在同一个存储器中,进一步成为了性能瓶颈。

从成本、灵活性且够用的角度出发,通用型计算机(PC、笔记本电脑等)大都采用冯·诺依曼结构。

哈弗结构

在 20 世纪 40 年代,哈佛大学的研究人员提出了一种计算机体系结构模型,它的特点是:将程序指令和数据分别存储在不同的存储器当中,并通过独立的总线分别进行访问。后人就把这种设计的计算机结构,称之为"哈弗结构"。

所以哈弗结构和冯诺依曼结构最主要的区别就是,是否单独存储程序指令和数据。

哈弗结构的优势显而易见:

  1. 并行效率高:独立的存储器和总线设计消除了指令和数据之间的总线争用,可以大幅提高处理器的并行效率。

  2. 指令和数据隔离,提升安全性:指令存储器和数据存储器的分离,使得程序指令的存储和运行相对独立,不易受到数据区的干扰和破坏,提高了系统的可靠性和稳定性。

但哈弗结构的劣势也很明显:设计复杂、成本更高、开发难度高、灵活性差。

由于嵌入式领域,恰好需求高实时性,且需要在资源受限的情况下发挥更强的性能,哈弗结构计算机是嵌入式领域大多情况下的选择。

下图指出了冯诺依曼结构和哈弗结构的区别:

冯诺依曼和哈弗结构-框图

下面的表格对比:哈佛结构 vs 冯·诺依曼结构

哈佛结构 vs 冯·诺依曼结构
对比项冯·诺依曼结构哈佛结构
存储器组织指令和数据共享一个存储器指令和数据存储在两个独立的存储器中
总线设计指令和数据共用一条总线指令和数据各自使用独立的总线
并行性不能并行取指令和访问数据(总线争用)可以并行取指令和访问数据(总线独立)
性能性能较低,总线带宽可能成为瓶颈性能较高,总线带宽独立,不存在冲突
硬件复杂度简单,设计和实现成本低复杂,设计和实现成本较高
典型应用通用计算机嵌入式系统、实时系统

我们再回到STM32F103C8T6的系统结构图,这台微型计算机,它属于冯诺依曼结构,还是哈弗结构?

当然属于哈弗结构,因为它分离了程序指令存储器和数据存储器。如下图所示:

STM32F103C8T6-存储器图

下面我们把这张图,分为两个部分(或者三部分)来讲解,具体的划分方式如下图所示:

STM32F103C8T6-系统结构分解图

下面分部分逐一的讲解这张图。

部分一:核心处理器

Gn!

STM32F103C8T6的核心处理器是ARM Cortex-M3内核(左上角),处理器的作用是执行程序指令,处理中断,控制外设等。

这个内核是ARM设计的,除了中央处理器,也就是CPU外,还有两个部分需要我们注意:

  1. 嵌套向量中断控制器( Nested Vectored Interrupt Controller,NVIC)

  2. 系统时钟(SysTick)

从图中我们可以看到核心部分与外界沟通的方式是三条总线

  1. ICode 总线(Instruction Code Bus),即指令总线。

  2. DCode 总线(Data Code Bus),即数据总线。

  3. System总线,即系统总线。

上述提到的三条总线主要的作用是什么呢?我们继续看第二部分。

部分二:存储器部分

Gn!

存储器部分主要包含两个模块(右上角):

  1. Flash闪存模块。

    1. 用于存储程序代码指令和部分静态数据(如常量)。

    2. 实际上就是哈弗架构计算机中的指令存储器,类似通用计算机系统中的外存。

  2. SRAM静态随机存储器模块。

    1. 用于存储存储程序运行时的临时变量数据。

    2. 实际上就是哈弗架构计算机中的数据存储器,类似通用计算机系统中的内存。

即便是在没有操作系统概念的情况下,STM32 的嵌入式系统中仍然存在 数据段 等概念。

也就是说以前我们在C语言当中学习的,变量分为局部变量、全局变量、静态变量等,同时还存在栈(函数调用,局部变量)堆(动态内存分配)的概念,到了嵌入式系统中,这些概念同样存在,特点及其使用方式也是一样的。

这些变量都存储在SRAM当中、栈的分配以及堆空间的动态分配也都是在SRAM当中完成的。

STM32F103C8T6的SRAM大小仅有20KB,在资源如此受限的情况下,非常考验程序员对内存的管理。当然,嵌入式系统往往不会涉及复杂的程序,所以大家也不必过分担心内存问题。

一般来说,直接使用局部变量或者全局变量就可以了,动态内存分配在嵌入式系统中使用是比较罕见的(因为缺乏操作系统和必要硬件的支持,动态内存分配弊端很多,比如会产生内存碎片,所以尽量不要使用)。

上面我们还提到了三条总线连接了核心部分和存储器部分,下面介绍一下三条总线的作用。

Flash闪存

Gn!

ICode 总线和Dcode总线负责核心与Flash闪存之间的数据交互。

其中:

  1. ICode 总线专门用于处理器从Flash存储器中读取指令代码,是处理器和Flash存储器交互的主要途径。

  2. Dcode总线的作用有两个:

    1. 用于辅助从Flash存储器中读取指令代码

    2. 用于从Flash存储器中读取常量数据,比如代码中的字符串常量。

一般情况下,ICode 总线 和 DCode 总线 不与 SRAM 直接交互。它们的任务是从 Flash 存储器 读取指令或常量数据。

ICode总线 和 DCode总线 的区别如下表所示:

ICode总线 vs DCode总线
特性ICode 总线DCode 总线
用途用于读取指令代码用于读取或写入数据,以及部分代码访问
访问对象Flash中存储的代码指令Flash 中的常量、部分代码指令
优先级较高较低

ICode指令总线的优先级是高于Dcode数据总线的。

SRAM

Gn!

SRAM用于存储程序运行时的变量数据,而System总线与总线矩阵紧密集成,能够以较高的带宽和低延迟实现对 SRAM 的访问。

System系统总线是一条核心的总线,它的作用之一就是和SRAM模块进行数据交互。

处理器可以通过 System 总线不断地从 SRAM 中获取变量值并进行处理,或将处理结果写回 SRAM。

当 ICode 总线 读取指令时,System 总线 可以同时访问 SRAM 中的变量,避免冲突和等待,提升处理效率。这就是哈弗结构的典型特征。

部分三:片内外设资源

Gn!

Cortex-M3 核心处理器通过System总线,连接到 总线矩阵,再通过AHB系统总线(Advanced High Performance Bus,即先进高性能总线)连接到所有的片内外设资源。

直接和AHB系统总线连接的外设资源有:

  1. FSMC(Flexible Static Memory Controller,灵活静态存储器控制器):

    1. 用于连接外部存储器,提供对外部存储器的高速访问。

    2. 嵌入式系统很少外接外存储器,这个外设我们后面也不会讲。

  2. SDIO(Secure Digital Input Output):用于与 SD 卡或其他外部存储设备通信,通过 AHB 系统总线实现高速数据传输。

  3. 复位和时钟控制(RCC,Reset and Clock Control):提供复位和时钟支持,用于管理片内所有外设的时钟启停与分频,是基本且重要的片内外设资源。

AHB系统总线通过桥接连接到APB1和APB2两个外设总线上,这两个外设总线上又连接着一大堆片内外设资源。

APB的意思是Advanced Peripheral Bus,即先进外设总线,用于连接一般的外设。由于APB和AHB两种总线在总线协议、总线速度、数据传输格式等方面具有差异性,所以需要要经过两个桥接来完成转换连接。

AHB系统总线的性能比APB外设总线的性能要高一些,其中APB2的性能又比APB1的性能要高一些。

所以APB2连接的又是这些外设中相对更重要常用的一些外设,比如:

  1. 所有GPIO

  2. 某种类型外设中的1号选手,比如USART1、TIM1、SPI1、ADC1等。

当然APB1和APB2的性能差异没有大到肉眼可见,所以不需要过度关注它们的性能差异。

但是一定要弄清楚哪个外设挂载到哪个APB总线上,这对后续编程实现功能是至关重要的。例如,不同总线上的外设可能有不同的时钟配置。

部分四:DMA

Gn!

DMA(Direct Memory Access,直接存储器访问)既是一种数据传输技术,又是微控制器中重要的片内外设资源,所以我们单独划分一个部分来讲这个内容。

DMA 可以视为 CPU 功能的补充,承担着 CPU 的助理或者秘书的工作。举一个例子:

现在有大量的数据需要从存储器搬到外设中,或者从外设搬到存储器中。这种简单且重复的数据搬运工作如果让 CPU 来完成,不仅浪费时间,还会降低整体系统的性能。

而 DMA 的作用就是代替 CPU,让外设和存储器之间能够直接传输数据,节省下 CPU 的时间,从而使 CPU 专注于其他更重要的任务(如算法处理或控制逻辑),提升系统性能同时也降低了功耗。

DMA 通过 DMA 总线连接到总线矩阵,再通过 AHB 总线连接到所有的外设和存储器。DMA 拥有和 CPU 一样的访问权限,通过总线矩阵获取总线控制权,完成数据搬运。

当外设需要搬运数据时,外设会触发事件(如数据接收完成、转换完成等)通过请求线向 DMA 发出请求,DMA 随后获取总线控制权,直接访问外设和 SRAM,完成数据的转运。整个过程 CPU 不需要参与,从而可以腾出时间处理更重要的任务。这就是 DMA 的核心用途。

关于DMA的使用,大家了解这些即可。

OK,到这里,这张图大体上就讲了一遍,大家留个印象,也不需要记住。如果有疑问,也不用着急,后续课程这张图中的功能模块我们都会一一学习。

附录:片内外设资源汇总表

Gn!

STM32F103C8T6 的片内外设资源,可以参考以下表格。我们后续的学习,主要就是学习这些片内外设资源的使用。

STM32F103C8T6 的片内外设资源汇总表
类别外设资源描述
NVIC嵌套向量中断控制器管理系统中断,支持优先级配置和中断嵌套。
SysTick系统滴答定时器提供系统时基,通常用于操作系统的时间管理。
复位与时钟控制RCC(Reset and Clock Control)管理复位和时钟配置,为所有外设提供时钟支持,支持时钟启停与分频配置。
GPIOGPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG通用输入输出引脚,支持数字输入、输出、复用功能和外部中断。
AFIO复用功能 I/O配置 GPIO 的复用功能(如外部中断、串口复用等)。
EXTI外部中断提供对 GPIO 外部中断的支持,最多支持 16 个中断通道。
定时器TIM1、TIM8(高级定时器)支持 PWM、死区控制、计数器同步等复杂功能,适合电机控制等复杂应用。
 TIM2、TIM3、TIM4、TIM5(通用定时器)支持基本计时、输入捕获、输出比较和 PWM 功能,广泛用于一般控制任务。
 TIM6、TIM7(基本定时器)仅支持简单的时间基准功能,不能用于输入捕获或 PWM。
通信接口USART1、USART2、USART3支持同步/异步通信(UART/USART),用于串口通信。
 I2C1、I2C2支持多主多从通信模式,用于与传感器、存储设备通信。
 SPI1、SPI2支持全双工高速通信,常用于与外部存储设备或屏幕通信。
 CAN(Controller Area Network)支持工业和汽车通信的控制器局域网络协议。
 SDIO(Secure Digital Input Output)用于与 SD 卡通信,支持高速数据传输。
ADCADC1、ADC2两个 12 位模数转换器,支持多通道采样和扫描模式,最大支持 16 个输入通道。
DACDAC(Digital-to-Analog Converter)一个 12 位数模转换器,用于输出模拟信号(如波形生成)。
DMADMA1、DMA2用于外设和存储器之间的高效数据传输,支持多通道和优先级配置。
看门狗独立看门狗(IWDG)、窗口看门狗(WWDG)提供系统复位功能,防止程序死锁或超时。
存储控制器FSMC(Flexible Static Memory Controller)用于连接外部存储器(如 NOR Flash、SRAM),提供高速访问能力(常用于高端系统)。
实时时钟RTC(Real-Time Clock)提供低功耗的时钟和日期功能,支持备用电池供电。
备份寄存器BKP(Backup Registers)用于存储重要数据,在断电或复位时不会丢失,适合存储 RTC 配置等信息。

或者下面这张表:

STM32F103C8T6 片内外设资源汇总(最终版本)
英文缩写中文名称描述
NVIC嵌套向量中断控制器管理系统中断,支持优先级配置和中断嵌套。
SysTick系统滴答定时器提供系统时基,通常用于操作系统的时间管理。
RCC复位和时钟控制管理复位和时钟,为外设提供时钟支持,支持时钟启停与分频配置。
GPIO通用输入输出口通用 I/O 引脚,支持数字输入、输出、复用功能和外部中断。
AFIO复用功能 I/O配置 GPIO 的复用功能(如外部中断、串口复用等)。
EXTI外部中断提供对 GPIO 外部中断的支持,最多支持 16 个中断通道。
TIM定时器包括高级定时器(TIM1、TIM8)、通用定时器(TIM2、TIM3、TIM4、TIM5)和基本定时器(TIM6、TIM7)。
ADC模数转换器3 个 12 位 ADC(ADC1、ADC2、ADC3),支持多通道采样和扫描模式,适合信号采集。
DMA直接内存访问DMA1(7 通道)和 DMA2(5 通道),支持高效数据搬运,减轻 CPU 负担。
USART同步/异步串口通信包括 USART1、USART2、USART3,用于串行通信,支持同步和异步模式。
I2CI2C 通信提供 2 个 I2C 接口(I2C1、I2C2),支持多主多从通信,适合传感器和存储设备的通信。
SPISPI 通信提供 2 个 SPI 接口(SPI1、SPI2),支持全双工高速通信,常用于外部存储设备或显示屏通信。
CANCAN 通信支持工业和汽车通信的控制器局域网协议(CAN 协议)。
USBUSB 通信支持 USB 通信,用于与主机的设备通信。
SDIOSD 卡接口用于与 SD 卡通信,支持高速数据传输。
FSMC可变静态存储控制器用于连接外部存储器(如 NOR Flash、SRAM),提供高速访问能力,适合高端嵌入式系统。
RTC实时时钟提供低功耗的时钟和日期功能,支持备用电池供电。
CRCCRC 校验用于循环冗余校验(CRC),常用于数据完整性校验。
PWR电源控制管理芯片的低功耗模式(如休眠、待机)。
BKP备份寄存器提供少量掉电保持的寄存器,用于存储重要数据(如 RTC 配置)。
IWDG独立看门狗提供系统复位功能,防止程序死锁。
WWDG窗口看门狗提供系统复位功能,可配置时间窗口,防止程序超时。
DAC数模转换器一个 12 位 DAC(数模转换器),用于生成模拟波形(如正弦波、方波等)。
USB OTGUSB 主机接口提供 USB OTG 功能,可作为主机与设备通信。

引脚定义(重要)

Gn!

首先,我们查阅《STM32F103数组手册》来获取我们心态的引脚定义图,由于我们使用的是STM32F103C8T6微处理器,它的封装工艺是LQFP,具有48引脚。根据这个线索,我们可以找到下面这张图:

STM32F103C8T6-引脚定义图

下面我们来解释一下这张图。

引脚编号规则

Gn!

对于STM32微处理器来说,以小圆点在芯片左上方为基准,它的一般引脚编号规则如下图所示:

引脚编号规则-图

在上面这张图中,我们也是找到这个小圆点,它的左边是1号引脚,然后按照逆时针递增,到小圆点的上方达到最大引脚编号,即48号引脚。

引脚编号规则-图2

上图就展示一个实物图的编号,当然大家也可以直接拿出手头的板子,直接看。只要不是过分视力不好,都是很容易找到小圆点和1号引脚的。

特殊引脚

Gn!

在这一共48个引脚当中,有11个引脚是具有特殊功能的特殊引脚,如下图所示:

特殊引脚-示意图

其中红色部分的特殊引脚,作用都和供电有关:

  1. VBAT(Battery Voltage)备用电池供电引脚,可以使用一个纽扣电池(一般是3V)给STM32芯片内部供电,以维持部分功能(比如内部时钟)的运转。我们使用的最小系统板没有接入备用电池,本课程暂时也不会涉及到。

  2. VDD:电源正极供电引脚,STM32都采用3.3V供电。

  3. VSS:接地,即0V低电势。

黄色部分的两个引脚,具有特殊的功能:

NRST复位引脚:

在最小系统板中,该引脚上连接了一个复位按钮,按下复位按钮后可以让MCU回归初始状态,从头开始执行程序。

我们都是编写C语言程序烧录到单片机中执行,所以复位按键,实际上就是从头开始执行main函数。

复位按钮-图

当我们需要从头开始执行程序时,比如重新上电,或者程序出现异常需要重新启动时,就可以点击这个复位按钮。

BOOT0启动模式选择引脚:

在48个引脚中,实际上有两个引脚和启动模式选择有关,即BOOT0和BOOT1引脚,具体可以参考下面的《引脚定义查阅表》。

而到了最小系统板当中,为了方便用户选择启动模式,直接使用了两个跳线帽来连接BOOT0和BOOT1引脚,如下图所示:

启动模式选择引脚-图

大家也可以拿起自己手上的最小系统板查看,在默认的情况下,两个跳线帽都连接在左边,表示低电平0,即BOOT0和BOOT1引脚都是低电平0。

那么这代表什么意思呢?可以参考下面表格:

MCU的三种启动模式
启动模式的引脚电平==启动模式作用说明
BOOT0BOOT1::
0X(任意)主闪存启动模式MCU从用户程序所在的 Flash 存储器执行代码,正常运行用户应用程序。
10系统存储器启动模式MCU运行ST官方预置的 BootLoader,支持串口烧录、下载固件程序。
11内置SRAM启动模式MCU直接从SRAM中执行代码,一般用于调试程序。

注意事项:

  1. 默认和大多数情况下,MCU都会选择主闪存模式启动,从Flash中读取用户程序启动。

  2. 系统存储器启动模式可以让用户在不使用仿真调试器的情况下,来进行程序的烧录和下载、调试等。

  3. SRAM启动模式主要用于进行程序调试,由于SRAM断电易失,所以需要在启动前使用仿真调试器、或者串口下载的方式将代码加载到SRAM中。这种模式,我们暂时也不需要使用,调试程序使用正常模式启动对我们而言,也是足够的。

  4. BOOT1引脚实际上就是PB2引脚,而且该引脚仅在上电启动的一瞬间发挥BOO1引脚选择启动模式的作用,在启动完成后,该引脚就会回归PB2引脚的作用,就会成为一个普通的IO引脚。

普通引脚及其命名规则

Gn!

除了上述提到的11个具有特殊功能的引脚外,剩下的37个引脚都属于普通引脚,也叫普通IO引脚,全称是通用输入/输出(General - Purpose Input/Output,GPIO)引脚

我们已经知道GPIO作为片内外设,一共有四个:GPIOA、GPIOB、GPIOC、GPIOD

于是我们以字母作为组编号,以数字作为引脚序号,来给这37个普通引脚命名:

  1. 挂载在GPIOA上的,一共有16个引脚,它们是:PA0、PA1、PA2...PA15

  2. 挂载在GPIOB上的,一共有16个引脚,它们是:PB0、PB1、PB2...PB15

  3. 挂载在GPIOC上的,一共有3个引脚,它们是:PC13、PC14、PC15

  4. 挂载在GPIOD上的,一共有2个引脚,它们是:PD0、PD1

注意:其中PD0和PD1引脚常用于配置启用外部晶振,通常都不能用于普通IO引脚,最小系统板上也没有将这两个引脚引出。

如何理解GPIO外设上挂载的引脚呢?

可以将某个GPIO外设理解成"人"的一只手,而为了让这只手发挥作用,就需要控制它的手指来完成动作,手指就是这些挂载到GPIO外设上的普通引脚。(当然,这个人可能手有点多,手指也比较多...)

后续我们操作某个GPIO外设实现功能,都是通过操作此GPIO上的某个引脚来实现的。

注意事项:

  1. 通过查看引脚定义图,我们可以很容易发现普通引脚并不是完全连续排布的,比如PA1~PA7是在一起的,PA8则要跳到芯片另一边去了。

  2. 普通引脚的主要功能是IO,但程序员可以通过复用、重定义操作来改变普通引脚的功能,具体功能可以查看下面的《引脚定义查阅表》。

引脚定义表(供查阅)

Gn!

引脚是我们后续学习STM32的核心,结合我们上面讲的片内外设,可以说:"我们学习STM32,就是学习使用引脚来控制各种外设"。

所以这里,我也直接给出一张总表以供大家查阅,不要试图去背住它,用多了,常用的自然就记住了。

表格数据整理来源于《STM32F103 系列数据手册》,STM32F103C8T6 芯片引脚数据定义表格:

引脚定义表
引脚号引脚名称类型I/O 口电平主功能默认复用功能重定义功能
Rd!1Rd!VBATRd!电源Rd!/Rd!VBATRd!/Rd!/
2PC13-TAMPER-RTCI/O/PC13TAMPER(入侵检测)功能、RTC(实时时钟)功能/
3PC14-OSC32_INI/O/PC14OSC32_IN,连接 32.768kHz 的晶振输入/
4PC15-OSC32_OUTI/O/PC15OSC32_OUT,作为 32.768kHz 晶振电路的输出引脚/
Ye!5Ye!OSC_INYe!IYe!/Ye!OSC_IN(外部高速晶振(HSE)的输入)Ye!/Ye!/
Ye!6Ye!OSC_OUTYe!OYe!/Ye!OSC_OUT(外部高速晶振(HSE)的输出)Ye!/Ye!/
Ye!7Ye!NRSTYe!I/OYe!/Ye!NRSTYe!/Ye!/
Rd!8Rd!VSSARd!电源Rd!/Rd!VSSARd!/Rd!/
Rd!9Rd!VDDARd!电源Rd!/Rd!VDDARd!/Rd!/
10PA0-WKUPI/O/PA0WKUP/USART2_CTS/ADC12_IN0/TIM2_CH1_ETR/
11PA1I/O/PA1USART2_RTS/ADC12_IN1/TIM2_CH2/
12PA2I/O/PA2USART2_TX/ADC12_IN2/TIM2_CH3/
13PA3I/O/PA3USART2_RX/ADC12_IN3/TIM2_CH4/
14PA4I/O/PA4SPI1_NSS/USART2_CK/ADC12_IN4/
15PA5I/O/PA5SPI1_SCK/ADC12_IN5/
16PA6I/O/PA6SPI1_MISO/ADC12_IN6/TIM3_CH1TIM1_BKIN
17PA7I/O/PA7SPI1_MOSI/ADC12_IN7/TIM3_CH2TIM1_CH1N
18PB0I/O/PB0ADC12_IN8/TIM3_CH3TIM1_CH2N
19PB1I/O/PB1ADC12_IN9/TIM3_CH4TIM1_CH3N
Ye!20Ye!PB2Ye!I/OYe!FTYe!PB2/BOOT1Ye!/Ye!/
21PB10I/OFTPB10I2C2_SCL/USART3_TXTIM2_CH3
22PB11I/OFTPB11I2C2_SDA/USART3_RXTIM2_CH4
Rd!23Rd!VSS_1Rd!电源Rd!/Rd!VSS_1Rd!/Rd!/
Rd!24Rd!VDD_1Rd!电源Rd!/Rd!VDD_1Rd!/Rd!/
25PB12I/OFTPB12SPI2_NSS/I2C2_SMBAI/USART3_CK/TIM1_BKIN/
26PB13I/OFTPB13SPI2_SCK/USART3_CTS/TIM1_CH1N/
27PB14I/OFTPB14SPI2_MISO/USART3_RTS/TIM1_CH2N/
28PB15I/OFTPB15SPI2_MOSI/TIM1_CH3N/
29PA8I/OFTPA8USART1_CK/TIM1_CH1/MCO/
30PA9I/OFTPA9USART1_TX/TIM1_CH2/
31PA10I/OFTPA10USART1_RX/TIM1_CH3/
32PA11I/OFTPA11USART1_CTS/USBDM/CAN_RX/TIM1_CH4/
33PA12I/OFTPA12USART1_RTS/USBDP/CAN_TX/TIM1_ETR/
Ye!34Ye!PA13Ye!I/OYe!FTYe!JTMS/SWDIOYe!/Ye!PA13
Rd!35Rd!VSS_2Rd!电源Rd!/Rd!VSS_2Rd!/Rd!/
Rd!36Rd!VDD_2Rd!电源Rd!/Rd!VDD_2Rd!/Rd!/
Ye!37Ye!PA14Ye!I/OYe!FTYe!JTCK/SWCLKYe!/Ye!PA14
38PA15I/OFTJTDI/TIM2_CH1_ETR/PA15/SPI1_NSS
39PB3I/OFTJTDO/PB3/TRACESWO/TIM2_CH2/SPI1_SCK
40PB4I/OFTNJTRST/PB4/TIM3_CH1/SPI1_MISO
41PB5I/OFTPB5I2C1_SMBAITIM3_CH2/SPI1_MOSI
42PB6I/OFTPB6I2C1_SCL/TIM4_CH1USART1_TX
43PB7I/OFTPB7I2C1_SDA/TIM4_CH2USART1_RX
Ye!44Ye!BOOT0Ye!IYe!/Ye!BOOT0Ye!/Ye!/
45PB8I/OFTPB8TIM4_CH3I2C1_SCL/CAN_RX
46PB9I/OFTPB9TIM4_CH4I2C1_SDA/CAN_TX
Rd!47Rd!VSS_3Rd!电源Rd!/Rd!VSS_3Rd!/Rd!/
Rd!48Rd!VDD_3Rd!电源Rd!/Rd!VDD_3Rd!/Rd!/

名词解释

Gn!

名词解释:

  1. I/O 口电平:指此IO引脚能够容忍的电压输入大小,若此IO口的该列值为FT则表示能够容忍最大5V电压的输入,否则只能容忍3.3V电压输入。

  2. 主要功能:指引脚在未经过任何特殊配置时所具备的原始的、基础的功能。

  3. 默认复用功能:指引脚在特定配置下,可以承担的预定义的替代功能。比如在使用 USART 进行串口通信时,就可以将PA9和PA10两个普通IO引脚复用为 USART1_TX(发送端)和 USART1_RX(接收端)。

  4. 重定义功能:也称为引脚重映射,是指通过软件配置,将微控制器内部某个外设的功能分配到不同的物理引脚上。仍然拿USART 进行串口通信举例,假如PA9和PA10两个引脚已经作为普通IO口使用了,那么还想使用USART1_TX和USART1_RX怎么办呢?通过查表,就可以把PB6和PB7重定义为USART1_TX和USART1_RX功能引脚。

在学习的初期,我们使用引脚都只会使用简单的引脚主功能,这个表格大家简单看看,尝试去理解它,不要尝试去背吧。

千万不要因为表格内容很多就觉得苦恼或麻烦,事实上当你真的完全理解这张表格时,你已经熟练精通STM32了。

颜色解释

Gn!

关于表格的颜色与格式的解释:

  1. 标注红色的引脚,由于主功能就是IO功能,是推荐日常优先选择的引脚。

  2. 阴影红色的引脚是电源相关的引脚,黄色阴影的引脚则为最小系统板相关的特殊引脚。

仿真调试器和调试接口

Gn!

编号34、37、38、39、40的这五个引脚虽然是IO口,但它们的主功能却不是IO功能,而是调试功能,像JTMS/SWDIO、JTCK/SWCLK等都是调试接口。

如下表所示:

引脚号引脚名称类型I/O口电平主功能复用功能重定义功能
Ye!34Ye!PA13Ye!I/OYe!FTYe!JTMS/SWDIOYe!/Ye!PA13
Ye!37Ye!PA14Ye!I/OYe!FTYe!JTCK/SWCLKYe!/Ye!PA14
38PA15I/OFTJTDI/TIM2_CH1_ETR/PA15/SPI1_NSS
39PB3I/OFTJTDO/PB3/TRACESWO/TIM2_CH2/SPI1_SCK
40PB4I/OFTNJTRST/PB4/TIM3_CH1/SPI1_MISO

既然说到了调试,那我们可以回顾一下之前我们使用VS来调试C语言程序。我们编写代码,直接使用VS的debug模式就可以实现调试程序了,非常简单,整个过程完全不需要借助任何外部的硬件、软件。

之所以这样,是因为在传统软件调试的过程中,IDE只需要调用操作系统提供的调试API就可以了。

那么在嵌入式系统中,IDE(Keil5)也可以直接像VS一样实现调试功能吗?

当然不可以,嵌入式系统往往没有操作系统,即便有也都是很简陋的,不会对外提供调试的支持。

为了实现调试功能,STM32提供了上述5个引脚的调试接口,通过这些调试接口,外界就可以控制单片机内部程序的执行与暂停,以及查看程序运行时的状态。

这5个调试接口可以分为两类,对应两个主流的仿真器:

  1. ST-LINK仿真器,它需要接入两个调试接口,即34和37号引脚的SWDIO、SWCLK接口。

  2. J-LINK仿真器,它需要接入五个调试接口,上面的5个接口都需要接入。

我们课程使用的仿真器是ST-LINK,它是由STMicroelectronics(意法半导体) 公司官方提供的一款仿真器,如下图所示:

ST-LINK仿真器-图

几个常见的小问题:

1.仿真器的主要作用是什么?

仿真器的主要作用是:

  1. 供电:ST-LINK支持3.3V和5V两种供电模式。

  2. 下载程序:将编译后的程序烧录到微控制器的Flash中。

  3. 实时调试:支持单步执行、设置断点、监视变量和寄存器等。

  4. 监控执行:能够实时监控程序的运行状态,捕捉异常和中断。

2.仿真器为什么叫仿真器?我感觉它应该叫调试器。

对于硬件仿真器而言,它们通过专用的调试接口(如SWD、JTAG)来和微控制器进行通信,实现了调试功能。

这个调试过程,某种程度上“仿真”了程序的执行流程,允许开发者在受控环境中观察和修改程序的行为。所以这种硬件设备被称之为"仿真器"。

当然之所以叫仿真器也有一部分历史原因,大家知道就行。

所谓的仿真器,实际上就是硬件调试器。

3.有了仿真器是不是可以直接不买芯片做实验?

了解了仿真器的原理,就不难发现,仿真器的仿真是通过和MCU通信实现的,所以仿真器是不能脱离硬件使用的。

若想要完全脱离硬件,像做纯软件一样搞嵌入式,其实也不是不可能,可以使用专用的"仿真软件"来模拟硬件环境实现,不过本课程就不涉及这方面内容了。

STM32F103C8T6最小系统板

Gn!

如果仅有一个单独的MCU是无法工作的,需要为它配置必要的外围电路,也就是最小系统电路,整个板子就叫做最小系统板。

在本章节的最后,我们把STM32F103C8T6最小系统板的整体构成全部讲一遍。参考下图:

STM32F103C8T6最小系统板-图

本章节所讲内容来自于文档《STM32F103C8T6核心板原理图》。

外围排针

Gn!

STM32F103C8T6最小系统板的外围,上下各20个,一共是40个排针。

正如图上所说,这40个排针用于引出部分芯片引脚,目的是方便外部电路去连接这些引脚。(毕竟不可能直接把设备连到芯片的引脚上去)

这些排针和芯片引脚的连接关系,如下图所示:

外围排针-图示

最小系统板上的丝印会印着这个排针对应的名字,比如A0就表示它连接PA0引脚,同样的C15就表示它连接PC15引脚...

同时在最小系统板的最右边,也存在4个排针,它们用于连接ST-LINK仿真器用于烧录、以及调试程序。

USB接口

Gn!

图中1号位置就是一个USB接口,它可以实现供电和USB通信数据传输两个主要功能。

需要注意的是,电脑的USB接口提供的是5V供电,而最小系统板上的USB接口通过一个3.3V转换电路,将电压降低到了3.3V。

启动模式选择跳线帽

Gn!

图中2号位置是两个跳线帽,它用于选择MCU的启动模式,在上文中已经详细介绍过了,这里略过。

复位按钮

Gn!

图中3号位置是一个复位按钮,它连接到芯片的NRST引脚,其作用在上文中已经详细介绍过了,这里略过。

MCU本体

Gn!

图中4号位置就是STM32F103C8T6微控制器本体,在上文中已经详细介绍过它了,这里略过。

PWR电源指示灯

Gn!

在丝印PWR旁边有一个LED灯,PWR是电源"Power"的缩写,所以这个灯就是电源指示灯。

但使用任何方式给最小系统板供电时,该灯就会亮起。

需要注意的是:PWR电源指示灯没有和芯片任何引脚相连,MCU是不能控制该灯亮灭的,它就是一个单独指示供电的LED。

PWR电源指示灯-电路图

VCC和GND以及限流电阻,共同构建了一个完整的电路。

PC13指示灯

Gn!

在丝印PC13旁边有一个LED灯,显然这个灯是一个受微控制器PC13引脚控制的LED指示灯。其电路图如下图所示:

PC13指示灯-电路图

很明显,我们可以写程序,通过MCU来控制PC13引脚的高低电平,从而点亮或熄灭这个灯,那么应该怎么做呢?

至此,我们全部的前置知识点终于讲完了,下面我们来完成STM32的第一个实验(万里长城的第一步):控制PC13指示灯。

这个实验就像我们刚开始学习C语言,写下的第一个"hello world"一样,它就是我们嵌入式学习的"hello world",当然这个"hello world"的前摇可能有点长。

万事开头难,从0到1总是最艰难,也是最兴奋的,接下来让我带领大家成为一个"点灯大师"。

整个第二卷,我们就给它起一个名字,就叫它"HelloWorld"吧!

The End