《“叶”问手册——从零开始学习STM32中文参考手册》01
序言提笔写这篇序言时我正处于居家恢复的阶段离开嵌入式开发的职场岗位已有一段时间。我姓叶所以这个栏目取名“叶”问手册。我是一个刚从深圳消费电子头部独角兽离职的嵌入式开发工程师25年双非本科机器人专业毕业带着两段ROBOCON比赛的热血、一年实习的沉淀还有两个国奖、一个省奖一个市奖等若干奖项和经历的底气闯过宇树、云鲸、库玛动力等公司的面试场最终握着年薪25w的offer真正走进了嵌入式的实战世界。之所以想做“叶”问手册这个系列初衷很简单一是不想让自己的手艺生疏嵌入式的底层功底不练不看迟早完蛋二是深知新手学STM32的痛点——市面上大多教程在新手的面前只会转化为“抄代码、用库函数”却没人带着大家啃最核心参考手册。很多人学完教程换个芯片、换个场景就手足无措本质上就是没读懂手册没搞懂寄存器的底层逻辑、外设的设计原理。我不敢说自己是嵌入式领域的大神也不敢保证每一句话都是绝对的真理我只是一个刚出社会不久、踩过很多坑的“中小登”想把自己从比赛、实习、职场中总结的经验结合STM32中文参考手册一点一点讲给大家听。我始终相信“教学相长也”写博客、后续录视频的过程也是我重新梳理知识、查漏补缺的过程。如果你是刚入门STM32的新手看不懂手册、摸不清底层逻辑不妨跟着这个系列慢慢走如果你有一定基础想巩固底层功底、查漏补缺也欢迎一起交流探讨。如果你在学习过程中有疑问不管是手册里的知识点、STM32的实操问题还是比赛、面试、职场相关的困惑都可以在评论区留言我知无不言、言无不尽。—— 叶一个居家恢复、正在学习并打算持续学习嵌入式的中小登前置知识新手必看拆解手册以STM32F103中文参考手册为例整个手册分为29章除了第一章介绍缩写第二章介绍系统总线架构剩下27章大部分为外设介绍。每一章外设介绍可以大致分为几部分1.基本介绍简单介绍该外设的作用并列举该外设的各种特性如各通信协议的通信模式数据传输格式最大通信速率ADC/DAC的数据采集分辨率和模式转换时间定时器的计数器位数能实现的计数功能等等。这里是开发者在开发某外设之前除芯片官网给出的宣传资料以外另一个可以确认外设基本信息的地方。2.功能描述详细分析外设各功能的实现原理在寄存器上的实现逻辑及控制方法。如各通信协议的逻辑框图收发电平示例主从模式介绍错误条件等等。这里是开发者在开发外设之前需要结合需求详细理解的地方。包括但不限于在寄存器上的实现逻辑错误码的理解电平的转换等等。3.寄存器介绍将外设对应的所有寄存器展开进行介绍如CR控制寄存器SR状态寄存器DR数据寄存器BRR波特率寄存器。这里是开发者开发外设的唯一根据所有的库函数hal库都是在直接操作这里的寄存器理解寄存器各位的作用也就能一通百通玩转其他各型号芯片。4.隐藏工具Cortex-M3编程手册和技术参考手册。这两个手册在中文参考手册第二页文档使用说明中有放置链接。在涉及位带操作SCB系统控制块操作NVIC嵌套向量中断控制器Systick系统滴答计时器等核心设备操作时需要参考这两份手册。基础概念普及一、内核我们学习和使用的STM32核心都是ARM架构的内核。ARM公司针对不同的应用场景设计了不同细分系列的微架构内核大家不用死记硬背重点区分我们常用的即可- Cortex-A系列多用于手机、平板、智能电视等复杂智能设备主打高性能能运行安卓等操作系统- Cortex-R系列多用于汽车工业、工业控制等对实时性要求极高的场景稳定性优先- Cortex-M系列这是我们STM32最常用的内核如Cortex-M3、M4、M7等主打低功耗、低成本广泛应用于智能家居、医疗设备、工业传感器等场景也是我们后续解读手册的核心聚焦对象。二、单片机位数我们平常习惯说的“STM32”其中“32”就是这个单片机的位数核心含义是它一次性可以处理的最大二进制位数对应四字节1字节8位。与之对应的还有我们常见的其他位数单片机方便大家对比理解- 8位机如普通Arduino使用的ATmega328P、大学课本里的常客80C51一次性只能处理8位二进制数据性能和功能相对简单适合入门练手- 32位机也就是我们的STM32性能更强能处理更复杂的任务。这里重点提醒单片机的位数不只是一个“标签”它和寄存器位数、指针位数、数据处理速度、数据对齐方式强相关。比如STM32的单个指针是32位、单个通用寄存器也是32位后续会讲到的“位带操作”也是基于32位地址映射实现的理解这一点后续解读寄存器会轻松很多。三、总线AHB/APB总线相当于STM32内部的“交通要道”核心作用是连接内核和各个片上外设传输数据和控制信号。STM32中最常用的是AHB和APB两类总线差异主要在传输速度- AHB总线高速总线连接内核、存储器、DMA等高速设备传输速度快- APB总线低速总线分为APB1和APB2连接GPIO、UART、I2C等外设其中APB2速度时APB1的2倍。简单说总线就是“数据通道”不同速度的设备走不同的“通道”避免拥堵保证MCU稳定运行。四、 时钟时钟是MCU的“心跳”STM32的所有内核、外设都需要时钟信号支持才能工作没有时钟MCU就是一块“死板”。不同的外设需要不同频率的时钟比如串口需要低频率时钟ADC需要中高频时钟后续我们解读手册时钟树章节会详细讲时钟的来源、倍频、分频以及如何给不同外设分配时钟这里主要解释一下时钟波形对MCU的作用作用一提供运行节拍CPU执行一条指令通常需要若干步骤最基本的三个步骤是取指从存储器拿指令、译码分析指令含义、执行完成指令操作。时钟的作用就是为这些步骤提供统一的节奏。你可以把时钟想象成一个节拍器每“滴答”一声CPU就往前走一小步。单片机的主频率决定了“滴答”的速度——频率的倒数就是一个时钟周期。不同指令的效率不同有的指令可以在一个时钟周期内完成三步比如简单寄存器操作有的指令需要多个时钟周期才能完成比如访问外设或内存。CPU内部的各种执行器取指单元、译码单元、执行单元必须跟随时钟信号的变化来切换状态。举个例子取指单元检测到第一个时钟上升沿后开始执行取指任务。如果它在第二个上升沿到来之前就已经完成了取指它会一直保持“完成但未继续”的状态耐心等待第二个时钟上升沿的到来。直到第二个上升沿出现它才会把取指结果交给译码单元然后自己开始准备下一轮取指。为什么频率越高运行越快因为两个相邻上升沿之间的间隔越短每个步骤就能越快地被推进。就像工厂流水线传送带走得快产品就出得快。单片机里也一样。CPU内部由晶体管组成它们是“开关”给高电平开关接通。给低电平开关断开。从“通”到“断”或者反过来需要时间——这就是晶体管翻转速度。同时电信号在芯片内部的导线上传输也需要时间纳秒级。时钟的上升沿触发一次动作CPU在上升沿“锁存”当前状态然后在两个上升沿之间做运算下一个上升沿来了就“锁存”结果并开始下一步。如果时钟周期太短频率太高运算还没完成下一个上升沿就来了结果就会被“锁存”一个错误的数据 → 然后CPU拿着错误的数据继续运行 → 轻则算错数重则直接死机。作用二众所周知时钟信号一般为方波有上升沿下降沿和中间的高电平区间部分同步通信协议就需要通过检测这三个状态中特定的一种或几种来收发信息如I2C数据总线只能在时钟线低电平时进行电平变化在时钟线高电平时要保持稳定。五、外设外设是MCU实现各种功能的核心辅助单元大体分为两种片上外设和片外外设用一个通俗的类比就能看懂1. 片上外设指和CPU内核集成在同一块STM32芯片中的辅助功能单元我们后续要解读的STM32中文参考手册后27章所描述的所有外设都属于片上外设。类比如果把一块STM32 MCU看作一个人体中间的Cortex-M系列内核就是“大脑”那么这些片上外设就组成了人体的“手脚五官”——它们是内核感知外部环境、与外部进行交互的直接渠道比如GPIO相当于手脚控制外部设备开关也相当于眼睛耳朵接收外部输入、串口相当于嘴巴耳朵实现数据收发。2. 片外外设指附加在STM32芯片外部的设备比如陀螺仪、外置Flash、红外测距模块、OLED屏幕等。类比片外外设就相当于我们日常生活中的各类工具手机、电脑、键盘等内核大脑不能直接控制它们必须通过“手脚”片上外设去操作——比如内核要读取陀螺仪的数据就需要通过I2C或SPI两种片上外设与陀螺仪通信才能获取信息。六、寄存器所有片上外设的功能都由各自对应的寄存器直接控制。我们可以把寄存器看作一个“带很多开关的控制箱”- 每个“开关”对应外设的一个特定功能比如某一位开关控制GPIO的输入/输出模式- 按照STM32 32位机的特性每个通用寄存器都有32位也就是32个“开关”用来精准控制对应外设的各项功能- 我们不仅能通过“拨动开关”写入数据控制外设还能通过“观察开关状态”读取数据了解外设的当前工作状态——这就是手册中常见的“CR控制寄存器”控制功能和“SR状态寄存器”读取状态的核心作用其他寄存器如数据寄存器DR、配置寄存器CFG也都是基于这个逻辑设计的。补充一个关键知识点我们平时用的HAL库、标准库函数本质上就是“封装好的操作指令”——把对寄存器的直接操作写入/读取特定位封装成了简单的函数接口比如HAL_GPIO_WritePin目的是降低使用难度。但弊端也很明显不同型号的STM32寄存器地址和配置逻辑可能不同对应的库函数也会变化这就是为什么很多人换个芯片就“不会用”核心原因就是没读懂手册、没掌握寄存器的底层逻辑。七、通信方式MCU内核外设与外部设备片外外设、其他MCU的交互全靠通信方式实现。我们按3个核心维度分类讲解结合STM32常用场景避免抽象1. 按数据传输顺序分类- 串行通信数据一位一位地依次传输类似排队过马路占用引脚少、传输距离远STM32常用的UART、I2C、SPI都属于串行通信- 并行通信数据多位同时传输类似多人并排过马路传输速度快但占用引脚多、传输距离近STM32中较少直接使用如早期的8位数据总线现在多被串行通信替代。2. 按是否需要时钟同步分类- 同步通信需要一根专门的时钟线发送方和接收方按照时钟节拍同步传输数据类似跟着节拍跳舞STM32常用的SPI、I2C属于同步通信- 异步通信不需要时钟线发送方和接收方约定好“波特率”传输速度各自按自己的节奏传输数据类似两个人约定好说话速度不用跟着同一个节拍STM32常用的UART串口属于异步通信。3. 按通信功能分类- 全双工发送和接收可以同时进行类似打电话双方可以同时说话、听对方说话比如STM32的UART、SPI- 半双工发送和接收不能同时进行同一时间只能要么发送、要么接收类似对讲机一方说话时另一方只能听比如I2C、单总线- 单工只能单向传输类似广播只能听、不能反馈比如红外遥控STM32发送红外信号接收端只能接收不能回传。以上就是STM32手册解读前必须掌握的基础概念。这些概念不用死记硬背后续解读手册的过程中我们会反复提到、结合实例拆解慢慢就会熟练掌握。接下来我们就正式进入STM32中文参考手册的解读从手册的整体结构开始一步一步啃透每一个知识点。