家人们谁懂啊!刚学嵌入式/树莓派/STM32,对着手册看半天寄存器,连个小灯都点不亮,真的会破防😭
今天就给所有新手宝子们,安排一篇「零门槛GPIO点灯攻略」,不管你是用树莓派、STM32还是Arduino,跟着走,10分钟必点亮!再也不用为了点灯熬到半夜,收藏这篇,直接跳过所有坑✅
先跟新手宝子说句大实话:GPIO点灯不是炫技,是嵌入式的「Hello World」!就像学编程先写print("Hello World"),学硬件先点灯,这一步搞定,你就已经跨过了软硬结合的第一道门槛——验证硬件没问题、开发环境能操控底层,建立起“代码→引脚→实际效果”的完整认知链,后续学中断、PWM都轻松翻倍👏
GPIO=通用输入输出接口,简单说就是单片机/开发板上的“可操控引脚”,能通过代码控制它输出高电平(3.3V)或低电平(0V),而LED灯的亮灭,本质就是靠电平变化形成电流回路——高电平通电亮,低电平断电灭(或反之,看接线方式)。
重点提醒(血泪教训):GPIO引脚大多是3.3V逻辑电平,绝对不能直接接5V电源!否则直接烧板,新手一定要记死这一点‼️ 单脚最大电流约16mA,足够驱动LED,不用额外加驱动模块。
不管用哪种开发板,材料都差不多,总成本不超过20块,新手直接照搬:
核心板:树莓派4B/STM32F103C8T6(最小系统板)/Arduino Uno(任选一种,新手推荐树莓派,操作更简单)
LED灯珠:1颗(红色最佳,导通电压低,3.3V下亮度够,不容易烧)
限流电阻:220Ω 1个(色环:红-红-棕,必买!LED是非线性元件,不加电阻相当于短路,分分钟烧灯珠)
杜邦线:若干(公对母,连接开发板和面包板,买10根足够)
面包板:1块(可选,新手用面包板接线,不用焊接,出错好修改)
电源:USB线(直接插电脑供电,安全又方便)
所有开发板通用接线逻辑(以共阴极接法为例,最稳妥,新手首选),一步都别错!
LED灯珠区分正负极:长脚=阳极(+),短脚=阴极(-);封装边缘有平边的一侧也是负极,记不住就看长短脚,永远不会错✅
串联限流电阻:用杜邦线将LED阳极(长脚)连接到220Ω电阻的一端,电阻另一端连接到开发板的GPIO引脚(任意空闲GPIO均可,记好引脚编号,后续代码要用)。
接地:用杜邦线将LED阴极(短脚)连接到开发板的GND引脚(地线,任意一个GND都可以,开发板上一般有多个GND,随便选)。
⚠️ 避坑提醒:别把LED正负极接反!别忘记串联电阻!别接错GPIO和GND!这3个错误,80%的新手都会犯,接完再检查一遍,避免烧板烧灯。
新手不用懂代码原理,先复制运行,看到灯亮的瞬间,成就感直接拉满!后续再慢慢研究代码逻辑~
先安装依赖库(终端输入命令):
sudo apt-get install python3-rpi.gpio
sudo apt-get install python3-gpiozero
两种代码方案,任选一种(推荐方案二,极简无冗余):
方案一:RPi.GPIO(深入底层,适合学原理)
import RPi.GPIO as GPIO
import time
LED_PIN = 18 # 对应BCM编号,根据自己接线的GPIO修改
GPIO.setmode(GPIO.BCM) # 固定使用BCM编号,避免混淆
GPIO.setup(LED_PIN, GPIO.OUT) # 设置引脚为输出模式
try:
while True:
GPIO.output(LED_PIN, GPIO.HIGH) # 输出高电平,灯亮
print("LED ON")
time.sleep(1) # 亮1秒
GPIO.output(LED_PIN, GPIO.LOW) # 输出低电平,灯灭
print("LED OFF")
time.sleep(1) # 灭1秒
except KeyboardInterrupt:
print("\n用户中断程序")
finally:
GPIO.cleanup() # 关键!释放引脚资源,避免下次运行出错
方案二:gpiozero(官方推荐,极简无冗余)
from gpiozero import LED
from time import sleep
led = LED(18) # 对应BCM编号,和接线一致
# 一行代码实现闪烁5次,on_time亮的时间,off_time灭的时间
led.blink(on_time=0.5, off_time=0.5, n=5)
# 闪烁结束后,灯保持熄灭
led.off()
先搭建Keil工程,导入STM32标准外设库,然后复制以下代码(以PA5引脚为例):
gpio.c(GPIO初始化配置)
#include "gpio.h"
#include "stm32f10x.h"
// 初始化PA5为推挽输出(控制LED)
void GPIO_LED_Init(void)
{
// 1. 使能GPIOA时钟(STM32外设必须先使能时钟,否则无法工作)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 2. 定义GPIO初始化结构体
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; // 选择PA5引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式,驱动能力强
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 输出速率50MHz
// 3. 应用配置到GPIOA
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 4. 初始状态:PA5输出高电平,LED默认熄灭
GPIO_SetBits(GPIOA, GPIO_Pin_5);
}
main.c(主函数,实现闪烁)
#include "stm32f10x.h"
#include "gpio.h"
// 简单软件延时函数(单位:ms),适配72MHz主频
void Delay_ms(uint32_t ms)
{
uint32_t i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 12000; j++);
}
int main(void)
{
GPIO_LED_Init(); // 初始化GPIO引脚
while(1) // 死循环,持续闪烁
{
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // PA5输出低电平,LED点亮
Delay_ms(500); // 亮500ms
GPIO_SetBits(GPIOA, GPIO_Pin_5); // PA5输出高电平,LED熄灭
Delay_ms(500); // 灭500ms
}
}
// 定义LED连接的GPIO引脚(这里用13号引脚,Arduino默认有内置LED,也可外接)
const int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT); // 设置引脚为输出模式
}
void loop() {
digitalWrite(ledPin, HIGH); // 输出高电平,灯亮
delay(1000); // 亮1秒
digitalWrite(ledPin, LOW); // 输出低电平,灯灭
delay(1000); // 灭1秒
}
整理了我刚开始学的时候,踩过的所有坑,你们直接避开,少走弯路!
坑1:灯不亮,但代码没报错 → 大概率是LED正负极接反,或电阻没接对,用万用表测一下LED两端电压,有压差但不亮就是极性反了。
坑2:程序崩溃后,下次运行报错 → 树莓派没加GPIO.cleanup(),STM32没重新编译,重启开发板即可解决。
坑3:LED亮度过暗/过亮 → 电阻阻值不对,换220Ω电阻,兼顾亮度和安全性,1kΩ太暗,100Ω太亮易烧灯。
坑4:STM32下载失败 → 检查BOOT引脚配置(BOOT0接高电平下载,下载后接低电平重启),USB-TTL驱动是否安装。
坑5:树莓派GPIO编号混淆 → 别混用BCM编号和BOARD编号,代码里用的是BCM编号,接线时对应好,别接错引脚。
当你看到LED灯每隔1秒闪烁一次,那种从0到1的成就感,真的无法形容!这一步看似简单,但它验证了你的硬件连接、开发环境、代码逻辑全是对的,后续学按键控制、PWM调光、传感器采集,都是在这个基础上延伸的。
新手宝子们,别害怕出错,嵌入式学习就是从点灯开始,一步步试错、一步步进步的。收藏这篇教程,下次点灯直接翻出来用,再也不用到处找攻略啦~
评论区告诉我,你用的是什么开发板?第一次点灯花了多久?有没有踩过什么奇葩的坑?
点赞+收藏+关注,后续更新GPIO进阶教程(PWM调光、按键控制LED、多灯联动),新手跟着学,轻松入门嵌入式!