一、STM32F103 是什么
STM32F103 是意法半导体(ST)推出的基于 ARM Cortex-M3 内核的 32 位微控制器,属于 STM32F1 系列的主流型号。它凭借丰富的外设、完善的开发生态和较高的性价比,长期被作为嵌入式入门的首选芯片之一,在工业控制、消费电子、电机驱动和教学实验中被广泛使用。
与 8 位单片机相比,STM32F103 的主频更高、外设更全、存储空间更大,同时保留了寄存器级编程的灵活性,既能满足简单控制需求,也能支撑较复杂的应用逻辑。
二、核心参数与型号划分
STM32F103 是一个系列名称,具体型号通过后缀区分存储容量、引脚数量和封装形式。常见参数如下:
| 参数项 | 典型规格 |
|---|---|
| 内核 | ARM Cortex-M3,最高 72 MHz |
| Flash | 16 KB / 32 KB / 64 KB / 128 KB / 256 KB / 512 KB |
| SRAM | 6 KB / 10 KB / 20 KB / 48 KB / 64 KB |
| 工作电压 | 2.0 V ~ 3.6 V |
| 定时器 | 高级定时器、通用定时器、基本定时器、看门狗、SysTick |
| 通信接口 | USART、SPI、I2C、CAN、USB 2.0 全速 |
| ADC | 12 位,最多 3 个 ADC,多通道 |
| 封装 | LQFP48 / LQFP64 / LQFP100 / LQFP144 等 |
命名规则上,以 STM32F103C8T6 为例:C 表示 48 引脚,8 表示 64 KB Flash,T 表示 LQFP 封装,6 表示工业级温度范围。选型时先确定引脚数与存储容量,再核对封装是否便于焊接和布线。
三、内部架构与时钟系统
STM32F103 采用哈佛结构,指令总线与数据总线分离,配合 Cortex-M3 的流水线设计,可在单周期内完成大部分指令。芯片内部主要由内核、总线矩阵、存储器、外设和时钟系统组成。
时钟系统是初学阶段最容易出错的部分。STM32F103 支持内部高速时钟 HSI(8 MHz)和外部高速时钟 HSE(常见 8 MHz 晶振),通过 PLL 倍频后可得到 72 MHz 的系统时钟 SYSCLK。APB1 总线最高 36 MHz,APB2 总线最高 72 MHz,外设时钟需要单独使能,否则寄存器写入不会生效。
提示:使用标准外设库或 HAL 库时,时钟配置通常由
SystemInit或HAL_Init完成,但外设自身的时钟仍需在初始化代码中手动开启。
四、开发环境准备
搭建 STM32F103 开发环境主要有两条路线:一是使用 STM32CubeMX 生成初始化代码,配合 Keil MDK 或 STM32CubeIDE 编译调试;二是使用标准外设库配合 Keil 或 IAR。对新手而言,推荐 CubeMX + HAL 库的组合,图形化配置可以显著降低时钟和引脚配置的门槛。
- 硬件:STM32F103 最小系统板(如 C8T6 核心板)、ST-Link V2 下载器、USB 转串口模块、杜邦线。
- 软件:STM32CubeMX、Keil MDK-ARM(需安装对应器件包)或 STM32CubeIDE、STM32CubeProgrammer。
- 驱动:ST-Link 驱动、CH340 或 CP2102 串口驱动。
安装完成后,建议先用 STM32CubeProgrammer 连接芯片,确认能正确识别器件 ID,再进行后续开发,避免把硬件连接问题误判为代码问题。
五、第一个工程:点亮 LED
下面以 STM32F103C8T6 为例,使用 HAL 库实现 LED 闪烁。假设 LED 连接在 PC13 引脚,低电平点亮。
c
#include "stm32f1xx_hal.h"
static void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(500);
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
代码逻辑很直接:先初始化 HAL 库和系统时钟,再使能 GPIOC 时钟并把 PC13 配置为推挽输出,最后在主循环中翻转电平并延时 500 毫秒。编译下载后,若 LED 未闪烁,优先检查时钟是否使能、引脚是否配置正确以及下载是否成功。
六、常用外设入门顺序
掌握 GPIO 之后,建议按以下顺序逐步深入,每个外设都先跑通最小示例,再叠加功能:
- GPIO 与中断:按键输入、外部中断 EXTI,理解中断优先级与 NVIC。
- 串口 USART:实现 printf 重定向,作为后续调试的主要手段。
- 定时器 TIM:定时中断、PWM 输出,用于呼吸灯和电机调速。
- ADC:采集电位器或传感器电压,理解采样时间与分辨率。
- I2C 与 SPI:驱动 OLED、EEPROM、传感器等常见模块。
- DMA:配合串口和 ADC 使用,减少 CPU 占用。
每学一个外设,都建议对照参考手册中的寄存器说明理解库函数背后的操作,这样在遇到问题时才能快速定位。
七、常见问题与排查思路
- 程序下载后不运行:检查 BOOT0 是否接地、复位电路是否正常、下载算法是否匹配芯片容量。
- 外设无响应:确认对应总线时钟已使能,引脚复用功能是否配置正确。
- 串口乱码:核对波特率、时钟源频率以及串口工具设置是否一致。
- 中断不触发:检查 NVIC 使能、中断标志清除以及优先级分组配置。
- 程序跑飞:排查数组越界、栈溢出和未初始化的指针,必要时开启 HardFault 调试。
八、小结
STM32F103 的学习路径可以概括为:先理解芯片架构与时钟系统,再搭好开发环境跑通点灯,随后按 GPIO、串口、定时器、ADC、通信接口的顺序逐个攻破外设。过程中保持"先最小示例、再逐步扩展"的节奏,配合参考手册阅读寄存器定义,能够有效减少踩坑时间。