本篇总结
使用 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)用于输出调试信息。
| 引脚 | 功能 | 方向 | 模式 |
| PD14 | LED 控制输出(低电平点亮) | 开发板 → LED | 推挽输出 (Out_PP) |
| PA9 | USART1_TX | 开发板 → PC | 复用推挽输出 (AF_PP) |
| PA10 | USART1_RX | PC → 开发板 | 浮空输入 (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.uvprojx,F7 编译,确认 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 等便捷函数