2. 按键控制LED
任务说明
本案例基于中微CMS32系列车规MCU,实现按键控制LED亮灭。核心目标是:配置一个GPIO引脚为输入模式(按键),另一个GPIO引脚为输出模式(LED),通过轮询方式读取按键状态,当按键按下时点亮LED,松开时熄灭LED。通过本案例掌握输入模式配置、输出模式配置以及轮询读取GPIO的基本方法。
硬件连接
- 按键:一端连接PB0引脚,另一端连接GND(按下为低电平)
- LED:正极通过限流电阻(约330Ω)连接PB1引脚,负极连接GND
- MCU:CMS32L051(中微车规级MCU)
软件实现
代码基于CMS32L051标准外设库,使用PB0作为按键输入(内部上拉),PB1作为LED输出。主循环中持续读取PB0电平状态,若为低电平(按键按下)则置高PB1点亮LED,否则清零PB1熄灭LED。
#include "CMS32L051.h"
// 引脚定义
#define KEY_PIN GPIO_PIN_0 // PB0 - 按键输入
#define LED_PIN GPIO_PIN_1 // PB1 - LED输出
#define KEY_PORT GPIOB // 按键所在端口
#define LED_PORT GPIOB // LED所在端口
// 时钟与GPIO初始化
void GPIO_Init(void)
{
// 使能GPIOB时钟
Crm_ClkEnable(CRM_GPIOB_CLK);
// 配置PB0为输入模式,内部上拉
Gpio_SetMode(KEY_PORT, KEY_PIN, Gpio_Mode_In_PU);
// 配置PB1为推挽输出模式
Gpio_SetMode(LED_PORT, LED_PIN, Gpio_Mode_Out_PP);
// 初始状态:LED熄灭
Gpio_SetPin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
}
// 主函数
int main(void)
{
// 系统时钟初始化(默认内部HSI 8MHz)
Sysctrl_Init();
// GPIO初始化
GPIO_Init();
while(1)
{
// 轮询读取按键状态
// 按键按下时PB0为低电平(因为按键接GND)
if(Gpio_ReadPin(KEY_PORT, KEY_PIN) == GPIO_PIN_RESET)
{
// 按键按下,点亮LED
Gpio_SetPin(LED_PORT, LED_PIN, GPIO_PIN_SET);
}
else
{
// 按键松开,熄灭LED
Gpio_SetPin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
}
}
}
代码说明
- 时钟使能:使用
Crm_ClkEnable(CRM_GPIOB_CLK)开启GPIOB端口时钟,这是操作GPIO的前提。 - 输入模式配置:
Gpio_SetMode(KEY_PORT, KEY_PIN, Gpio_Mode_In_PU)将PB0配置为带上拉的输入模式。由于按键另一端接GND,按下时引脚被拉低,松开时由上拉电阻保持高电平,无需外部上拉电阻。 - 输出模式配置:
Gpio_SetMode(LED_PORT, LED_PIN, Gpio_Mode_Out_PP)将PB1配置为推挽输出,可提供足够的驱动电流点亮LED。 - 轮询读取:主循环中通过
Gpio_ReadPin()持续读取PB0状态,根据电平高低控制LED亮灭,实现实时响应。
工程文件与编译烧录
在官方CMS32L051开发环境中新建工程,将上述代码复制到main.c中,并确保工程已包含标准外设库文件(CMS32L051.h及相关源文件)。编译无误后,通过CMS-ICE仿真器或ISP方式将生成的hex文件烧录至芯片。
验证方法与判定标准
完成烧录并上电后,进行以下操作验证:
- 观察LED初始状态应为熄灭(PB1输出低电平)。
- 按下按键(PB0接地),LED应立即点亮。
- 松开按键,LED应立即熄灭。
- 重复按下/松开多次,LED响应应与按键动作一一对应,无延迟或误触发。
若以上行为全部符合,则判定本案例实现成功。若LED状态与按键动作不一致,检查硬件连接(按键是否接PB0与GND、LED是否接PB1与GND)以及代码中引脚编号是否与硬件一致。
关键寄存器配置说明
CMS32L051的GPIO模式通过端口模式寄存器(PMx)和上拉寄存器(PUx)配置。标准外设库的Gpio_SetMode()函数封装了这些寄存器的操作:输入带上拉模式对应PM位为1且PU位为1;推挽输出对应PM位为0。读取引脚状态通过端口数据寄存器(PDx)实现,Gpio_ReadPin()返回该引脚当前电平。本案例使用库函数方式,屏蔽了底层寄存器细节,便于快速理解和移植。