1. STM32 概述
📌 本节学习目标
- 了解 ARM Cortex-M 处理器体系结构
- 掌握 STM32 系列产品线及选型方法
- 理解 STM32F103 芯片的内部架构
- 熟悉存储器映射和启动模式
1.1 ARM Cortex-M 体系
ARM Cortex-M 系列是 ARM 公司推出的微控制器处理器内核,专门面向嵌入式实时应用场景。
| 内核 | 架构版本 | 流水线 | 特点 |
|---|---|---|---|
| Cortex-M0 | ARMv6-M | 2 级 | 超低功耗、精简指令集、入门级 |
| Cortex-M3 | ARMv7-M | 3 级 | 哈佛架构、硬件乘除法、单周期乘法 |
| Cortex-M4 | ARMv7E-M | 3 级 | FPU、DSP 指令集 |
| Cortex-M7 | ARMv7E-M | 6 级 | 超高性能、Cache、TCM |
本课程使用的 STM32F103 基于 Cortex-M3 内核,具有 3 级流水线,采用哈佛架构(指令总线和数据总线分开)。
1.2 STM32 系列产品线
| 系列 | 定位 | 内核 | 典型型号 |
|---|---|---|---|
| STM32G0 | 超值入门 | Cortex-M0+ | STM32G030F6 |
| STM32F0 | 入门级 | Cortex-M0 | STM32F051C8 |
| STM32F1 | 通用型 | Cortex-M3 | STM32F103C8T6(课程用芯片) |
| STM32F4 | 高性能 | Cortex-M4 | STM32F407VGT6 |
| STM32L4 | 超低功耗 | Cortex-M4 | STM32L476 |
| STM32H7 | 旗舰型 | Cortex-M7 | STM32H743 |
1.3 STM32F103 内部架构
STM32F103C8T6 具有以下资源:
- ARM Cortex-M3 内核,最高主频 72MHz
- 64KB Flash,20KB SRAM
- 2 个 APB 总线:APB1(36MHz 上限)、APB2(72MHz 上限)
- 多种外设:GPIO × 37、USART × 3、SPI × 2、I2C × 2
- 定时器:高级定时器 × 1、通用定时器 × 3、基本定时器 × 1
- 2 个 12 位 ADC、1 个 DAC
1.4 存储器映射
STM32 采用统一编址方式(冯·诺依曼形式),所有外设寄存器、Flash、SRAM 都在同一地址空间内。
| 起始地址 | 大小 | 外设/存储器 | 总线 |
|---|---|---|---|
| 0x4000 0000 | — | 片上外设(GPIO、USART 等寄存器) | APB1/APB2/AHB |
| 0x2000 0000 | 20KB | SRAM | — |
| 0x0800 0000 | 64KB | Flash(主存储器,从地址 0 映射) | — |
| 0x1FFF F000 | — | 系统存储器(Bootloader) | — |
| 0xE000 0000 | — | Cortex-M3 内核外设(NVIC、SysTick) | — |
1.5 启动模式
STM32F103 通过 BOOT0 和 BOOT1 引脚选择启动模式:
| BOOT0 | BOOT1 | 启动区域 |
|---|---|---|
| 0 | X | Flash 主存储器(正常模式) |
| 1 | 0 | 系统存储器(ISP 下载) |
| 1 | 1 | SRAM(调试模式) |
1.6 地址映射是怎么一回事?
STM32 采用统一编址:寄存器、Flash、SRAM 都在同一个地址空间。访问外设就是访问对应的地址——这也是为什么后面实验经常写 *(volatile unsigned long *)0x40010C0C 这类代码。
C 代码(外设地址映射原理)
// 以 GPIOB 的 ODR(输出数据寄存器)为例,地址 0x40010C0C
#define GPIOB_ODR (*(volatile unsigned long *)0x40010C0C)
// 写这个"地址"就等于操作 GPIOB 的引脚输出:
GPIOB_ODR = 0x0000FFFF; // PB0~PB15 全部输出高电平
// 固件库里用结构体 + 基地址把这堆地址组织起来(stm32f10x.h):
#define GPIOB_BASE 0x40010C00
typedef struct
{
__IO uint32_t CRL; // 0x00 端口配置低寄存器
__IO uint32_t CRH; // 0x04 端口配置高寄存器
__IO uint32_t IDR; // 0x08 输入数据寄存器
__IO uint32_t ODR; // 0x0C 输出数据寄存器
__IO uint32_t BSRR; // 0x10 置位/复位寄存器
__IO uint32_t BRR; // 0x14 复位寄存器
__IO uint32_t LCKR; // 0x18 锁定寄存器
} GPIO_TypeDef;
// 之后就能用 GPIOB->ODR 这种直观写法操作了。💡 这段代码怎么用?
- 地址映射是所有寄存器操作的基础——理解了「地址 ↔ 寄存器」的对应,就能看懂固件库的
GPIO_TypeDef结构体 - 真正写程序时无需自己手算地址,固件库已经通过
#define和结构体封装好了 - 遇到「为什么 GPIOB 基址是 0x40010C00」这类问题,回看这张表即可
1.7 命名规则
以 STM32F103C8T6 为例:
| 部分 | 含义 | 说明 |
|---|---|---|
| STM32 | 系列 | ARM Cortex-M 32 位 MCU |
| F | 类别 | F=通用型 |
| 1 | 子系列 | 1=基本型 |
| 03 | 产品编号 | 03 表示具体型号 |
| C | 引脚数 | C=48 引脚 |
| 8 | Flash 大小 | 8=64KB(6=32KB,B=128KB) |
| T | 封装 | T=LQFP |
| 6 | 温度范围 | 6=-40~85°C |
📎 配套资料详细内容请参考课件 1.STM32概述.pptx 及 Cortex-M3 权威指南