STM32F103C8T6

2026-08-11 4966 字 约 12 分钟 1 次浏览
目录

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
Flash64KB(部分实测可到 128KB)
SRAM20KB
封装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
ADC2×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. 开发环境清单

项目常用方案
IDEKeil MDK-ARM(μVision5)
库标准外设库(SPL) / HAL库(入门推荐标准库,好理解)
下载器ST-Link V2(SWD 四线:3.3V/GND/SWDIO/SWCLK)
串口调试USB-TTL(CH340)+ 串口助手
仿真Proteus 8 Professional

2. SWD 接线(4 根线)

ST-LinkBlue Pill
3.3V3.3V
GNDGND
SWDIODIO
SWCLKCLK

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 种模式详细对照表

GPIO 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 位精度,采样值 04095 对应 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 片选切换设备

三种通讯对比

维度UARTI2CSPI
线数2(TX/RX)2(SCL/SDA)4(SCK/MOSI/MISO/CS)
同步异步同步同步
速度慢(115200bps)中(100k/400k)快(MHz级)
多设备需切换地址寻址CS片选
典型用途调试/通信传感器/OLEDFlash/LCD

🥈 第二档:底层原理进阶

1. 时钟树(STM32 的地基)

STM32 上电默认用内部 8MHz 时钟(HSI),跑不满性能。要发挥 72MHz,必须配置外部晶振(HSE) + PLL 倍频。

HSE(8MHz) → PLL×9 → SYSCLK(72MHz) → AHB(72M) → APB2(72M)
                                              → APB1(36M, 最高)
总线频率挂载外设
AHB72MHz内核、DMA、GPIO时钟源
APB272MHzGPIO、USART1、SPI1、ADC、TIM1
APB136MHzUSART2/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. 江协科技 —— 细致讲解型

2. 铁头山羊 —— 新版入门

学习方法建议

  1. 先跟江协打主线,把每个外设的例程亲手敲一遍(不要只看)
  2. 同一知识点再看铁头山羊,用第二种讲法加深理解
  3. 每学完一个外设,在 Hardware/ 下封装成自己的 .c/.h 驱动
  4. 第一档三个阶段打通后,做一个综合小项目(如:按键控制 PWM 调光 + ADC 读电位器 + 串口打印 + OLED 显示)
  5. 第二档时钟树/中断/DMA 是做项目时遇到瓶颈再回头深啃

🔗 相关链接

  • C语言基础 - 指针操作寄存器、模块化封装的语言基础
  • 自我介绍 - STM32 是我的核心技能(⭐⭐⭐⭐⭐)

最后更新:2026-08-12

相关阅读