嵌入式学习 | STM32裸板驱动开发(Day01)入门学习笔记(超详细完整版|点灯实验 + 库函数代码 + 原理全解)

适合STM32纯小白入门 / GPIO开发 / 嵌入式点灯大法 / 标准库实战


前言

很多同学刚接触嵌入式、STM32 都会迷茫:没有硬件基础能学吗?需要画板子吗?代码怎么写? 这篇笔记从基础概念、芯片资源、硬件原理、库函数代码、实验步骤 全方位讲解,纯小白也能轻松学会 STM32 最经典入门实验 ------LED 点灯实验,一步到位打通嵌入式入门第一关!


一、STM32 开发基础认知

1.1 开发硬件设备

我们本次学习使用的核心硬件平台:

  • 核心设备:STM32 开发板(成品板,直接使用,无需设计电路)
  • 主控芯片型号:STM32F103RBT6(32 位 ARM Cortex-M3 内核单片机,嵌入式入门经典款)

1.2 开发定位:我们是软件工程师,不是硬件工程师

这是新手最容易陷入的误区,必须明确:

  • ❌ 不需要画 PCB 电路板
  • ❌ 不需要精通模电、数电等复杂硬件知识
  • ❌ 不需要设计硬件电路
  • ✅ 我们只做软件开发:通过编写 C 语言代码,控制芯片引脚,驱动外部硬件工作

1.3 STM32 软件开发必备能力

想学好 STM32 开发,你只需要掌握这 3 项核心能力:

  1. 扎实的 C 语言基础:嵌入式开发唯一核心语言,指针、结构体是重点
  2. 基础物理 / 电路常识:知道高低电平、电压电流基本概念即可
  3. 读懂芯片手册能力:能查看数据手册、参考手册查找寄存器、引脚定义

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 三大经典系列

  1. A 系列(Application)
    • 定位:高端高性能芯片
    • 场景:手机、平板、高端消费电子、智能设备
  2. R 系列(Real-time)
    • 定位:强实时性、高稳定性芯片
    • 场景:军工、高端工业控制、医疗设备
  3. 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 开发环境配置:

  1. IDE 编译器:Keil5 MDK(最主流的 STM32 开发工具)
  2. 固件库:STM32F10x 标准库(封装好的函数,不用操作底层寄存器)
  3. 下载器:ST-Link / J-Link(程序下载调试)
  4. 驱动安装:CH340 串口驱动、下载器驱动
  5. 芯片支持包: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 读取外部电平)

  1. 上拉输入:默认高电平
  2. 下拉输入:默认低电平
  3. 浮空输入:无默认电平,外部信号决定
  4. 模拟输入:ADC 采集专用

4.2.3 GPIO 输出模式(MCU 控制外部设备)

  1. 推挽输出(GPIO_Mode_Out_PP)
    • 可输出高电平 + 低电平
    • 驱动能力强,是控制 LED、蜂鸣器的标准模式
  2. 开漏输出
    • 仅能输出低电平,需要外部上拉才能输出高电平
  3. 推挽复用输出
  4. 开漏复用输出

五、寄存器底层原理(理解本质)

5.1 实验配置目标

PC1、PC2、PC3 三个引脚统一配置为:推挽输出模式

5.2 关键寄存器详解

  1. GPIOx_CRL 端口配置低寄存器
    • 作用:配置 Pin0~Pin7 引脚模式
    • 配置值:推挽输出 50MHz → 0011
    • PIN1:bit7 ~ bit4
    • PIN2:bit11 ~ bit8
    • PIN3:bit15 ~ bit12
  2. GPIOC 基地址0x4001 1000
  3. GPIOx_CRL 偏移地址0x00
  4. GPIOx_ODR 输出数据寄存器:控制引脚高低电平
  5. 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 使用步骤

  1. 002led.h002led.c 添加到工程
  2. 在主函数开头调用 led_init2(); 完成初始化
  3. 调用 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 核心知识点总结

  1. STM32 开发以软件为主,无硬件基础也能快速入门
  2. GPIO 推挽输出是控制 LED、蜂鸣器等设备的标准模式
  3. STM32 开发固定流程:使能外设时钟 → 配置 GPIO 模式 → 控制电平输出
  4. 标准库开发比寄存器开发更高效、更稳定、适合工程实战
  5. 点灯实验是嵌入式入门的第一步,掌握 GPIO 就掌握了 STM32 的半壁江山

九、学习建议

  1. 先看懂原理,再动手写代码
  2. 多烧录程序,观察硬件现象
  3. 尝试修改代码,实现 LED 流水灯、呼吸灯效果
  4. 熟记 GPIO 配置步骤,为后续按键、中断、串口学习打下基础
相关推荐
JAVA面经实录9171 小时前
Java架构师最终完整版学习路线图
java·开发语言·学习
叶子野格1 小时前
数据集网站kaggle注册无验证码选项?
学习
勤自省2 小时前
ROS2从入门到“重启解决”:21讲8~12章踩坑血泪史与核心总结
linux·开发语言·ubuntu·ssh·ros
原来是猿2 小时前
Linux守护进程(Daemon)完全指南:从原理到实战
linux·运维·服务器·网络·php
largecode2 小时前
能不能让座机号码显示“XX公司”那样的认证名称?申请号码认证方法
经验分享·笔记·音视频·课程设计·oneapi·segmentfault·微信开放平台
阡陌..2 小时前
如何使用samba为Linux设置一个局域网共享盘
linux·运维·服务器
for_ever_love__2 小时前
UI学习:数据驱动ce l l
学习·ui·ios·objective-c
Hua-Jay2 小时前
OpenCV联合C++/Qt 学习笔记(十七)----凸包检测、直线检测及点集拟合
c++·笔记·qt·opencv·学习·计算机视觉