点亮LED灯教程(附代码示例)——零基础学习STM32的第25步指南

主题 内容 教学目的/扩展视频
独立LED电路驱动及GPIO电平输出 LED电路原理,设置IO端口,4种方式开关LED。 了解LED驱动电路的设计,学会用多种库函数操作IO。

师从洋桃电子,杜洋老师


📑文章目录

  • 🚩 学习目标
  • 🔧 硬件准备
  • 1. 电路原理分析
  • 2. GPIO模式选择
  • 💻 基础代码实现(部分)
  • 1. 初始化函数详解
  • 2. 主程序
  • 🔍 常见问题排查表
  • 📸 附录一 GPIO库函数
  • 🔗 相关资源

  • 🚩 学习目标

    通过本文你将掌握:

    1. LED硬件电路原理
    2. GPIO寄存器与库函数操作

    🔧 硬件准备

    1. 电路原理分析

  • LED接法:共阳/共阴接法判断(⬇️图示为共阴接法,高电平点亮)
  • 限流电阻计算
    以红色LED为例(压降2.1V,工作电流10mA):
    R = (3.3V - 2.1V) / 0.01A = 120Ω
    
  • 核心板LED位置
  • (图1:指示灯部分原理图)

    2. GPIO模式选择

    模式 适用场景 配置要点
    推挽输出 LED控制 输出电流强,驱动能力好
    开漏输出 总线设备 需外接上拉电阻
    复用功能 外设接口 如USART、SPI通信

    💻 基础代码实现(部分)

    1. 初始化函数详解

  • led.c
  • #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);
    }
    
  • led.h
  • #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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 点亮LED灯教程(附代码示例)——零基础学习STM32的第25步指南

    发表回复