51 单片机与 STM32F103C8T6 嵌入式零基础学习路线
完成主线后,应当能够先用 51 单片机建立基础的软硬件联调直觉,再独立创建一个小型 STM32 工程,连接常见外设,使用基本调试手段定位问题,并整理出可复现的代码与文档。
配套入门平台:
- MCU:教程配套或兼容开发板上的 51 系列单片机,具体型号以实物标注为准
- 视频:江协科技《51单片机入门教程-2020版》;课程更新和其他视频见江协科技主页
- 开发环境、下载工具和接线方式:跟随视频并以实际开发板资料为准
STM32 主线平台:
- MCU:STM32F103C8T6
- 开发板:采用 STM32F103C8T6 的最小系统板
- 视频:江协科技《STM32入门教程-2023版》
- 调试器:外置 ST-LINK,通过 SWD 连接
- 开发环境:STM32CubeIDE
- 固件库:STM32CubeF1 HAL
- 操作系统:Windows;如果团队统一使用其他系统,应提供对应的安装说明
STM32F103C8T6 是芯片型号,不代表唯一的开发板电路。
- 每个知识点都必须落到一个可以运行或测量的结果上。
- 每个阶段都要保存可以复现的代码和学习记录。
- 先使用 HAL 建立完整开发流程,再解释寄存器、启动过程和底层原理。
- 遇到问题时,先记录现象和复现步骤,再尝试修改代码。
- 以完成任务为准,不以观看或阅读资料的时长为准。
- 不跳过前置验收;上一阶段未通过时,不进入依赖它的下一阶段。
51 单片机配套学习线
Section titled “51 单片机配套学习线”51 单片机用于完成第一次“写代码—编译—下载—观察硬件现象”闭环,不替代后续 STM32 主线。学习顺序如下:
- 先完成主线阶段 1~5,具备 C 语言、位运算和基础电路能力。
- 按江协科技视频顺序学习开发工具、工程创建、程序下载、LED、按键、外部中断、定时器和串口。
- 再选择数码管、LCD、I²C 器件或其他一个外设完成小项目,不要求为了“看完课程”遍历所有章节。
- 进入主线阶段 6~10,在 STM32F103C8T6 上重新完成相应功能,并记录两种平台在工程配置、外设初始化和下载调试方式上的差异。
进入 STM32 阶段前,应满足:
- 能独立新建、编译和下载一个 51 单片机程序
- 能使用 LED、按键,以及定时器或 UART 中至少一项功能
- README 记录实际 MCU 型号、开发板版本、供电、下载方式、接线和预期现象
- 能说明 51 开发板与 STM32 开发板不是同一硬件平台,示例代码和寄存器定义不能直接照搬
许多 51 开发板使用 5 V 供电,而 STM32F103C8T6 GPIO 通常是 3.3 V 逻辑。两块板或外设互连前必须核对数据手册和原理图,不得把未经确认的 5 V 信号直接接入 STM32 引脚。
STM32 视频与 HAL 主线
Section titled “STM32 视频与 HAL 主线”STM32 阶段按江协科技视频的知识顺序学习 GPIO、外部中断、定时器、PWM、ADC、UART、I²C 和 SPI,并在每一节完成对应实验。本路线的最终工程统一使用 STM32CubeIDE、.ioc 配置和 STM32CubeF1 HAL;当视频示例的开发工具、固件库或 API 与本路线不同时,学习其外设原理和实验方法,再用 HAL 独立复现,不直接混用两套工程文件。
HAL 入门必须覆盖:
- 使用
.ioc选择引脚、配置时钟和外设,并安全地重新生成代码 - 读懂
HAL_Init()、SystemClock_Config()和各个MX_*_Init()的初始化顺序,知道用户代码应写入哪些区域 - 使用 HAL 完成 GPIO 读写、EXTI 回调、UART 收发、定时器中断、PWM 和 ADC 采样
- 使用
HAL_I2C_*或HAL_SPI_*接口完成至少一个外设实验 - 检查 HAL 函数的返回状态和超时;理解阻塞、轮询与中断的区别,DMA 留到进阶阶段
阶段 1:电脑与命令行基础
Section titled “阶段 1:电脑与命令行基础”- 能够辨认文件、目录、路径和扩展名
- 能够在指定目录打开终端并执行基本命令
- 能够使用文本编辑器创建和修改简单文件
- 能够按要求整理学习目录和记录
- 文件的创建、复制、移动、重命名和删除
- 绝对路径与相对路径
- 终端中的当前目录及常用命令
- 文本文件、源代码、二进制文件和压缩包的区别
- 软件安装位置、学习目录和工程目录的区别
- 报错信息的复制、保存和基本描述方法
- 能在不照抄完整操作步骤的情况下找到目标目录
- 能用终端创建目录并确认当前路径
- 能分辨源文件、文档和构建产物
- 能完整提供错误信息,而不是只描述“运行不了”
阶段 2:C 语言基本语法
Section titled “阶段 2:C 语言基本语法”- 能够读懂并修改一个简单的 C 程序
- 能够使用变量、表达式、判断、循环和函数解决小问题
- 知道编译器警告不能被随意忽略
main函数和程序执行顺序- 整数、浮点数、字符和布尔意义
- 变量、常量、运算符和类型转换
if、switch、for和while- 函数参数、返回值和局部变量
- 编译、运行和读取第一条错误信息
- 能独立完成一个包含输入、判断、循环和函数的小程序
- 编译结果没有未解释的警告
阶段 3:数组、字符串、指针与结构体
Section titled “阶段 3:数组、字符串、指针与结构体”- 理解数据存放在内存中,变量具有地址和大小
- 能够使用数组和结构体组织数据
- 能够读懂简单指针代码,不要求掌握复杂指针技巧
- 数组的长度、索引和越界风险
- C 字符串的结尾标记
- 地址、指针、取地址和解引用
- 指针作为函数参数的常见用途
- 结构体的定义和成员访问
sizeof的基本使用
- 能画出简单变量、数组和指针之间的关系
- 能解释数组越界为什么危险
- 能正确修改结构体并通过函数返回结果
阶段 4:位运算、模块化与编译过程
Section titled “阶段 4:位运算、模块化与编译过程”- 能够使用位运算读写状态位
- 能够把程序拆分为
.c和.h文件 - 初步理解源文件经过编译和链接后形成可执行程序
- 二进制、十六进制及其与硬件状态的关系
&、|、^、~、<<和>>- 掩码的设置、清除、翻转和判断
- 头文件、函数声明、源文件和头文件保护
- 声明与定义的区别
const、static和volatile的入门用途
- 能独立写出基本的位设置与位清除表达式
- 工程能够在拆分文件后正常编译
- 能说明
.h文件不是用来存放普通函数实现的
阶段 5:电子与数据手册基础
Section titled “阶段 5:电子与数据手册基础”- 能够安全地连接最简单的数字电路
- 理解电压、电流、电阻、功率、供电和共地
- 能够从原理图和数据手册中寻找引脚与电气信息
- 电压、电流、电阻和欧姆定律
- 电源、地、短路和反接风险
- 3.3 V 与 5 V 逻辑电平不能随意混接
- LED 限流电阻
- 上拉、下拉、浮空输入和按键抖动
- 数据手册、参考手册、用户手册和原理图的区别
- 万用表的电压、通断和电阻档
- 接线前能够说清楚电源电压和共地关系
- 能从原理图中找到 SWDIO、SWCLK、BOOT0 和板载 LED 对应的 MCU 引脚
- 能解释为什么 LED 不能不经过限流直接接到电源
阶段 6:第一个 STM32 工程
Section titled “阶段 6:第一个 STM32 工程”- 能够完成创建工程、配置、生成代码、编译、烧录和运行的完整流程
- 能够正确连接外置 ST-LINK,并通过 SWD 启动一次调试会话
- 理解工程中用户代码区和自动生成代码的分工
- MCU、CPU、Flash、RAM、时钟和外设的基本关系
- STM32CubeIDE 的工作区、工程和
.ioc配置文件 - STM32F103C8T6 的 3.3 V 供电、BOOT0 启动选择和 SWD 调试接口
- HSI、HSE 和 PLL 的作用;首次实验先使用内部时钟,确认基础流程后再配置板载外部晶振
- CubeMX 图形化配置、HAL 初始化流程和自动生成代码的分工
- 编译、链接、烧录、复位和运行的区别
- 断点、继续、单步和变量观察
- 新建工程后能够让板载或外接 LED 按预期闪烁
- 能够画出并解释本次使用的 SWD 接线
- 能说明改代码后为什么必须重新编译和烧录
- 能重新生成代码而不丢失用户逻辑,并能解释初始化调用顺序
- README 包含 MCU 完整型号、开发板版本、ST-LINK 接线、时钟来源、构建方法和预期现象
阶段 7:GPIO、按键与外部中断
Section titled “阶段 7:GPIO、按键与外部中断”- 能够配置 GPIO 输入和输出
- 能够区分轮询与中断
- 能够处理最基本的按键抖动问题
- 输入、推挽输出、开漏输出的基本概念
- 上拉、下拉和有效电平
- 轮询读取按键
- EXTI 外部中断及中断回调
HAL_GPIO_ReadPin()、HAL_GPIO_WritePin()、HAL_GPIO_TogglePin()和HAL_GPIO_EXTI_Callback()的用途- 中断中应少做工作的原则
- 软件消抖的基本思路
- 按键每次有效动作只改变一次 LED 状态
- 能解释中断函数中为什么不适合长时间等待
- 能根据实际电路判断按键按下时是高电平还是低电平
阶段 8:UART 与可观察性
Section titled “阶段 8:UART 与可观察性”- 能够通过串口发送调试信息
- 能够正确设置波特率等串口参数
- 开始形成“先观察,再修改”的调试习惯
- UART 的发送、接收、TX、RX 和共地
- USB 转串口模块必须使用与 STM32 兼容的 3.3 V 逻辑电平,TX 与 RX 交叉连接
- 波特率、数据位、停止位和校验位
- 轮询发送与阻塞的含义
- HAL UART 轮询收发、超时、返回状态和接收中断回调
- 串口日志的层次和最小必要信息
- 十进制、十六进制和原始字节的显示差异
- 能独立完成 STM32F103C8T6 开发板、USB 转串口模块与串口工具的连接
- 能根据乱码现象检查通信参数
- 日志能够帮助定位状态,而不是无节制重复输出
阶段 9:定时器、PWM 与 ADC
Section titled “阶段 9:定时器、PWM 与 ADC”- 理解定时器可以提供比软件延时更稳定的时间基准
- 能够生成 PWM 并改变占空比
- 能够读取一路模拟量
- 系统时钟、计数器、预分频和自动重装的直观关系
- 定时器中断
- PWM 的频率和占空比
- ADC、参考电压、分辨率和量化
- HAL 定时器启动、中断回调、PWM 启动和 ADC 轮询采样流程
- 原始 ADC 值与实际电压的换算
- 能根据给定目标计算或调整基本定时参数
- 能分别改变 PWM 频率和占空比,并观察差异
- ADC 结果与万用表测量值在合理误差范围内
阶段 10:I²C 与 SPI 外设通信
Section titled “阶段 10:I²C 与 SPI 外设通信”- 能够连接并驱动一个简单传感器
- 能够根据数据手册找到设备地址、寄存器和通信时序
- 能够用日志或逻辑分析仪区分接线、配置和协议问题
- 主机、从机、时钟和数据线
- I²C 地址、起始、停止、应答和上拉电阻
- SPI 的片选、时钟、数据线和模式
- 设备寄存器地址与寄存器值
- HAL I²C 或 SPI 句柄、收发接口、返回状态和超时
- 读写数据手册中的时序图和寄存器表
- 能从数据手册中指出地址、关键寄存器和数据格式
- 能解释传感器不响应时的检查顺序
- 能提交包含接线图、数据格式和测试结果的文档
阶段 11:调试与故障复现
Section titled “阶段 11:调试与故障复现”- 能够系统地缩小故障范围
- 能够使用断点、变量观察、串口日志、万用表和逻辑分析仪中的合适工具
- 能够写出其他人可以重复执行的故障记录
- 预期、现象、复现步骤、最小改动和验证结果
- 编译错误、链接错误、运行错误和硬件错误的区别
- 二分定位和最小可复现示例
- 断点、日志、电压测量和逻辑分析的选择依据
- 一次只改变一个因素,并在修改后重新验证
- 排障记录包含环境、预期、现象、步骤、原因和验证
- 能说明选择某个调试工具的理由
- 其他人能够根据记录复现故障并验证修复结果
完成本路线后,可以学习 Git 零基础学习路线。已经掌握 Git 或有其他明确目标时,也可以从 学习路线总览 跳到相应路线。
后续进阶路线
Section titled “后续进阶路线”完成本路线后,再根据团队项目选择后续方向:
- STM32 启动流程、链接脚本、内存布局与寄存器
- LL 库或寄存器级外设实现
- DMA、低功耗和性能分析
- FreeRTOS:任务、调度、队列、信号量和资源保护
- CAN、USB、以太网等项目所需通信
- Bootloader、固件升级与可靠性设计
- 单元测试、持续集成和团队代码规范
- STM32CubeIDE 快速入门手册
- UM1850:STM32F1 HAL 与 LL 驱动说明
- STM32F103C8 产品页
- STM32F103x8/B 数据手册
- RM0008 STM32F1 参考手册
开始前必须确定
Section titled “开始前必须确定”- 51 单片机开发板的实际 MCU 型号、供电电压、原理图、下载接口和配套工具
- STM32F103C8T6 具体板卡版本:最小系统板、Blue Pill 形式开发板或团队自制板
- 实际板卡的晶振频率、板载 LED、按键、BOOT 跳帽和供电电路
- 团队统一使用的 ST-LINK 型号
以上硬件信息必须写入起始工程和接线说明。板卡、原理图或供电方式未确认时,不进入阶段 5~6 的接线、烧录和调试实验。