如果你刚开始接触 STM32,或者已经学了几个月甚至一两年,但感觉进步缓慢、项目做不出来、代码调试不通,这篇文章就是为你准备的。这不是一个普通的教程,而是基于大量开发者真实踩坑经历总结出的核心经验。很多人在学习 STM32 时,把时间浪费在了错误的路径上,比如死磕寄存器、盲目追求复杂项目、或者被各种开发环境搞得焦头烂额,结果走了几年弯路。本文将直接切入要害,告诉你真正决定学习效率和最终成果的四个关键点是什么,以及如何快速验证自己的学习路径是否正确。
最值得关注的不是某个具体的函数或外设,而是一套可执行的方法论:如何搭建一个稳定高效的开发环境、如何建立正确的代码学习路径、如何通过最小系统板进行有效实践,以及如何构建可复用的知识体系。硬件门槛极低,一块几十元的 STM32F103C8T6 核心板就能开始。本文将带你完成从环境准备、第一个工程创建、到外设驱动、调试排错,最终实现一个综合性小项目的完整闭环。读者看完能立刻动手,避开最常见的坑,建立起清晰、高效的学习框架。
1. 核心能力速览:STM32 高效学习路径
在深入细节之前,我们先通过一个表格快速了解高效学习 STM32 的核心框架与资源要求。这能帮你快速判断接下来的内容是否对你有用。
| 能力项 | 说明与建议 |
|---|---|
| 核心硬件 | STM32F103C8T6(蓝色药丸)最小系统板。成本约20-30元,资源足够学习所有基础外设,是公认的入门神器。 |
| 开发环境 | Keil MDK-ARM(或 STM32CubeIDE) + ST-Link V2 下载器。这是最稳定、资料最多的组合。VSCode+Eclipse 等可作为进阶选择。 |
| 关键学习库 | 标准外设库(StdPeriph) 或 HAL 库。入门建议从标准库开始,理解底层;工程开发转向 HAL/LL 库以提高效率。 |
| 核心实践方法 | “最小可运行代码块”验证法。不追求大而全的项目,而是针对每个外设(GPIO、USART、ADC等)编写能独立运行、可观察现象的最小代码。 |
| 调试与排错 | ST-Link 配合 Keil 调试器 + 串口打印。必须掌握单步调试、断点、查看变量/寄存器,以及利用串口输出日志信息。 |
| 知识体系构建 | 模块化代码管理 + 项目驱动学习。将每个外设驱动写成独立的.c/.h文件,最后通过一个综合项目(如智能台灯)串联起来。 |
| 适合人群 | 电子、自动化、物联网等相关专业学生;从51/AVR转向ARM的开发者;工作中需要用到STM32但入门困难的工程师。 |
| 学习周期预期 | 遵循本文方法,1-2个月可掌握常用外设并完成第一个综合性项目,具备独立开发简单应用的能力。 |
这个框架摒弃了从数据手册第一页开始读、或直接啃复杂源码的低效方式,聚焦于“快速验证、快速反馈、快速迭代”的工程化学习路径。
2. 适用场景与使用边界
这套方法主要解决以下典型问题:
- 入门迷茫期:买了开发板,照着视频点灯后,不知道下一步该学什么,代码越看越懵。
- 调试恐惧症:程序下载后没现象,完全不知道问题出在哪里,只能盲目修改和重复下载。
- 项目无从下手:想做一个“基于STM32的智能台灯”或数据采集器,却不知道如何组织代码、连接传感器、调试通信。
- 知识无法串联:单独学GPIO、定时器、ADC都懂,但组合起来做一个PWM调光、ADC采样、串口上报的项目就卡住。
不适合的场景:
- 资深工程师深入研究架构:本文重点在高效入门和应用,而非深度剖析 Cortex-M 内核架构或 DMA 高级应用。
- 追求极致性能与代码尺寸:入门阶段以功能实现和理解为先,优化是后续阶段。
- 替代官方文档:本文是学习路径指南,最终权威参考永远是 ST 官方的《参考手册》和《数据手册》。
安全与合规边界:
- 所有实验均在低压直流环境下进行,连接电路前务必确认电源电压,避免短路。
- 下载程序使用正规的 ST-Link/V2 工具,避免使用来路不明的下载器导致芯片锁死。
- 项目中若涉及无线模块(如ESP8266),需遵守当地无线电管理规定。
3. 环境准备与前置条件
工欲善其事,必先利其器。一个稳定、干净的环境是成功的一半。很多弯路都始于环境配置的混乱。
3.1 硬件清单
- MCU 核心板:STM32F103C8T6 最小系统板(核心板)。注意区分“核心板”和“集成了众多外设的开发板”。入门强烈建议用核心板,它迫使你从最小系统开始思考。
- 下载调试器:ST-Link V2(或 V2 克隆版)。这是与 Keil 配合最稳定的工具,同时支持下载和调试。
- USB 转 TTL 串口模块:用于串口通信和打印调试信息,推荐 CH340/CP2102 芯片的模块。
- 面包板与杜邦线:用于连接外设和传感器。
- 基础外设(可选但建议):一个 LED,一个按键,一个电位器(用于ADC),一个 0.96寸 OLED 屏(I2C接口)。这些是验证学习成果的最佳道具。
3.2 软件清单
- Keil MDK-ARM (µVision):前往 Arm Keil 官网下载并安装 MDK-ARM,版本不宜过新,V5.3X 系列兼容性较好。安装时需要注册以解除 32K 代码限制。
- STM32F1xx 器件支持包:在 Keil 内通过
Pack Installer安装或从官网下载Keil.STM32F1xx_DFP.x.x.x.pack并双击安装。 - STM32CubeMX:ST 官方图形化配置工具。用于快速生成 HAL 库工程,初期可作为参考,理解引脚配置和时钟树。
- 串口调试助手:如
SSCOM、XCOM或Putty。用于接收单片机发送的串口数据。 - ST-Link 驱动:确保电脑能识别 ST-Link。安装后,在设备管理器中应能看到
STMicroelectronics STLink dongle。
环境验证: 连接 ST-Link 到核心板的SWDIO和SWCLK引脚(通常对应PA13和PA14),并连接3.3V和GND。打开 Keil,如果能在Debug设置里识别到ST-Link Debugger,说明硬件连接和驱动基本正常。
4. 安装部署与第一个工程
不要一上来就研究复杂的工程模板。我们从创建一个最纯净的工程开始,理解每一个文件的来源和作用。
4.1 创建标准库工程(推荐入门路径)
- 获取标准外设库:从 ST 官网或可靠资源站下载
STM32F10x_StdPeriph_Lib_V3.5.0。解压后,关注Libraries文件夹下的CMSIS(内核相关)和STM32F10x_StdPeriph_Driver(外设驱动库)。 - 新建工程文件夹:在磁盘上创建
Project文件夹,内部建立User、Libraries、Output、Listings子文件夹。 - 在 Keil 中创建新工程:
- 打开 Keil,
Project -> New µVision Project,路径选择刚才的Project文件夹,工程名自定。 - 选择器件:
STMicroelectronics -> STM32F103 Series -> STM32F103C8。 - 弹出“Manage Run-Time Environment”窗口时,直接点击
Cancel。我们不使用 Keil 自带的软件包来添加库,手动添加更清晰。
- 打开 Keil,
- 手动添加文件到工程:
- 在
Project窗口的Target 1上右键,选择Manage Project Items。 Project Targets下可改名(如F103C8T6)。在Groups下创建组:User,CMSIS,StdPeriph。- 向各组添加文件:
User组:添加User文件夹下的main.c,stm32f10x_it.c(中断服务函数),system_stm32f10x.c(从库的CMSIS中复制)。CMSIS组:添加库中CMSIS/CM3/CoreSupport下的core_cm3.c;添加CMSIS/CM3/DeviceSupport/ST/STM32F10x下的startup_stm32f10x_md.s(启动文件,C8T6 属于中等密度md)。StdPeriph组:添加STM32F10x_StdPeriph_Driver/src下你需要的外设驱动.c文件,例如stm32f10x_gpio.c,stm32f10x_rcc.c,stm32f10x_usart.c。初期可以只加几个,后续按需添加。
- 在
- 配置头文件路径:
- 点击魔术棒按钮
Options for Target->C/C++选项卡。 - 在
Define框中输入:USE_STDPERIPH_DRIVER, STM32F10X_MD。 - 在
Include Paths中添加:../User../Libraries/CMSIS/CM3/CoreSupport../Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x../Libraries/STM32F10x_StdPeriph_Driver/inc
- 点击魔术棒按钮
- 配置调试与下载:
Debug选项卡:选择Use: ST-Link Debugger,点击Settings。Debug选项卡:确认Port为SW。Flash Download选项卡:勾选Reset and Run,并在编程算法中添加STM32F10x Medium-density Flash。
- 编写第一个点灯程序: 在
main.c中编写以下代码,将 LED 连接到PC13(核心板常自带):#include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" void Delay(uint32_t nCount) { for(; nCount != 0; nCount--); } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; // 开启 GPIOC 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 配置 PC13 为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); while (1) { GPIO_SetBits(GPIOC, GPIO_Pin_13); // 置高,LED灭(低电平有效) Delay(5000000); GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 置低,LED亮 Delay(5000000); } } - 编译与下载:
- 点击
Build(F7) 编译,应无错误。 - 点击
Load(F8) 下载程序到芯片。 - 按下核心板复位键,观察 LED 是否闪烁。
- 点击
成功标准:LED 以大约 1Hz 的频率闪烁。如果没现象,按以下顺序排查:① 检查PC13是否连接了 LED;② 检查代码中时钟开启和引脚配置是否正确;③ 在Debug模式下单步运行,查看GPIOC->ODR寄存器的值是否变化;④ 检查 ST-Link 连接和供电。
5. 功能测试与效果验证:外设驱动模块化
点亮 LED 只是开始。关键是将每个外设的学习过程模块化、可验证。
5.1 USART 串口通信与调试信息输出串口是调试的“眼睛”,必须优先打通。
- 硬件连接:将 USB 转 TTL 模块的
TX接 MCU 的PA10(USART1_RX),RX接PA9(USART1_TX),GND互连。 - 代码模块化:
- 在
User文件夹下创建usart.c和usart.h。 - 在
usart.c中实现串口初始化函数USART1_Init和发送单个字符/字符串的函数。 - 关键点:配置
USART1时钟(在APB2总线上)、GPIO(PA9复用推挽输出,PA10浮空输入)、波特率(如 115200)、中断(如果需要接收)。
- 在
- 验证:在
main函数中初始化串口后,循环发送”Hello STM32!\r\n”。打开串口调试助手,选择对应 COM 口和波特率,观察是否收到数据。 - 进阶:重定向
printf到串口,方便直接使用printf打印变量值。这需要实现fputc函数。
5.2 ADC 采样与电位器控制模拟信号采集是嵌入式常见任务。
- 硬件连接:电位器中间引脚接
PA1(ADC1 Channel1),两侧引脚分别接3.3V和GND。 - 代码模块化:创建
adc.c/h。实现ADC1_Init,配置 ADC 为独立模式、连续转换、软件触发等。 - 验证:在主循环中读取 ADC 值,并通过串口打印出来。旋转电位器,观察打印的数值是否在 0-4095(12位 ADC)之间线性变化。
- 综合应用:将 ADC 采样值映射为 PWM 的占空比,控制 LED 亮度,实现一个简易的调光台灯。
5.3 定时器 TIM 产生 PWMPWM 用于控制亮度、速度、舵机等。
- 硬件连接:LED 正极通过限流电阻接
PA8(TIM1_CH1),负极接 GND。 - 代码模块化:创建
pwm.c/h。以TIM1的通道1为例,配置时基单元(预分频、重装载值)和输出比较模式(PWM 模式1/2)。 - 验证:初始化 PWM 后,在
main中改变CCR1寄存器的值(占空比),观察 LED 亮度变化。结合 ADC 采样值,实现电位器实时调节亮度。
5.4 外部中断与按键检测响应外部事件是系统交互的基础。
- 硬件连接:按键一端接
PA0(EXTI0),另一端接 GND。PA0引脚内部上拉或外部接上拉电阻。 - 代码模块化:创建
exti.c/h和key.c/h。配置GPIOA.0为浮空输入,配置EXTI0中断线为下降沿触发,在NVIC中使能中断。 - 验证:在
stm32f10x_it.c的EXTI0_IRQHandler函数中清除中断标志,并翻转一个 LED 状态。按下按键,观察 LED 是否随之翻转。注意消抖,可在中断中设置标志,在主循环中处理。
5.5 I2C 驱动 OLED 显示学习常用的通信协议。
- 硬件连接:OLED 的
SCL接PB6(I2C1_SCL),SDA接PB7(I2C1_SDA),VCC接3.3V,GND接GND。 - 代码模块化:创建
i2c.c/h和oled.c/h。i2c.c实现底层的I2C_Init、I2C_Start、I2C_SendByte等函数。oled.c调用 I2C 底层函数实现屏幕初始化、清屏、显示字符/字符串/数字等功能。 - 验证:在
main中初始化 OLED,显示 “ADC:” 和实时采集的 ADC 数值。旋转电位器,观察屏幕数值变化。
通过以上步骤,你不仅学会了外设,更重要的是建立了“独立模块 -> 最小验证 -> 综合应用”的学习模式。每个.c/.h文件都是你知识库的一块积木。
6. 接口 API 与模块化设计
当基础外设驱动完成后,如何将它们组织成一个可维护、可扩展的项目?这需要引入简单的“API”思想和模块化设计。
6.1 设计驱动层 API以 LED 为例,一个好的驱动 API 应该隐藏硬件细节:
// led.h #ifndef __LED_H #define __LED_H #include “stm32f10x.h” #define LED_ON() GPIO_ResetBits(GPIOC, GPIO_Pin_13) #define LED_OFF() GPIO_SetBits(GPIOC, GPIO_Pin_13) #define LED_TOGGLE() GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13))) void LED_Init(void); #endif在main.c中,你只需要调用LED_Init(),然后使用LED_ON()、LED_TOGGLE()等宏,无需关心具体是PC13还是哪个寄存器。ADC、PWM、OLED 都应封装成类似的接口。
6.2 创建硬件抽象层(HAL)思维虽然不要求完全实现 HAL,但要有这种意识。例如,将系统时钟初始化、延时函数、按键扫描、串口打印封装到一个bsp.c(Board Support Package)中。main.c只包含业务逻辑,不直接操作寄存器。
6.3 综合项目示例:智能台灯现在,用你积攒的模块,快速搭建一个项目:
- 功能描述:电位器调节 LED 亮度(PWM),按键切换自动/手动模式,OLED 显示当前模式和亮度值,串口上报状态。
- 模块调用:
int main(void) { SystemInit(); // 系统时钟初始化 USART1_Init(115200); // 串口初始化 LED_Init(); // LED初始化 PWM_Init(1000, 72); // PWM初始化,频率1KHz ADC1_Init(); // ADC初始化 KEY_Init(); // 按键初始化 OLED_Init(); // OLED初始化 printf(“System Start…\r\n”); OLED_ShowString(0, 0, “Mode:Manual”); while(1) { adc_val = ADC_GetValue(); // 获取ADC值 brightness = adc_val / 16; // 映射到PWM占空比 0-255 if(mode == MANUAL) { PWM_SetDuty(brightness); // 手动模式,电位器控制 OLED_ShowNum(40, 2, brightness, 3); } else { // 自动模式逻辑,例如根据环境光(需光敏传感器)调整 } if(KEY_Scan() == 1) { // 检测按键 mode = !mode; OLED_ShowString(0, 0, mode? “Mode:Auto “: “Mode:Manual”); printf(“Switch to %s mode\r\n”, mode? “Auto”:”Manual”); } Delay_ms(50); // 简单延时,实际应用建议用定时器 } }
这个项目虽小,但涵盖了输入(ADC、按键)、输出(PWM、OLED)、通信(串口)、逻辑控制四大要素,是一个完整的嵌入式系统雏形。
7. 资源占用与性能观察
对于 STM32F103C8T6(64KB Flash,20KB RAM),资源管理在项目后期很重要。
7.1 编译信息分析每次编译后,查看 Keil 底部的Build Output窗口:
Program Size: Code=xxxx RO-data=xxxx RW-data=xxxx ZI-data=xxxxCode:代码大小,存在 Flash 中。RO-data:只读数据(如 const 数组、字符串),存在 Flash 中。RW-data:已初始化的可读写数据,上电时从 Flash 拷贝到 RAM。ZI-data:未初始化或初始化为0的数据,存在于 RAM。总 Flash 占用=Code + RO-data + RW-data。总 RAM 占用=RW-data + ZI-data。 当你的程序加入更多功能后,要关注这两个值是否接近芯片极限。
7.2 优化策略
- 代码空间优化:
- 编译器优化等级设置为
-O2(Options for Target -> C/C++)。 - 只添加用到的库文件(
StdPeriph组里不要一股脑添加所有.c文件)。 - 减少使用大型库函数(如
printf的完整版很占空间,可使用简化版或自己实现)。 - 将不频繁调用的函数标记为
__attribute__((section(“.ARM.__at_0x0800xxxx”)))放到指定 Flash 地址(高级技巧)。
- 编译器优化等级设置为
- RAM 空间优化:
- 使用
static局部变量需谨慎,它们长期占用 RAM。 - 大的数组(如显存、音频缓冲区)考虑使用
const放到 Flash 中,或使用内存管理。 - 减少全局变量。
- 使用
- 性能观察:
- 利用
SysTick定时器:配置SysTick为 1ms 中断,在中断服务函数里对一个全局变量uwTick加一。可以用于精确延时和测量代码段运行时间。 - 使用调试器:在
Debug模式下,使用Logic Analyzer功能(需硬件支持)或System Viewer查看外设寄存器波形,分析 PWM 频率、ADC 采样时间是否达标。 - 串口时间戳:在关键代码前后获取
uwTick值并打印,计算差值,评估函数执行效率。
- 利用
8. 常见问题与排查方法
以下是学习 STM32 过程中最高频的问题及解决方案。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 程序下载失败 | 1. ST-Link 连接线松动或接错。 2. 芯片进入休眠/待机模式。 3. 选项字节配置错误(如写保护)。 4. 供电不足。 | 1. 检查SWDIO、SWCLK、GND、3.3V四线连接。2. 查看 Keil 下载日志提示。 3. 尝试按住复位键再点击下载,松开复位键。 | 1. 重新插拔,确保接触良好。 2. 使用 STM32 ST-LINK Utility连接芯片,尝试擦除全片。3. 检查 BOOT0 引脚是否为低电平。 |
| 程序下载成功但无现象 | 1. 主时钟配置错误(HSI/HSE)。 2. 外设时钟未开启。 3. 引脚配置错误(模式、速度)。 4. 硬件连接错误或损坏。 | 1. 进入调试模式,单步运行,查看RCC->CR寄存器确认时钟就绪。2. 查看外设对应的 RCC_APBxPeriphClockCmd是否调用。3. 使用万用表测量引脚电平。 | 1. 检查SystemInit()或自己的时钟配置函数。2. 确保每个外设初始化前都开启了时钟。 3. 对照原理图,用最简单代码(如点灯)验证硬件。 |
| 串口打印乱码 | 1. 波特率不匹配。 2. 时钟频率计算错误(如 HSE 晶振是 8M,代码按 12M 算)。 3. USB 转 TTL 模块质量问题。 | 1. 核对代码初始化波特率和串口助手设置。 2. 检查 system_stm32f10x.c中的SystemCoreClock值。 | 1. 使用标准波特率,如 9600, 115200。 2. 如果使用外部晶振(HSE),确保代码中 HSE_VALUE宏定义与实物一致。 |
| 按键中断触发多次 | 机械按键抖动。 | 用逻辑分析仪或示波器观察按键波形。 | 在中断服务函数中延时消抖(不推荐,会阻塞),或设置标志位在主循环中延时处理(推荐)。 |
| ADC 采样值不稳定 | 1. 电源噪声。 2. 模拟地数字地未分离或单点共地不好。 3. 采样周期太短。 4. 引脚配置为浮空输入。 | 1. 测量 ADC 参考电压引脚(VREF+)的稳定性。2. 使用杜邦线过长引入干扰。 | 1. 在VDDA和VSSA引脚就近接滤波电容(如 10uF + 0.1uF)。2. 配置 ADC 通道引脚为模拟输入 GPIO_Mode_AIN。3. 增加 ADC 采样周期时间。 |
| PWM 无输出或频率不对 | 1. 定时器时钟未开启。 2. 重装载值 ARR或预分频PSC计算错误。3. 输出比较模式配置错误。 4. 对应 GPIO 未重映射(对于部分定时器通道)。 | 1. 检查RCC_APBxPeriphClockCmd。2. 计算期望频率: Fpwm = Fck_psc / (PSC+1) / (ARR+1)。3. 使用调试器查看 TIMx->CCRx寄存器值。 | 1. 使用STM32CubeMX生成初始化代码进行对比。2. 确保 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP(复用推挽输出)。 |
| 使用 HAL 库编译提示未定义 | 未正确定义芯片型号或未包含对应的 HAL 库头文件路径。 | 查看stm32f1xx_hal_conf.h中是否使能了对应外设的宏(如#define HAL_ADC_MODULE_ENABLED)。 | 1. 在编译器预定义宏中添加STM32F103xB(根据具体型号)。2. 在 Options for Target -> C/C++ -> Include Paths中添加 HAL 库的Inc目录路径。 |
9. 最佳实践与使用建议
- 版本控制:从第一个工程开始就使用 Git。为每个外设模块创建独立的提交,
main.c的每次重大修改也提交。这能让你随时回退到可工作的版本。 - 文档化:在关键的驱动函数上方写注释,说明功能、参数、返回值。为自己写的
README.md,记录工程结构、引脚定义、注意事项。 - 分而治之:永远不要试图一次性写一个完整的大项目。按照“点亮 LED -> 串口打印 -> ADC 采样 -> PWM 输出 -> 综合控制”的路径,每个阶段都确保代码稳定可运行。
- 善用调试工具:
- 断点与单步:理解程序流。
- Watch 窗口:观察变量变化。
- Memory 窗口:查看特定内存地址的数据。
- Logic Analyzer(如果调试器支持):可视化分析 PWM、串口等数字信号。
- 拥抱官方资源:
- 数据手册:查引脚、电气特性。
- 参考手册:查外设寄存器详细描述、工作原理。这是终极权威。
- 应用笔记:ST 官网的 AN(Application Note)和 UM(User Manual)有大量实际应用方案。
- STM32CubeMX:即使你用标准库,也可以用它来快速配置时钟树和引脚复用,生成直观的视图,然后参考其配置来写自己的代码。
- 社区与搜索:遇到报错信息,直接复制到搜索引擎(如 Bing)或 ST 社区、电子论坛搜索。99% 的问题别人都遇到过。
10. 总结与下一步
回顾一下,高效学习 STM32 的四个关键点本质上是一套工程思维:
- 环境为先:搭建稳定、可复现的开发环境(Keil + ST-Link + 核心板),这是所有实验的基础。
- 路径正确:采用“标准库入门 -> 模块化驱动 -> 最小验证”的路径,避免过早陷入寄存器或 HAL 库的细节海洋。
- 实践驱动:用一块核心板和几个基础外设,通过“智能台灯”这样的微项目,将知识点串联成面,获得即时反馈和成就感。
- 体系构建:通过模块化编码、版本控制、调试技巧和官方文档阅读,构建可持续扩展和深化的个人知识体系,而非零散的代码片段。
接下来,你可以沿着这个框架继续深入:
- 外设拓展:学习
SPI驱动 Flash/W25Q64,I2S驱动音频芯片,CAN总线通信,USB设备开发。 - 操作系统:尝试在 STM32 上移植
FreeRTOS,理解任务、队列、信号量,让你的程序能“同时”处理多件事。 - 高级框架:深入研究
HAL/LL库,或者尝试ARM Mbed OS、Zephyr等物联网操作系统。 - 硬件设计:尝试自己绘制 STM32 最小系统板的原理图和 PCB,理解复位电路、时钟电路、电源电路的设计要点。
学习嵌入式没有捷径,但一定有更优的路径。希望这篇文章能帮你扫清初期的迷雾,建立起自信和清晰的学习地图。建议收藏本文,在每次感到困惑时回来对照检查,你会发现,大多数问题都已包含在这套方法论之中。