点亮LED灯教程(附代码示例)——零基础学习STM32的第25步指南
主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
独立LED电路驱动及GPIO电平输出 | LED电路原理,设置IO端口,4种方式开关LED。 | 了解LED驱动电路的设计,学会用多种库函数操作IO。 |
师从洋桃电子,杜洋老师
📑文章目录
🚩 学习目标
通过本文你将掌握:
- LED硬件电路原理
- GPIO寄存器与库函数操作
🔧 硬件准备
1. 电路原理分析
以红色LED为例(压降2.1V,工作电流10mA):
R = (3.3V - 2.1V) / 0.01A = 120Ω
(图1:指示灯部分原理图)
2. GPIO模式选择
模式 | 适用场景 | 配置要点 |
---|---|---|
推挽输出 | LED控制 | 输出电流强,驱动能力好 |
开漏输出 | 总线设备 | 需外接上拉电阻 |
复用功能 | 外设接口 | 如USART、SPI通信 |
💻 基础代码实现(部分)
1. 初始化函数详解
#include "led.h"
void LED_Init(void){ //LED灯的接口初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = LED1 | LED2; //选择端口号(0~15或all)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
GPIO_Init(LEDPORT, &GPIO_InitStructure);
}
#ifndef __LED_H
#define __LED_H
#include "sys.h"
//#define LED1 PBout(0)// PB0
//#define LED2 PBout(1)// PB1
#define LEDPORT GPIOB //定义IO接口
#define LED1 GPIO_Pin_0 //定义IO接口
#define LED2 GPIO_Pin_1 //定义IO接口
void LED_Init(void);//初始化
#endif
…(部分展示)
2. 主程序
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"
int main (void){//主程序
RCC_Configuration(); //时钟设置
LED_Init();
while(1){
//方法1:
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
delay_us(50000); //延时1秒
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
delay_us(50000); //延时1秒
}
}
▲ ⏬完整示例代码:四种方法实现的LED闪灯程序
🔍 常见问题排查表
现象 | 排查步骤 | 解决方案 |
---|---|---|
LED完全不亮 | 1. 测量VCC与GND电压 2. 检查限流电阻值 |
更换120Ω电阻 |
闪烁频率异常 | 校准系统时钟配置 | 使用示波器测量实际时钟频率 |
多LED干扰 | 检查GPIO模式是否为推挽输出 | 避免使用浮空输入模式 |
📸 附录一 GPIO库函数
函数名 | 描述 |
---|---|
GPIO_DeInit | 将外设 GPIOx 寄存器重设为缺省值 |
GPIO_AFIODeInit | 将复用功能(重映射事件控制和 EXTI 设置)重设为缺省值 |
GPIO_Init | 根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器 |
GPIO_StructInit | 把 GPIO_InitStruct 中的每一个参数按缺省值填入 |
GPIO_ReadInputDataBit | 读取指定端口管脚的输入 |
GPIO_ReadInputData | 读取指定的 GPIO 端口输入 |
GPIO_ReadOutputDataBit | 读取指定端口管脚的输出 |
GPIO_ReadOutputData | 读取指定的 GPIO 端口输出 |
GPIO_SetBits | 设置指定的数据端口位 |
GPIO_ResetBits | 清除指定的数据端口位 |
GPIO_WriteBit | 设置或者清除指定的数据端口位 |
GPIO_Write | 向指定 GPIO 数据端口写入数据 |
GPIO_PinLockConfig | 锁定 GPIO 管脚设置寄存器 |
GPIO_EventOutputConfig | 选择 GPIO 管脚用作事件输出 |
GPIO_EventOutputCmd | 使能或者失能事件输出 |
GPIO_PinRemapConfig | 改变指定管脚的映射 |
GPIO_EXTILineConfig | 选择 GPIO 管脚用作外部中断线路 |
函数名 | GPIO_WriteBit |
---|---|
函数原型 | void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) |
功能描述 | 设置或者清除指定的数据端口位 |
输入参数 1 | GPIOx: x 可以是 A, B, C, D 或者 E,来选择 GPIO 外设 |
输入参数 2 | GPIO_Pin: 待设置或者清除的端口位 该参数可以取 GPIO_Pin_x (x 可以是 0-15) 的任意组合 参阅 Section: GPIO_Pin 查阅更多该参数允许取值范围 |
输入参数 3 | BitVal: 该参数指定了待写入的值 该参数必须取枚举 BitAction 的其中一个值 Bit_RESET: 清除数据端口位 Bit_SET: 设置数据端口位 |
输出参数 | 无 |
返回值 | 无 |
先决条件 | 无 |
被调用函数 | 无 |
示例 | /* Set the GPIOA port pin 15 */ GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET); |
🔗 相关资源
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32F103xx官方数据手册
[3] STM32F103X8-B数据手册(中文)
[4] STM32F103固件函数库用户手册(中文)
[5] 四种方法实现的LED闪灯程序
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨更多点亮LED的方法,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:v1.0 初始版本(2025-02-25)
作者:触角01010001