适合STM32纯小白入门 / GPIO开发 / 嵌入式点灯大法 / 标准库实战
前言
很多同学刚接触嵌入式、STM32 都会迷茫:没有硬件基础能学吗?需要画板子吗?代码怎么写? 这篇笔记从基础概念、芯片资源、硬件原理、库函数代码、实验步骤 全方位讲解,纯小白也能轻松学会 STM32 最经典入门实验 ------LED 点灯实验,一步到位打通嵌入式入门第一关!
一、STM32 开发基础认知
1.1 开发硬件设备
我们本次学习使用的核心硬件平台:
- 核心设备:STM32 开发板(成品板,直接使用,无需设计电路)
- 主控芯片型号:STM32F103RBT6(32 位 ARM Cortex-M3 内核单片机,嵌入式入门经典款)
1.2 开发定位:我们是软件工程师,不是硬件工程师
这是新手最容易陷入的误区,必须明确:
- ❌ 不需要画 PCB 电路板
- ❌ 不需要精通模电、数电等复杂硬件知识
- ❌ 不需要设计硬件电路
- ✅ 我们只做软件开发:通过编写 C 语言代码,控制芯片引脚,驱动外部硬件工作
1.3 STM32 软件开发必备能力
想学好 STM32 开发,你只需要掌握这 3 项核心能力:
- 扎实的 C 语言基础:嵌入式开发唯一核心语言,指针、结构体是重点
- 基础物理 / 电路常识:知道高低电平、电压电流基本概念即可
- 读懂芯片手册能力:能查看数据手册、参考手册查找寄存器、引脚定义
1.4 STM32 芯片基础概念
- 芯片厂商:ST(意法半导体) 全球领先的半导体芯片设计生产商
- 内核系列:ARM M 系列(微型单片机专用)
- 系统位数:32 位(相比 8 位单片机,运算速度更快、资源更丰富)
- 定位:工业级、低功耗、高性价比,广泛用于智能硬件、物联网、工控设备
1.5 ARM 核心知识(必懂基础)
1.5.1 ARM 到底是什么?
ARM 既不是单纯的公司,也不是实体芯片,而是ARM 公司设计的芯片架构方案。
- ARM 公司:只做芯片架构设计,不生产芯片
- 商业模式:将架构授权给各大芯片厂商,厂商基于架构生产定制芯片
1.5.2 主流 ARM 架构芯片厂商
- 华为(海思)、小米、高通、三星、ST 意法半导体、TI 德州仪器等
1.5.3 ARM 三大经典系列
- A 系列(Application)
- 定位:高端高性能芯片
- 场景:手机、平板、高端消费电子、智能设备
- R 系列(Real-time)
- 定位:强实时性、高稳定性芯片
- 场景:军工、高端工业控制、医疗设备
- M 系列(Micro)
- 定位:微型低功耗单片机
- 场景:共享单车、售水机、智能家电、传感器、嵌入式入门开发
- ✅ 我们学习的STM32就属于 ARM M 系列!
二、STM32F103 开发板资源全解
这块开发板是入门神器,板载资源非常丰富,满足学习、实验、项目开发全需求。
2.1 芯片内部外设资源(芯片自带)
- ADC:模数转换模块,采集模拟信号
- GPIO:通用输入输出端口(16*4pin),控制所有外部设备的核心
- IIC:低速串行通信接口
- SPI:高速串行通信接口
- USART:串口通信模块(共 3 组),用于打印日志、数据传输
2.2 开发板外部板载设备
- LED 指示灯 ×3:点灯实验专用
- 独立按键 KEY ×3:输入控制设备
- 蜂鸣器模块:发声报警
- DHT11 温湿度传感器:基础温湿度采集
- SHT30 温湿度传感器:高精度温湿度采集
- EEPROM 存储器:掉电数据保存
- LDT 数码管:数字显示
- OLED 屏幕:汉字 / 图像显示
- WIFI 无线模块:联网通信
- NRF 无线通信模块:近距离无线传输
- 高精度可调电阻:模拟电压输入
- 红外接收器:红外遥控解码
三、STM32 开发环境搭建(入门必备)
标准 STM32 开发环境配置:
- IDE 编译器:Keil5 MDK(最主流的 STM32 开发工具)
- 固件库:STM32F10x 标准库(封装好的函数,不用操作底层寄存器)
- 下载器:ST-Link / J-Link(程序下载调试)
- 驱动安装:CH340 串口驱动、下载器驱动
- 芯片支持包:STM32F1 系列固件支持包
环境搭建完成后,第一个必做实验就是嵌入式界经典的点灯大法!
四、点灯大法(STM32 入门第一实验)
4.1 实验硬件原理
4.1.1 硬件组成
- 被控设备:板载 3 个 LED 灯
- 主控核心:STM32F103RBT6(MCU 芯片)
- 连接方式:MCU 通过GPIO 引脚直接与 LED 灯连接,控制引脚电平实现亮灭
4.1.2 引脚对应关系(硬件原理图定义)
根据开发板原理图 MCU.pdf 定义:
- PC1 ------ LED0
- PC2 ------ LED1
- PC3 ------ LED2
4.1.3 LED 电路原理
电路详细设计参考官方文档:periph.pdf
- LED 灯:高电平点亮 / 低电平熄灭
- 控制逻辑:芯片引脚输出高电平 → LED 导通点亮;输出低电平 → LED 截止熄灭
4.2 GPIO 引脚核心知识
4.2.1 GPIO 是什么?
GPIO:通用输入输出端口,是 STM32 最基础、最重要、使用频率最高的外设。
- 我们这款 64 引脚芯片包含 4 组 GPIO:GPIOA、GPIOB、GPIOC、GPIOD
- 每组 GPIO 包含 16 个引脚:Pin0 ~ Pin15(例:PA0~PA15、PC0~PC15)
4.2.2 GPIO 输入模式(MCU 读取外部电平)
- 上拉输入:默认高电平
- 下拉输入:默认低电平
- 浮空输入:无默认电平,外部信号决定
- 模拟输入:ADC 采集专用
4.2.3 GPIO 输出模式(MCU 控制外部设备)
- 推挽输出(GPIO_Mode_Out_PP)
- 可输出高电平 + 低电平
- 驱动能力强,是控制 LED、蜂鸣器的标准模式
- 开漏输出
- 仅能输出低电平,需要外部上拉才能输出高电平
- 推挽复用输出
- 开漏复用输出
五、寄存器底层原理(理解本质)
5.1 实验配置目标
将 PC1、PC2、PC3 三个引脚统一配置为:推挽输出模式
5.2 关键寄存器详解
- GPIOx_CRL 端口配置低寄存器
- 作用:配置 Pin0~Pin7 引脚模式
- 配置值:推挽输出 50MHz →
0011 - PIN1:bit7 ~ bit4
- PIN2:bit11 ~ bit8
- PIN3:bit15 ~ bit12
- GPIOC 基地址 :
0x4001 1000 - GPIOx_CRL 偏移地址 :
0x00 - GPIOx_ODR 输出数据寄存器:控制引脚高低电平
- RCC_APB2ENR 时钟使能寄存器:STM32 所有外设必须开启时钟才能工作
5.3 寄存器配置逻辑
cpp
// 指向GPIOC_CRL寄存器地址
int *p = (int *)(0x40011000 + 0x00);
// PC1配置推挽输出
*p |= (0x3 << 4); // bit4~bit5置1
*p &= ~(0x3 << 6); // bit6~bit7清零
// 输出高电平点亮LED
*(0x40011000 + 0x0c) |= (1 << 1);
六、标准库函数代码(工程实战版)
实际开发中,我们不直接操作寄存器 ,使用 ST 官方封装好的标准库函数,代码更简洁、易读、易维护!
6.1 LED 头文件 002led.h
cpp
#ifndef __002LED_H
#define __002LED_H
#include "stm32f10x.h"
// 函数声明
void led_init2(void); // LED初始化函数
int led_on2(int no); // 点亮指定编号LED
int led_off2(int no); // 熄灭指定编号LED
#endif
6.2 LED 驱动源文件 002led.c
cpp
#include "002led.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
/*
函数功能:LED初始化
配置步骤:
1. 使能GPIOC外设时钟
2. 将PC1、PC2、PC3配置为推挽输出模式
3. 默认初始化熄灭所有LED
*/
void led_init2(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// 1. 开启GPIOC时钟(APB2总线外设)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 2. 配置GPIO参数
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度50MHz
// 3. 初始化GPIOC引脚
GPIO_Init(GPIOC, &GPIO_InitStruct);
// 4. 默认状态:所有LED熄灭(输出高电平)
GPIO_SetBits(GPIOC, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
}
/*
函数功能:点亮指定LED
入口参数:no -> LED编号 (1/2/3)
返回值:0=成功 -1=参数非法
*/
int led_on2(int no)
{
switch(no)
{
case 1:
GPIO_SetBits(GPIOC, GPIO_Pin_1); break;
case 2:
GPIO_SetBits(GPIOC, GPIO_Pin_2); break;
case 3:
GPIO_SetBits(GPIOC, GPIO_Pin_3); break;
default:
return -1; // 无效参数
}
return 0;
}
/*
函数功能:熄灭指定LED
入口参数:no -> LED编号 (1/2/3)
返回值:0=成功 -1=参数非法
*/
int led_off2(int no)
{
switch(no)
{
case 1:
GPIO_ResetBits(GPIOC, GPIO_Pin_1); break;
case 2:
GPIO_ResetBits(GPIOC, GPIO_Pin_2); break;
case 3:
GPIO_ResetBits(GPIOC, GPIO_Pin_3); break;
default:
return -1;
}
return 0;
}
七、代码使用教程(超简单)
7.1 使用步骤
- 将
002led.h和002led.c添加到工程 - 在主函数开头调用
led_init2();完成初始化 - 调用
led_on2()/led_off2()控制 LED 亮灭
7.2 函数调用示例
cpp
led_init2(); // 先初始化
led_on2(1); // 点亮LED0(PC1)
led_on2(2); // 点亮LED1(PC2)
led_on2(3); // 点亮LED2(PC3)
led_off2(1); // 熄灭LED0
八、实验现象与总结
8.1 实验现象
- 程序下载后,调用
led_on2(x),对应 LED 灯常亮 - 调用
led_off2(x),对应 LED 灯熄灭 - 可实现 LED 轮流闪烁、流水灯等效果
8.2 核心知识点总结
- STM32 开发以软件为主,无硬件基础也能快速入门
- GPIO 推挽输出是控制 LED、蜂鸣器等设备的标准模式
- STM32 开发固定流程:使能外设时钟 → 配置 GPIO 模式 → 控制电平输出
- 标准库开发比寄存器开发更高效、更稳定、适合工程实战
- 点灯实验是嵌入式入门的第一步,掌握 GPIO 就掌握了 STM32 的半壁江山
九、学习建议
- 先看懂原理,再动手写代码
- 多烧录程序,观察硬件现象
- 尝试修改代码,实现 LED 流水灯、呼吸灯效果
- 熟记 GPIO 配置步骤,为后续按键、中断、串口学习打下基础