全部例程

GPIO输出 - 使用固件库点亮LED

W55MH32

更新于 2026年8月12日

本篇总结

使用 GPIO 推挽输出,控制 PD14 板载 LED 低电平点亮闪烁,串口打印系统时钟信息。

🔑 KEIL MDK、UART调试、GPIO

整改说明

原例程控制 PB0/PB2/PB3 三个 LED 做流水灯,但 W55MH32L-EVB 开发板仅有一颗用户 LED,接在 PD14(低电平点亮)。烧录原代码后 LED 完全不亮。本次整改改为 PD14 单灯闪烁,引脚和时钟同步修改。

本示例演示 W55MH32L 使用标准外设库配置 GPIO 为推挽输出模式,控制 PD14 引脚连接的板载 LED 以约 1 秒周期(亮 500ms、灭 500ms)闪烁。由于板载 LED 为低电平点亮,通过 GPIO_ResetBits() 拉低点亮 LED,GPIO_SetBits() 拉高熄灭 LED,串口同步打印系统时钟信息。

前置工具准备

开始本例程前,请确认以下工具已安装:

  • WIZ UartTool V1.0:串口收发测试工具:点击下载

硬件连接

本例程使用 PD14 引脚控制板载用户 LED。W55MH32L-EVB 开发板上的用户 LED 连接方式为:3V3 → R17(470Ω) → D4 → PD14。即 PD14 输出低电平时 LED 点亮,输出高电平时 LED 熄灭。USART1(PA9/PA10)用于输出调试信息。

引脚功能方向模式
PD14LED 控制输出(低电平点亮)开发板 → LED推挽输出 (Out_PP)
PA9USART1_TX开发板 → PC复用推挽输出 (AF_PP)
PA10USART1_RXPC → 开发板浮空输入 (IN_FLOATING)

工程结构

工程位于 SDK 内 1.SDK\ModuleDemo\GPIO_Output\,核心文件如下:

GPIO_Output/
├── USER/
│   ├── main.c            ← GPIO配置 + LED闪烁控制
│   ├── w55mh32_conf.h    ← 外设头文件集中包含
│   ├── w55mh32_it.c/h    ← 中断服务函数
│   ├── system_w55mh32.c/h← 系统初始化(时钟配置)
│   └── startup_w55mh32.s ← 启动文件
└── SYSTEM/
    └── delay/
        └── delay.c/h      ← SysTick 延时函数

步骤1:GPIO 输出配置与 LED 控制

文件:USER/main.c — 使能 GPIOD 时钟,配置 PD14 为推挽输出,主循环中使用 GPIO_ResetBits(点亮)和 GPIO_SetBits(熄灭)控制板载 LED 亮灭。


void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* 使能 GPIOD 时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

    /* PD14: 推挽输出,50MHz */
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
}

int main(void)
{
    RCC_ClocksTypeDef clocks;
    delay_init();
    UART_Configuration(115200);
    RCC_GetClocksFreq(&clocks);

    /* 打印系统时钟信息 */
    printf("\n");
    printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",
           (float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,
           (float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000,
           (float)clocks.ADCCLK_Frequency / 1000000);
    printf("GPIO IO Out Test: PD14 LED blink (active low).\n");

    GPIO_Configuration();

    /* 无限循环:LED 闪烁(低电平点亮) */
    while (1)
    {
        GPIO_ResetBits(GPIOD, GPIO_Pin_14);   /* PD14 = 0,点亮 LED(低电平点亮) */
        delay_ms(500);

        GPIO_SetBits(GPIOD, GPIO_Pin_14);     /* PD14 = 1,熄灭 LED */
        delay_ms(500);
    }
}
  

GPIO 输出配置三要素:引脚(GPIO_Pin_14)、速度(GPIO_Speed_50MHz)、模式(GPIO_Mode_Out_PP 推挽输出)。GPIOD 挂在 APB2 总线上,必须先开 RCC_APB2Periph_GPIOD 时钟,否则 GPIO 寄存器写入无效。GPIO_ResetBits() 将指定引脚置低电平(点亮 LED),GPIO_SetBits() 置高电平(熄灭 LED)。也可使用 GPIO_WriteBit() 直接写入指定值。

极性注意

板载 LED 是低电平点亮(电流从 3V3 经 R17、D4 流入 PD14,PD14 为低时导通)。所以 GPIO_ResetBits() 拉低 = 亮,GPIO_SetBits() 拉高 = 灭。这与"高电平点亮"的板子正好相反。

如果你想自定义

  • 换 LED 引脚 → 修改 GPIO 端口和引脚号,如 GPIO_Pin_15
  • 改闪烁速度 → 修改 delay_ms(500) 参数
  • 控制多个 LED → 配置多个 GPIO 引脚,使用 GPIO_Write() 同时操作整个端口
  • 开漏输出 → 将模式改为 GPIO_Mode_Out_OD,需外接上拉电阻

编译与下载

Keil MDK 中打开 GPIO_Output.uvprojxF7 编译,确认 0 Error(s)。连接 DEBUG USB 口到 PC,F8 下载。

运行验证

下载固件并按 RESET 后,PD14 连接的板载 LED 以约 1 秒周期(亮 500ms、灭 500ms)闪烁。串口调试助手可看到系统时钟信息输出:

SYSCLK: 72.0Mhz, HCLK: 72.0Mhz, PCLK1: 36.0Mhz, PCLK2: 72.0Mhz, ADCCLK: 36.0Mhz
GPIO IO Out Test: PD14 LED blink (active low).

通过示波器测量 PD14 可观察到方波信号,周期约 1 秒。由于板载 LED 低电平点亮,PD14 为低电平时 LED 亮,高电平时 LED 灭。

常见问题

Q: LED 不亮

确认 PD14 引脚连接了 LED。检查 GPIO 是否配置为推挽输出模式(GPIO_Mode_Out_PP)。确认 RCC_APB2PeriphClockCmd 已使能 GPIOD 时钟。注意板载 LED 为低电平点亮,需用 GPIO_ResetBits 拉低 PD14 才能点亮,而非拉高。

Q: LED 一直亮或一直灭

检查 GPIO_ResetBits 和 GPIO_SetBits 的调用顺序。确认 delay_ms 延时函数正常工作。用示波器或万用表测量 PD14 电平是否在 0V 和 3.3V 之间变化。

Q: LED 亮度不够

检查限流电阻值是否过大(一般 220Ω~1KΩ)。确认 GPIO 输出速度设置为 GPIO_Speed_50MHz。推挽输出模式下 GPIO 驱动能力较强,若仍不够可考虑使用三极管驱动。

总结

本文基于 W55MH32L 的 GPIO 输出功能使用标准外设库实现了板载 LED 控制:

  • GPIO 配置:PD14 推挽输出,50MHz 速度,使能 GPIOD 时钟
  • 板载 LED 为低电平点亮(3V3→R17→D4→PD14),使用 GPIO_ResetBits() 拉低点亮 LED,GPIO_SetBits() 拉高熄灭 LED
  • LED 以约 1 秒周期闪烁(亮 500ms、灭 500ms),串口打印系统时钟信息
  • 标准外设库封装了寄存器操作,提供 GPIO_SetBits/ResetBits/WriteBit/ReadInputDataBit 等便捷函数

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5 配套开发板

Andy

W5500 技术支持专家