ARM简介
ARM 是一家芯片内核设计公司,也是全球领先的半导体知识产权提供商。不过,ARM 公司自己不生产、也不销售任何物理的芯片,它以出售 ARM 内核的知识产权为主要模式。而全球顶尖的半导体公司(例如高通 、TI、NXP 等)均通过购买 ARM 的内核的设计方案,结合各自的技术优势,完善芯片结构并生产和销售芯片。
这种独特的商业模式的优势在于,ARM 可以专注于最核心的处理器设计,而它的客户则可以基于一个成熟、可靠、标准化的核心,快速开发出功能各异的芯片产品。也正是这种商业模式使 ARM 公司获得了快速的发展,目前全球几乎所有主流的智能手机和平板电脑的处理器都采用了 ARM 的内核,并且在 PC 机、服务器和嵌入式设备的市场占比也在逐渐上升。
ARM 最成功的产品线是 Cortex 处理器家族。为了满足从最小的传感器到最强大的处理器等不同场景的需求,ARM 将 Cortex 系列分成了三大分支,每个分支都有明确的定位:
- Cortex-A 系列面向应用(Application),拥有极致的运算速度和处理能力用于最高性能的应用处理器。它能够运行 Android、Windows 这样功能完备的操作系统,广泛应用于智能手机、平板电脑、笔记本电脑和服务器等设备里的主处理器。
- Cortex-R 系列面向实时(Real-time),拥有极快的中断响应能力和高度的容错性,用于对响应时间和可靠性有苛刻要求的场景。它主要用于汽车电子(如发动机控制、刹车系统、安全气囊)、工业自动化、以及硬盘控制器(SSD)等需要硬实时控制的领域。这些领域里,一次延迟可能就意味着严重事故。
- Cortex-M 系列面向微控制器(Microcontroller),旨在实现对硬件的直接、高效控制,用于成本和功耗敏感的嵌入式微控制器。包括智能手环、智能家居设备、打印机、传感器节点、无人机等都属于 Cortex-M 的应用。
Cortex-M 系列是本文要涉及到的内核。在 Cortex-M 系列内部,也有多种不同用途的产品,以下列举了一些比较经典的产品及其特点:
- Cortex-M0/M0+ 是入门级内核,具有极低功耗和成本,主要用于替代传统的 8 位/16 位单片机,执行一些简单的控制任务。
- Cortex-M3 在性能、功耗和成本之间取得了完美的平衡,它拥有硬件乘法器和除法器,中断处理能力也更强。对于绝大多数中等复杂度的嵌入式应用来说,它的性能绰绰有余。
- Cortex-M4 在 M3 的基础上,具有浮点运算单元并增加了数字信号处理相关指令,非常擅长处理音频、传感器数据等需要大量数学运算的任务。
- Cortex-M7 相比之下具有最高性能,拥有超标量流水线和缓存,性能更高,可以应对更复杂的图形界面和算法。

STM32微控制器简介
上文说了 ARM 仅设计芯片的内核部分,不设计或生产完整的芯片。而意法半导体(ST Microelectronics)正是一家这样的公司,它基于 ARM 的内核设计了自己的微控制器(microcontroller),主要有 32 位的 STM32 和 8 位的 STM8 。
STM32 是较早推向市场的 32 位微处理器,该系列产品具有成本低、功耗优、性能高、功能多等优势,并且具有完善的开发工具、丰富的软件库、庞大的社区与海量资料,因此自问世以来,它迅速成为全球最受欢迎的 MCU 之一,无论是个人爱好者项目还是商业产品开发,都能看到它的存在。
STM32 产品线极其丰富,它提供了入门级到高性能的一系列产品,方便用户根据自身需求选择需要的型号。下图列出了 STM32 主要的产品族:

从图中可以看出,STM32 主要有四个系列,覆盖了高性能、通用、低功耗和无线这些应用场景,每个系列中都有多个不同型号的产品,它们的性能、主频和采用的 ARM 内核都不尽相同,可以根据需要自由选择。
上图的 CoreMark 是一种广泛使用的嵌入式处理器性能测试指标。CoreMark 数字越高,意味着性能更高。
本系列文章在介绍时采用的型号是 STM32F1 中的 STM32F103 ,以下是它的参数简介:
- 基于 ARM Cortex-M3 内核
- 工作电压范围 2.0~3.6V ,建议供电电压 3.3V
- 系统频率 72MHz
在 STM32F103 这个型号内部,为了适应不同成本和功能需求,又分化出了多个子型号。它们的核心、主频、,主要区别在于三个方面:
- 存储器容量( Flash 和 SRAM )
- 外设的有无和多少(一些型号没有 DAC 、高级定时器和 FSMC 等高级外设,不同型号的定时器、ADC 外设数量也不尽相同)
- 引脚数量的多少(决定了能连接多少外部设备)
这些区别直接体现在芯片的型号命名上。一个典型的STM32F103型号是 STM32F103C8T6
,它型号的每一位字符的含义可以参考下图:

其中外设的有无和多少直接和处理器芯片闪存容量的大小有关。根据闪存容量的大小,STM32F103 又可以分为四大类:
产品类型 | 简记 | 闪存存储器容量 |
---|---|---|
小容量产品 (Low-density devices) | LD | 16K~32K 字节 |
中容量产品 (Medium-density devices) | MD | 64K~128K 字节 |
大容量产品 (High-density devices) | HD | 256K~512K 字节 |
超大容量产品 (XL-density devices) | XL | 768K~1M 字节 |
除此之外,还有两个缩写在编程过程中也会涉及到:
- VL 指的是 STM32F100 超值(Value Line)系列产品
- CL 指的是 STM32F105 和 STM32F107 互联型(Connectivity Line)系列产品
同一类产品拥有相同的外设,共享一份数据手册,编写的代码也是通用的。
STM32概览
%% STM32内部结构概览 %%
STM32的存储器组织
在 STM32 的内部结构中,存储器是一个很重要的组成部分。和大多数微处理器一样,STM32 将存储数据的 SRAM 、存储代码的 Flash 、控制硬件的各种寄存器统一编址,通过同样的访问指令(读/写)来控制这些资源。
STM32 是一个 32 位的微控制器,因此它拥有一个 4GB 的地址寻址范围(从 0x0000 0000
到 0xFFFF FFFF
)。下图展示了所有类型的存储器和它们所被安排的地址:
这里简要介绍一些关键的区域:
存储器总共分成两大类,其中 RAM(随机读写存储器)会在掉电后丢失数据。以 0x2000 0000
开头的地址是 SRAM 区,是程序运行过程中存储变量的位置。
属于 RAM 的还有外设寄存器,它的起始地址是 0x4000 0000
,这些寄存器是连接软件和硬件的关键桥梁。不同寄存器根据所在的外设,以及外设的特点被进一步划分在不同区域,从而方便管理。
另一类存储器 ROM(只读存储器)在掉电后不会丢失数据。Flash(闪存)存储器用于存储编译后的程序代码和程序中定义的常量,程序一般也从这里开始执行。它的起始地址是 0x0800 0000
,最终地址取决于它的容量。
系统存储器的用途是存储 bootloader 程序,它是一段用于引导串口下载的程序。bootloader 程序在芯片出厂时就被固化在芯片内,一般不能被修改。
ROM 区的最后是选项字节,主要用于配置 Flash 的读写保护、看门狗等。
此外,以 0xE000 0000
开头的区域是 Cortex-M3 内核相关的寄存器,它和 STM32 其余外设的地址是分开的。
最后要说明的是,STM32 的零地址实际上并没有对应的存储器,而是通过外部配置映射到 SRAM 区或 Flash 区,这一部分的具体细节在介绍 STM32 的 BOOT 引脚时有过一定说明。