STM32 自学笔记
为什么选择 STM32?
在开始之前,先明确我们为什么选择学习这个 32 位微控制器:
- 性能强大:相比 51 单片机,STM32 拥有更高的主频、更快的运算速度和更丰富的外设。
- 生态完善:意法半导体 提供了海量的芯片型号,覆盖了从低功耗到高性能的各种应用场景,社区活跃,资料丰富,遇到问题容易找到解决方案。
- 成本效益高:功能强大的同时,价格非常亲民,是产品开发的首选。
- 工业标准:在工业控制、物联网、消费电子等领域,STM32 应用极其广泛,掌握它等于掌握了一项硬核技能。
学习路线图
建议遵循“理论 -> 工具 -> 外设 -> 项目 -> 进阶”的路径,循序渐进。

基础理论与环境搭建 (约 1-2 周)
-
核心概念扫盲:
- ARM Cortex-M 内核:了解 STM32 的“心脏”,特别是 Cortex-M3/M4/M7 的区别,知道 RISC 指令集、流水线、寄存器等基本概念。
- STM32 命名规则:学会看懂
STM32F103C8T6这串字符的含义(系列、子系列、引脚数、闪存大小、封装)。 - 数据手册:学会查阅芯片的官方数据手册,特别是引脚定义、电气特性、绝对最大额定值等章节。
- 参考手册:这是最重要的文档,详细描述了每个外设的功能、寄存器配置和操作时序。
-
开发工具链:
- IDE:
- 推荐:Keil MDK (ARMCC/ARMCLANG):工业界标准,稳定,调试方便,有官方库支持。
- 推荐:STM32CubeIDE:ST 官方免费 IDE,基于 Eclipse,集成了代码生成器,是未来的趋势。
- 编程/烧录工具:
- ST-Link/J-Link:用于下载程序和在线调试,ST-Link 官方且便宜,J-Link 性能更强。
- 核心库:
- 标准外设库:早期流行,通过直接操作寄存器或库函数来控制外设,代码可读性好。
- HAL / LL 库:现在的主流,HAL 库抽象层次高,可移植性强;LL 库更接近寄存器,效率更高。强烈建议从 HAL 库开始学习。
- 第一个程序:
- 使用 STM32CubeMX 图形化配置工具,生成一个基于 HAL 库的“LED 闪烁”工程。
- 目标:成功点亮开发板上的一个 LED 灯,并让它闪烁,这是验证所有环境是否配置成功的“Hello World”。
- IDE:
核心外设精讲 (约 2-4 周)
这是学习的核心,建议每个外设都动手实践一遍。以 STM32CubeMX 配置 + HAL 库编程 的方式进行。
-
GPIO (通用输入/输出):
- 模式:输入(浮空、上拉、下拉、模拟)、输出(推挽、开漏)。
- 实践:按键控制 LED(输入检测 + 输出控制)。
-
中断:
- 概念:理解什么是中断、中断向量表、中断优先级。
- 实践:使用外部中断实现按键的“按下即触发”,而不是一直扫描,学习
HAL_GPIO_EXTI_Callback回调函数。
-
定时器:
- 基本定时器:用于精确定时,产生固定时间间隔的中断。
- 通用定时器:除了基本定时器功能,还可以输入捕获、输出比较。
- 高级定时器:主要用于产生 PWM 波来控制电机(如无刷电机)。
- 实践:
- 使用基本定时器,实现 1s 的精确延时,控制 LED 闪烁。
- 使用通用定时器的输入捕获功能,测量一个 PWM 波的频率和占空比。
-
UART (串口):
- 概念:异步串行通信,理解波特率、数据位、停止位、校验位。
- 实践:
- 实现 PC 与 STM32 之间的双向通信,通过串口助手发送指令,控制 LED 灯的亮灭。
- 学习使用
printf重定向,将调试信息打印到串口,这是调试的利器。
-
ADC (模数转换器):
- 概念:将模拟信号(如电压)转换为数字量。
- 实践:读取电位器或光敏电阻的电压值,并通过串口打印出来,实现一个简单的电压表。
-
DMA (直接内存访问):
- 概念:外设与内存之间数据传输的“搬运工”,解放 CPU。
- 实践:配置 DMA,让 ADC 采集的数据自动存入一个数组,而无需 CPU 在每次转换后干预,体验 DMA 带来的效率提升。
综合项目实战 (约 1-2 个月)
将所学知识融会贯通,做一些有完整功能的项目。
-
智能温湿度监测仪
- 功能:通过 DHT11/DHT22 传感器读取温湿度数据,在 OLED 屏幕上显示,并通过蓝牙模块将数据上传到手机 APP。
- 涉及技术:I2C (OLED)、UART (蓝牙)、定时器(定时采集)、传感器驱动。
-
简易电子琴
- 功能:按下不同按键,通过 PWM 输出不同频率的方波,驱动蜂鸣器发出不同音调。
- 涉及技术:GPIO、定时器(PWM 输出)、中断(按键检测)。
-
PID 温度控制系统
- 功能:使用热敏电阻或 DS18B20 读取温度,通过 PID 算法控制加热器(如继电器或 MOS 管),使温度稳定在设定值。
- 涉及技术:ADC、定时器、PWM、PID 算法实现、闭环控制思想。
深入与进阶
当你能熟练完成以上项目后,可以探索更高级的主题。
-
RTOS (实时操作系统):
- 为什么学:当项目任务复杂、需要同时处理多个事件时(如按键、串口通信、数据采集),裸机编程会变得混乱,RTOS 可以让代码结构化,提高系统的稳定性和响应速度。
- 推荐:FreeRTOS(ST 官方大力支持,与 HAL 库无缝集成),学习任务创建、调度、信号量、队列、互斥锁等概念。
-
低功耗设计:
- 应用场景:电池供电设备。
- :睡眠、停止、待机等低功耗模式,以及如何通过外部中断、RTC 唤醒。
-
硬件设计基础:
- 学习原理图,理解最小系统电路(电源、晶振、复位电路)。
- 了解常用电路:上拉/下拉电路、滤波电路、MOS 管驱动电路等。
-
调试技巧:
- 逻辑分析仪:用于调试 I2C, SPI, UART 等数字通信协议。
- 示波器:查看模拟信号、PWM 波形、电源纹波等。
- J-Link/ST-Link 调试:熟练使用断点、单步执行、查看变量、内存和寄存器。
核心概念笔记 (备忘录)
| 概念 | 关键点 | 备注 |
|---|---|---|
| 时钟系统 | STM32 的所有外设都由时钟驱动。AHB 总线连接 Cortex-M 内核和高速外设,APB 总线连接低速外设,必须正确配置 RCC (Reset and Clock Control) 寄存器,才能使用外设。 |
CubeMX 可以自动配置时钟树,但理解其原理对排查问题至关重要。 |
| 启动文件 | startup_stm32f10x_xx.s,负责初始化堆栈指针、设置向量表、调用 SystemInit()(配置系统时钟)和 main() 函数。 |
一般不需要修改,但知道它的存在和作用。 |
| HAL 库结构 | stm32f1xx_hal.h:主头文件。stm32f1xx_hal_XXX.c:外设的驱动源文件。stm32f1xx_hal_msp.c:由 CubeMX 生成,用于初始化底层硬件(GPIO, 时钟等)。stm32f1xx_hal_conf.h:配置文件,可以开启或关闭某些 HAL 功能。 |
HAL_MSP 是连接硬件抽象层和具体外设的桥梁。 |
| HAL 库编程流程 | 初始化:HAL_XXX_Init()启动: HAL_XXX_Start() / HAL_XXX_Start_IT() (中断方式)回调:在回调函数中处理数据,如 HAL_UART_RxCpltCallback()停止: HAL_XXX_Stop() |
这是标准的 HAL 库使用范式。 |
| HAL 库状态码 | HAL_OK, HAL_ERROR, HAL_BUSY, HAL_TIMEOUT,函数返回这些值,用于判断操作是否成功。 |
编写代码时,务必检查返回值,进行错误处理。 |
常见问题与避坑指南
-
程序下载不进去 / 连接失败:
- 检查接线:SWDIO, SWCLK, GND 是否连接正确且牢固?
- 检查 BOOT 引脚:确保 BOOT0 接地,从用户闪存启动。
- 检查电源:VCC 和 GND 是否都接了?电压是否稳定?
- 尝试复位:在点击下载后,手动按下复位键。
- 更新 ST-Link 驱动/固件。
-
程序跑飞 / 看门狗复位:
- 原因:程序进入死循环、栈溢出、或者某个外设配置错误导致卡死。
- 解决:
- 善用调试器:单步运行,观察程序执行流程。
- 开启看门狗:如果问题难以定位,可以开启独立看门狗或窗口看门狗,让程序在卡死后自动复位,至少保证系统不会彻底“死掉”。
- 检查栈大小:在启动文件中检查
_Min_Heap_Size和_Min_Stack_Size是否设置合理。
-
中断不触发 / 回调函数不被执行:
- 检查使能:是否在
NVIC(嵌套向量中断控制器) 中使能了对应的中断? - 检查优先级:中断优先级是否设置正确?高优先级是否会打断低优先级?
- 检查回调函数:函数名是否拼写正确?是否在
main.c中实现了该回调函数?
- 检查使能:是否在
-
CubeMX 配置陷阱:
- 引脚复用:一个引脚可能有多个功能(如 PA2 可以是 USART2_TX,也可以是 TIM2_CH1),确保 CubeMX 中的引脚功能与你硬件设计一致。
- 时钟树:修改了任何外设的时钟,都要去时钟树配置页面检查一下主频和分频系数是否合适。
推荐资源
- 官方文档 (最重要!):
- Datasheet:数据手册。
- Reference Manual:参考手册,外设功能的“圣经”。
- Programming Manual:编程手册,讲述内核细节。
- 开发工具:
- STM32CubeMX:图形化配置神器。
- STM32CubeIDE:官方免费 IDE。
- Keil MDK:商业 IDE,有评估版。
- 学习社区:
- 正点原子 / 野火:国内顶级的 STM32 教程提供商,书籍和视频质量非常高,适合零基础入门。
- ST 官方社区:可以直接和 ST 工程师交流。
- B站 / CSDN / 博客园:搜索具体问题,有很多优秀的开源项目和教程。
- 硬件:
- 推荐开发板:正点原子 Explorer / Mini / F407,野火霸道 / 蚂蚁,这些板子资料齐全,适合学习。
送你一句忠告:
STM32 的学习没有捷径,唯一的捷径就是“动手”。 不要只看视频和教程,一定要亲自敲代码、搭硬件、调bug,当你亲手解决一个困扰你半天的问题时,那种成就感是无与伦比的,祝你学习顺利!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。