STM32F103C8T6
🎯 江湖人称 "Blue Pill(蓝丸开发板)",STM32 入门最经典的芯片,性价比极高(¥20-50),是我 STM32 学习的主力板。
命名解读:
STM32(ST的32位MCU) +F1(基础型Cortex-M3) +03(增强型) +C(48引脚) +8(64KB Flash) +T(LQFP封装) +6(工业级 -40~85℃)。
📋 一、芯片核心资源
| 项目 | 参数 |
|---|---|
| 内核 | ARM Cortex-M3,最高 72MHz |
| Flash | 64KB(部分实测可到 128KB) |
| SRAM | 20KB |
| 封装 | LQFP48(48引脚) |
| 工作电压 | 2.0~3.6V(IO 口 3.3V,非 5V!) |
| GPIO | 最多 37 个(PA、PB、PC 部分) |
| 定时器 | 3个通用(TIM2-4) + 1个高级(TIM1) |
| 通信 | 2×USART、2×SPI、2×I2C、1×CAN、1×USB |
| ADC | 2×12位 ADC,最多 10 通道 |
⚠️ IO 口不耐 5V(除个别兼容脚),接 5V 传感器需电平转换或分压。
🗺️ 二、我的学习路线(两档规划)
我把 STM32F103C8T6 的学习拆成两档,先打基础再啃底层。
🥇 第一档:外设驱动实战(能写能跑)
| 阶段 | 内容 | 目标 |
|---|---|---|
| 第一阶段 | 开发环境与工程搭建 | Keil 安装、工程模板、ST-Link 下载、跑通第一个程序 |
| 第二阶段 | GPIO 输入输出、定时器、PWM 输入输出、ADC 采样 | 点灯/按键、定时中断、PWM 调光/电机、模拟量采集 |
| 第三阶段 | 串口 UART、I2C 通讯、SPI 通讯 | 串口调试、OLED 显示、传感器通信 |
🥈 第二档:底层原理进阶(知其所以然)
| 主题 | 内容 |
|---|---|
| 时钟树 | HSI/HSE/PLL/AHB/APB 分频倍频,72MHz 是怎么来的 |
| 中断 | NVIC、EXTI、优先级分组、中断服务函数 |
| DMA | 数据搬运、外设↔内存、ADC/DMA 连续采样 |
💡 第一档解决"能用",第二档解决"用好、用对、用稳"。两档交叉进行:第一档遇到时钟/中断问题时,回头补第二档对应原理。
🥇 第一档 · 第一阶段:开发环境与工程搭建
1. 开发环境清单
| 项目 | 常用方案 |
|---|---|
| IDE | Keil MDK-ARM(μVision5) |
| 库 | 标准外设库(SPL) / HAL库(入门推荐标准库,好理解) |
| 下载器 | ST-Link V2(SWD 四线:3.3V/GND/SWDIO/SWCLK) |
| 串口调试 | USB-TTL(CH340)+ 串口助手 |
| 仿真 | Proteus 8 Professional |
2. SWD 接线(4 根线)
| ST-Link | Blue Pill |
|---|---|
| 3.3V | 3.3V |
| GND | GND |
| SWDIO | DIO |
| SWCLK | CLK |
3. 工程目录规范(模块化)
我偏好库函数 + 头文件封装,硬件驱动统一放到 Hardware/ 目录,便于复用:
Project/
├── User/ main.c、中断文件
├── Hardware/ 每个外设一对 .c/.h(led.c/led.h、key.c/key.h ...)
├── System/ 延时、时钟配置
├── Libraries/ 标准外设库
└── Listings/ 编译输出
这种"每个外设一对 .c/.h、放 Hardware 目录"的写法,比把逻辑全塞进 main 更易维护和复用(见 C语言基础 中的模块化思想)。
🥇 第一档 · 第二阶段:GPIO / 定时器 / PWM / ADC
1. GPIO —— 8 种工作模式
| 模式 | 用途 |
|---|---|
| 推挽输出 (PP) | 驱动 LED、控制信号(能输出强高低电平) |
| 开漏输出 (OD) | I2C、需要线与的总线 |
| 复用推挽 (AF_PP) | 外设输出(如 USART_TX、PWM) |
| 上拉输入 (IPU) | 按键(默认高,按下拉低) |
| 下拉输入 (IPD) | 按键(默认低,按下拉高) |
| 浮空输入 (IN_FLOATING) | 外部已有电平 |
| 模拟输入 (AIN) | ADC 采集 |
8 种模式详细对照表

🔑 记忆要点:
- 输入类(4种):浮空 / 上拉 / 下拉 / 模拟 —— 决定引脚"读"到什么
- 输出类(4种):开漏 / 推挽 / 复用开漏 / 复用推挽 —— 决定引脚"写"出什么
- 推挽:高电平接 VDD、低电平接 VSS,能输出强高低
- 开漏:高电平是高阻态(需外部上拉才有高电平),低电平接 VSS
- 复用:引脚控制权交给片上外设(USART/SPI/TIM 等),不再由 GPIO 数据寄存器控制
2. 板载 LED —— PC13
Blue Pill 板载 LED 接在 PC13,且是低电平点亮(灌电流)。
3. 标准库点灯(模块化写法)
Hardware/led.h
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
void LED_Init(void);
void LED_On(void);
void LED_Off(void);
void LED_Toggle(void);
#endif
Hardware/led.c
#include "led.h"
void LED_Init(void)
{
// 1. 开时钟(PC13 属于 GPIOC,挂在 APB2)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 2. 配置结构体
GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_13;
gpio.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &gpio);
LED_Off(); // 默认熄灭
}
void LED_On(void) { GPIO_ResetBits(GPIOC, GPIO_Pin_13); } // 低电平亮
void LED_Off(void) { GPIO_SetBits(GPIOC, GPIO_Pin_13); }
void LED_Toggle(void) { GPIOC->ODR ^= GPIO_Pin_13; }
main.c
#include "led.h"
int main(void)
{
LED_Init();
while(1)
{
LED_Toggle();
Delay_ms(500);
}
}
4. 定时器(TIM)—— 非阻塞的关键
| 用途 | 说明 |
|---|---|
| 定时中断 | 精准定时(如 1ms 心跳),代替阻塞 Delay |
| PWM 输出 | 调光、电机调速、舵机 |
| PWM 输入捕获 | 测频率、测脉宽 |
定时公式:
溢出时间 = (ARR+1)(PSC+1) / TIM_CLK例:72MHz 时钟,PSC=7199,ARR=9999 → 溢出 = 7200×10000/72000000 = 1秒
5. PWM 输出
- 原理:定时器比较输出,ARR 决定周期,CCR 决定占空比
- 用途:LED 呼吸灯、舵机角度(20ms 周期 + 0.5~2.5ms 高电平)、电机调速
- 引脚需配置为 复用推挽 AF_PP
6. PWM 输入捕获
- 测量外部 PWM 信号的频率和占空比
- 典型应用:解析接收机信号、测转速
7. ADC —— 模拟采集
- 12 位精度,采样值 0
4095 对应 03.3V - 换算:
电压 = ADC值 * 3.3 / 4096 - 引脚需配置为模拟输入 AIN
- 进阶:配合 DMA 做连续多通道采样(见第二档 DMA)
🥇 第一档 · 第三阶段:UART / I2C / SPI
1. 串口 UART —— 调试神器
- 常用 USART1(PA9=TX, PA10=RX),波特率常用 115200
- 配合 USB-TTL 模块 + 电脑串口助手,是最重要的调试手段
- 进阶:重定向
printf到串口,打印日志像写 C 程序一样方便 - 收发方式:轮询 / 中断 / DMA(第二档)
2. I2C 通讯
- 两线制:SCL(时钟)+ SDA(数据),支持多设备(靠地址区分)
- 引脚配置为开漏输出 OD,需上拉电阻
- 典型设备:OLED 屏(SSD1306)、温湿度传感器、EEPROM
- 两种实现:硬件 I2C(外设)/ 软件模拟 I2C(GPIO 翻转时序,入门好理解)
3. SPI 通讯
- 四线制:SCK + MOSI + MISO + CS,全双工,速度比 I2C 快
- 典型设备:OLED、Flash(W25Qxx)、LCD、ADC 芯片
- 主从模式,靠 CS 片选切换设备
三种通讯对比
| 维度 | UART | I2C | SPI |
|---|---|---|---|
| 线数 | 2(TX/RX) | 2(SCL/SDA) | 4(SCK/MOSI/MISO/CS) |
| 同步 | 异步 | 同步 | 同步 |
| 速度 | 慢(115200bps) | 中(100k/400k) | 快(MHz级) |
| 多设备 | 需切换 | 地址寻址 | CS片选 |
| 典型用途 | 调试/通信 | 传感器/OLED | Flash/LCD |
🥈 第二档:底层原理进阶
1. 时钟树(STM32 的地基)
STM32 上电默认用内部 8MHz 时钟(HSI),跑不满性能。要发挥 72MHz,必须配置外部晶振(HSE) + PLL 倍频。
HSE(8MHz) → PLL×9 → SYSCLK(72MHz) → AHB(72M) → APB2(72M)
→ APB1(36M, 最高)
| 总线 | 频率 | 挂载外设 |
|---|---|---|
| AHB | 72MHz | 内核、DMA、GPIO时钟源 |
| APB2 | 72MHz | GPIO、USART1、SPI1、ADC、TIM1 |
| APB1 | 36MHz | USART2/3、TIM2-4、I2C、SPI2 |
🔑 用任何外设前必须先开它的时钟! 忘开时钟是新手最常见的"配了不生效"原因。 标准库里用
RCC_APBxPeriphClockCmd()开启。
2. 中断(NVIC / EXTI)
- EXTI:外部中断,把 GPIO 映射到中断线,按键/触发信号用
- NVIC:嵌套向量中断控制器,管优先级和使能
- 配置流程:开时钟 → GPIO输入 →
GPIO_EXTILineConfig映射 →EXTI_Init→NVIC优先级 → 写中断服务函数EXTIx_IRQHandler() - ⚠️ 中断里操作的全局变量记得加
volatile(见 C语言基础) - 优先级分组:抢占优先级(可打断)+ 子优先级(同级排队)
3. DMA(直接存储器访问)
- 作用:不经过 CPU,在外设和内存之间自动搬运数据,CPU 可以干别的
- 三大方向:外设→内存(如 ADC 连续采样、串口接收)、内存→外设(如串口发送、SPI 刷屏)、内存→内存
- 典型场景:
- ADC + DMA:多通道连续采样,结果自动存到数组
- UART + DMA:大段数据收发不占 CPU
- 配置要点:数据源地址、目标地址、数据长度、传输方向、是否循环
⚠️ 三、新手避坑清单
- 用外设前先开时钟(RCC)
- IO 口 3.3V,别直接接 5V
- PC13 低电平点亮
- 中断/寄存器变量加 volatile
- 板载晶振若焊接不良,PLL 起振失败会跑 8MHz
- 下载失败先按住 RST 或用 ST-Link 复位设置
- APB1 最高 36MHz,别按 72M 算 TIM2-4 时钟(定时器有×2机制)
- I2C 引脚必须开漏 + 上拉,否则通信异常
- PWM 输出引脚要配 复用推挽 AF_PP,不是普通推挽
📚 四、主要学习资料
主要跟这两位 B 站 UP 主的入门教程,互相补充。
1. 江协科技 —— 细致讲解型
- 教程:STM32入门教程-2023版 细致讲解 中文字幕
- 特点:讲解非常细致,从工程搭建到外设一步步来,适合零基础入门,配套代码规范
- 对应阶段:第一档全程 + 第二档中断/DMA
2. 铁头山羊 —— 新版入门
- 教程:铁头山羊stm32 入门教程【新版】
- 特点:新版教程,视角不同,可作为江协的补充和交叉验证
- 对应阶段:第一档 + 时钟树原理
学习方法建议
- 先跟江协打主线,把每个外设的例程亲手敲一遍(不要只看)
- 同一知识点再看铁头山羊,用第二种讲法加深理解
- 每学完一个外设,在
Hardware/下封装成自己的 .c/.h 驱动 - 第一档三个阶段打通后,做一个综合小项目(如:按键控制 PWM 调光 + ADC 读电位器 + 串口打印 + OLED 显示)
- 第二档时钟树/中断/DMA 是做项目时遇到瓶颈再回头深啃
🔗 相关链接
最后更新:2026-08-12



