一.以ST32系列开发为例

优先级 来源 手册名称 缩写 核心内容 (你查它看什么?) SysTick 相关度
P0 (必读) ARM Cortex-M3/M4 Generic User Guide(通用用户指南) GUG 软件编程核心。定义了 NVIC (中断)、SysTick、MPU、SCB (系统控制) 的寄存器。 ⭐⭐⭐⭐⭐核心战场。查寄存器定义 (CTRL, LOAD) 和中断逻辑。
P0 (必读) ST Reference Manual(参考手册) RM 芯片外设百科。定义了 GPIO, UART, SPI, DMA 的寄存器;RCC 时钟树;中断向量表映射。 ⭐⭐⭐关键辅助。查 SysTick 的外部时钟源连接 (HCLK/8)。
P0 (必读) ST Datasheet(数据手册) DS 硬件规格书。包含系统框图、引脚定义、电气特性、内存映射 (Flash/SRAM 地址)。 ❌不涉及逻辑。只看电气参数。
P1 (选读) ST Programming Manual(闪存编程手册) PM Flash 操作指南。写 Bootloader 必看。包含内部 Flash 的解锁、擦除、写入时序。 ❌无。
P1 (避坑) ST Errata Sheet(勘误表) ES 硬件 Bug 列表。列出芯片设计缺陷 (如 I2C 锁死、ADC 抖动) 及规避方案。 ⭐偶尔有 SysTick在低功耗下的异常。
P2 (教程) ST Application Note(应用笔记) AN 官方实战教程。手把手教你做 Bootloader (AN2606)、低功耗设计、EMC 优化。 ⭐有专门讲时间基准设计的 AN。
P2 (工具) ST StdPeriph / HAL User Manual(库函数手册) UM API 查询字典。查库函数的参数、返回值和结构体定义。 ⭐⭐⭐查 API 用法(如 SysTick_Config)。
P3 (深究) ARM Technical Reference Manual(技术参考手册) TRM 硬件实现细节。调试接口 (JTAG/SWD) 协议、指令流水线延迟、总线接口协议。 ⭐只在硬核调试或仿真时看。
P3 (天书) ARM Architecture Reference Manual(架构参考手册) ARM ARM 指令集圣经。编译器开发者看。包含指令编码、Fault 详细机理、异常模型理论。 ⭐太底层,应用开发不看。

二、 详细注解:每个手册的“独门绝技”

第一部分:ARM 官方文档 (内核层)

这部分文档定义了 Cortex-M3 内核的行为。因为 STM32F103 是 M3 内核,所以这两本书是通用的。

1. Cortex-M3 Generic User Guide (通用用户指南)
  • 优先级:⭐⭐⭐⭐⭐ (P0)

  • 文件编号:DUI0552A

  • 详细介绍

    • 这是什么:这是写代码最常用的内核手册。它剥离了复杂的硬件实现细节,只保留了程序员关心的编程模型

    • 包含内容

      • Core Registers:R0-R15, xPSR, MSP, PSP 的详细定义。

      • NVIC:中断控制器,怎么开中断、设优先级分组。

      • SysTick:系统滴答定时器的 4 个寄存器定义。

      • Memory Map:内核视角的 4GB 地址空间划分。

  • SysTick 场景:你要查 SysTick 的 CTRL 寄存器里第 16 位 COUNTFLAG 是什么意思,必须看这本书。

2. Cortex-M3 Technical Reference Manual (技术参考手册)
  • 优先级:⭐ (P3)

  • 详细介绍

    • 这是什么:这是给芯片设计者(如 ST 的工程师)看的架构书。

    • 包含内容:指令流水线 (Pipeline) 的具体级数、总线接口 (AHB-Lite) 的时序图、JTAG/SWD 调试接口的电气细节。

    • 作用:日常开发基本不用看。除非你在做极其精细的指令运行时间分析。


第二部分:ST 官方文档 (芯片层) —— 针对 STM32F103

这部分文档是 ST 公司提供的,解决了“内核之外”的所有问题。

3. Reference Manual (参考手册) —— 最重要
  • 优先级:⭐⭐⭐⭐⭐ (P0)

  • 文件编号RM0008 (专门针对 STM32F101xx, F102xx, F103xx, F105xx, F107xx)

  • 详细介绍

    • 这是什么:这是 F103 的**“软件百科全书”**,厚达 1100 多页。

    • 包含内容

      • RCC (复位与时钟):时钟树、PLL 配置、总线分频。

      • Peripherals (外设):GPIO, USART, SPI, I2C, ADC, Timers 的功能描述寄存器映射

      • DMA:哪个外设对应哪个 DMA 通道(F103 的 DMA 映射是固定的,查表必看)。

  • SysTick 场景:你需要确认 F103 的 SysTick 外部时钟源是 HCLK/8,这在 RCC 章节里写着。

4. Datasheet (数据手册) —— 硬件基础
  • 优先级:⭐⭐⭐⭐ (P0)

  • 文件编号:例如 CD00161566 (针对 STM32F103x8/B 中容量产品)

  • 详细介绍

    • 这是什么:芯片的**“物理规格书”**。

    • 包含内容

      • Pinouts (引脚定义):哪个脚是电源,哪个脚是复用功能。

      • Memory Mapping (内存映射):Flash 和 SRAM 的具体大小和物理地址范围。

      • Electrical Characteristics (电气特性):最大电流、工作电压、ADC 精度。

  • SysTick 场景:虽然不直接讲 SysTick 逻辑,但它定义了 Max HCLK = 72MHz,这是你计算 SysTick 重装载值的基础。

5. Flash Programming Manual (闪存编程手册)
  • 优先级:⭐⭐⭐ (P1)

  • 文件编号PM0075

  • 详细介绍

    • 这是什么:专门讲内部 Flash 操作的手册。因为 F103 的 Flash 操作比较特殊(需要解锁序列)。

    • 包含内容

      • Flash 存储器组织结构(页大小:小/中容量是 1KB/页,大容量是 2KB/页)。

      • FPEC (Flash Program/Erase Controller) 寄存器定义。

      • 解锁 Key (KEY1, KEY2)。

  • 场景:写 Bootloader 做 IAP 升级,或者保存掉电参数到 Flash 时,必看。

6. Errata Sheet (勘误表) —— 救命稻草
  • 优先级:⭐⭐⭐ (P1)

  • 文件编号:例如 STM32F10xx8/B Errata sheet

  • 详细介绍

    • 这是什么:F103 芯片硬件设计的 Bug 列表。F103 是老芯片,Bug 不少。

    • 经典案例I2C 锁死问题。手册里明确写了 F103 的 I2C 硬件设计有缺陷,并给出了极其复杂的软件规避方案(或者建议用模拟 I2C)。

  • 场景:如果你调 I2C 发现总线忙且无法复位,别怀疑自己,先看这个表。


第三部分:辅助文档 (应用与库)

7. Application Notes (应用笔记)
  • 优先级:⭐⭐ (P2)

  • 数量:针对 F103 有几百篇。

  • 关键推荐

    • AN2606: STM32 system memory boot mode (介绍出厂串口下载的引脚和波特率)。

    • AN2586: Getting started with STM32F10xxx hardware development (画板子必看,晶振电路怎么画,退耦电容怎么摆)。

8. User Manuals (库函数手册)
  • 优先级:⭐⭐⭐ (P2)

  • 详细介绍

    • HAL 库用户手册 (UM1850):如果你用 CubeMX 开发,这本 PDF 告诉你 HAL_Delay 怎么用,HAL_UART_Transmit 的参数是什么。

    • 标准库帮助文档 (stm32f10x_stdperiph_lib_um.chm):如果你维护老代码,这个 chm 文件是查函数的字典。


三、 实战演练:以 SysTick 为例的“文档穿梭术”

假设任务:配置 SysTick 产生 1ms 中断,并理解其原理。

我们需要像侦探一样,在上述文档中寻找线索:

第一阶段:身份识别(它是谁?)

1. 思考起点

我要配置 SysTick。首先我要搞清楚:SysTick 是谁家的外设?

  • 是 ST 公司自己设计的(像 USART1, TIM2 那样)?

  • 还是 ARM 公司设计的内核组件(像 NVIC 那样)?

2. 判断依据

  • 通常内核紧密相关的(中断控制、系统滴答、MPU)属于 ARM。

  • 通用的通信接口(串口、SPI)属于芯片厂商 ST。

  • 结论:SysTick 是 ARM Cortex-M 内核 自带的。

3. 决策

既然是 ARM 的亲儿子,ST 的手册里可能只是一笔带过,肯定要把 ARM 官方手册 作为第一站。


第二阶段:逻辑探究(查阅 ARM 内核手册)

1. 目标文档

打开 《Cortex-M3 Generic User Guide》(通用用户指南)。

2. 查阅动作

搜索 SysTick,找到寄存器定义部分,重点看 STK_CTRL(控制寄存器)。

3. 获取的信息(Solved)

  • 工作原理:它是一个 24 位的向下计数器(倒数到 0 就触发中断)。

  • 中断配置:Bit 1 (TICKINT) 控制是否开启中断。

  • 使能控制:Bit 0 (ENABLE) 控制开启或关闭。

  • 时钟源选择:Bit 2 (CLKSOURCE) 是关键。

    • 1 = Processor Clock (内核时钟,通常是主频)。

    • 0 = External Reference Clock (外部参考时钟)。

4. 发现新问题(The Missing Link)

ARM 手册里写着:External Reference Clock is implementation defined.

翻译:“外部参考时钟的具体频率,由芯片制造商(ST)自己决定,我不管。”

侦探卡点

  • 如果我选 CLKSOURCE = 1,我知道是主频(但主频是多少?ARM 也不知道)。

  • 如果我选 CLKSOURCE = 0,这个“外部参考”到底是多少?是主频的 1/2?1/8?还是由某个晶振直接提供?

下一步行动

既然 ARM 说“由实现者定义”,那我就必须去问“实现者”——也就是 ST 公司


第三阶段:连线溯源(查阅 ST 参考手册)

1. 目标文档

打开 《STM32F10x Reference Manual (RM0008)》

2. 查阅动作

SysTick 需要时钟,所以这属于 时钟控制 (RCC) 的范畴。

  • 翻到 RCC 章节。

  • 找到 Clock Tree (时钟树) 图表。

3. 获取的信息(Solved)

  • 在时钟树的最右侧,找到 Cortex System Timer(这就是 SysTick)。

  • 逆向追踪连线

    • 它的线上有一个选择器。

    • 一路直接连到 HCLK (AHB 总线时钟)。

    • 另一路经过一个 /8 的方框,连到 HCLK

  • 真相大白

    • ARM 手册里的 Processor Clock = HCLK

    • ARM 手册里的 External Reference Clock = HCLK / 8

4. 发现新问题(The Missing Link)

现在我知道了逻辑关系(比如是 HCLK 的 8 分频),但是 HCLK 最大能跑多少?

  • 是无穷大吗?肯定不是。

  • 是 168MHz?还是 72MHz?

  • 参考手册主要讲“架构和逻辑”(怎么连线),通常不讲“物理极限”(最大能承受多少伏特、多少频率)。

下一步行动

我需要查阅关于这块芯片的物理规格书


第四阶段:物理极限(查阅 ST 数据手册)

1. 目标文档

打开 《STM32F103 Datasheet》

2. 查阅动作

搜索 ClockFrequency,或者看 Electrical Characteristics(电气特性)章节下的 AC Characteristics

3. 获取的信息(Solved)

  • 最大频率:STM32F103 的 HCLK 最大频率为 72MHz

  • 计算基础

    • 如果我全速运行,HCLK = 72,000,000 Hz。

    • 结合刚才 ST 参考手册的信息:外部参考时钟 = 72MHz / 8 = 9MHz。

4. 最终计算

我要产生 1ms 的中断(1000Hz):

  • 方案 A (使用内核时钟)

    $$计数值 = \frac{72,000,000}{1000} = 72,000$$

    写入 LOAD 寄存器的值应为 71999 (N-1)。

  • 方案 B (使用外部参考时钟)

    $$计数值 = \frac{9,000,000}{1000} = 9,000$$

    写入 LOAD 寄存器的值应为 8999。

侦探卡点

理论值都有了,但我不想自己去查“LOAD 寄存器是地址多少”、“CTRL 寄存器第几位是 Enable”。我想直接用代码实现。

下一步行动: 查找 API 手册


第五阶段:代码落地(查阅 库函数手册)

1. 目标文档 打开 《STM32 Standard Peripheral Library Help》 或者查看 CMSIS 标准库头文件 core_cm3.h

2. 查阅动作 搜索 SysTick

3. 获取的信息(Solved)

  • 找到了一个标准函数:SysTick_Config(uint32_t ticks)

  • 查看函数内部实现(源码):

发现细节:这个官方库函数强制使用CLKSOURCE=1 (内核时钟)。如果你想用 HCLK/8,你就不能直接用这个函数,得自己写寄存器。

二.以ESP32系列开发为例

优先级 来源 手册名称 缩写 核心内容 (你查它看什么?) SysTick (OS Tick) 相关度
P0 (圣经) 乐鑫 ESP-IDF Programming Guide(ESP-IDF 编程指南 - 在线版) IDF 软件开发的一切。包含 API 参考 (WiFi, BT, RTOS)、编译系统 (CMake)、配置选项 (Kconfig)。这是你 90% 时间待的地方。

⭐⭐⭐⭐⭐直接查配置。搜 CONFIG_FREERTOS_HZ 修改心跳频率。

P1 (硬件) 乐鑫 Technical Reference Manual(技术参考手册) TRM 外设寄存器百科。定义了 GPIO, SPI, I2C, Timer Group 的寄存器地址和位定义。类似 STM32 的 RM。 ⭐⭐底层实现。查硬件定时器 (Timer Group) 如何产生中断。
P1 (选型) 乐鑫 Datasheet(数据手册) DS 硬件规格书。引脚定义、电气特性、功耗数据、RF 射频性能。类似 STM32 的 DS。 ❌无。
P2 (深究) Cadenceor 乐鑫 Xtensa ISA Reference Manual(指令集手册) ISA CPU 内核细节。汇编指令、核心寄存器 (CCOUNT, CCOMPARE)。类似 ARM 的 GUG。 ⭐极客专用。查 Xtensa 内部的比较器如何触发 Tick。
P3 (硬件) 乐鑫 Hardware Design Guidelines(硬件设计指南) HDG 画板子必读。电源纹波要求、天线阻抗匹配、PCB 布局建议。 ❌无。

一、 核心差异:为什么查看方式完全不同?

你可能会觉得:“怎么 STM32 分那么细(ARM+ST),ESP32 好像就一本 IDF 指南打天下?” 这背后有三个核心原因:

1. 架构归属权不同 (IP vs SoC)
  • STM32 (分离制):ST 买的是 ARM 的图纸。ARM 说:“内核归我管,你别乱改文档”。所以你需要去 ARM 官网看内核,去 ST 官网看外设。

  • ESP32 (包办制):乐鑫使用的是 Xtensa (或 RISC-V) 架构,但乐鑫对内核进行了深度的定制和封装。乐鑫的态度是:“你不需要关心内核是谁的,你只要知道它是我 ESP32 的一部分”。所以内核文档被合并或弱化了

2. “黑盒”外设的存在 (WiFi/Bluetooth)
  • STM32:所有外设(UART, SPI)都是透明的,你配置寄存器就能跑。

  • ESP32:核心功能是 WiFi 和 蓝牙。这些协议栈极其复杂,且涉及 FCC/CE 认证,底层寄存器是不公开的 (Black Box)

    • 结果:你无法通过查寄存器手册来手写 WiFi 驱动。你必须调用官方提供的 API (esp_wifi_start)。既然必须调 API,那API 指南 (IDF Guide) 自然就成了最重要的文档。

3. 操作系统的地位 (Add-on vs Native)
  • STM32:RTOS 是“客”。你可以在裸机上跑,也可以移植 FreeRTOS。文档默认假设你是裸机。

  • ESP32:RTOS 是“主”。ESP-IDF 原生就是基于 FreeRTOS 构建的。系统启动时,FreeRTOS 已经在跑了。

    • 结果:你不需要像在 STM32 上那样去查“怎么移植 FreeRTOS”,你需要查的是“怎么配置 ESP32 里的 FreeRTOS”。


二、 实战演练:以 ESP32 的“SysTick”为例

假设任务:“修改 ESP32 的系统心跳频率 (Tick Rate) 为 1000Hz (1ms)。”

在 STM32 上,我们要查寄存器、算时钟。在 ESP32 上,思路完全变了:

第 1 步:找配置入口 (查 IDF 编程指南)
  • 思维:ESP32 是跑在 OS 上的,修改心跳应该是修改 OS 的配置 (Menuconfig),而不是改寄存器。

  • 动作:打开 ESP-IDF Programming Guide (在线版)。

  • 搜索Tick RateCONFIG_FREERTOS_HZ

  • 获取信息

    • 文档告诉你:在 Component config -> FreeRTOS -> Tick rate (Hz) 中修改。

    • 默认通常是 100Hz (10ms),你可以改成 1000Hz。

    • 不需要写一行代码,编译系统会自动生成宏定义。

第 2 步:(可选) 找硬件原理 (查 TRM 或 ISA)
  • 疑惑:我想知道到底是谁在产生这个心跳?是像 STM32 那样的 SysTick 吗?

  • 动作:查阅 ESP32 Technical Reference ManualXtensa 手册

  • 发现

    • ESP32 (Xtensa核) 内部有两个特殊寄存器:CCOUNT (Cycle Count) 和 CCOMPARE (Cycle Compare)。

    • 这有点像 ARM 的 SysTick,但它是 32位向上计数 的。

    • FreeRTOS 的底层代码 (port.c) 会自动设置 CCOMPARE 寄存器,当 CCOUNT 等于它时触发 Level 1 中断

  • 结论:虽然原理类似(都是内核定时器),但用户不需要操作寄存器,OS 底层全包了。

第 3 步:(可选) 找硬件限制 (查 Datasheet)
  • 思考:我能不能把心跳设成 10000Hz (0.1ms)?

  • 动作:看 Datasheet 的 CPU 主频。

  • 分析:ESP32 主频通常 160MHz 或 240MHz。10kHz 的心跳意味着每 100us 就要中断一次。虽然硬件扛得住,但 Context Switch (任务切换) 的开销会占满 CPU,导致 wifi 吞吐量下降。

  • 文档建议:IDF 指南通常建议不要超过 1000Hz。

总结:STM32 vs ESP32 文档查找“肌肉记忆”

  • STM32 (硬核模式)

    遇到问题 --> 翻 PDF (Reference Manual)-->  找寄存器 -->  算位操作。

  • ESP32 (软件模式)

    遇到问题 -->  搜 Google/IDF Guide-->  找menuconfig选项或 API--> 调用函数。

当你从 STM32 转到 ESP32,最大的挑战不是代码难写,而是忍住不去查寄存器的冲动,学会信任并使用庞大的官方 SDK。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐