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文件烧录至芯片。

验证方法与判定标准

完成烧录并上电后,进行以下操作验证:

  1. 观察LED初始状态应为熄灭(PB1输出低电平)。
  2. 按下按键(PB0接地),LED应立即点亮。
  3. 松开按键,LED应立即熄灭。
  4. 重复按下/松开多次,LED响应应与按键动作一一对应,无延迟或误触发。

若以上行为全部符合,则判定本案例实现成功。若LED状态与按键动作不一致,检查硬件连接(按键是否接PB0与GND、LED是否接PB1与GND)以及代码中引脚编号是否与硬件一致。

按键控制LED - 硬件连接与信号流向 CMS32L051 GPIOB PB0 PB1 ↑内部上拉 按键 按下→接地 GND LED + 长脚 330Ω GND 轮询读取电平 按键按下 → PB0=低 → PB1输出高 → LED点亮

关键寄存器配置说明

CMS32L051的GPIO模式通过端口模式寄存器(PMx)和上拉寄存器(PUx)配置。标准外设库的Gpio_SetMode()函数封装了这些寄存器的操作:输入带上拉模式对应PM位为1且PU位为1;推挽输出对应PM位为0。读取引脚状态通过端口数据寄存器(PDx)实现,Gpio_ReadPin()返回该引脚当前电平。本案例使用库函数方式,屏蔽了底层寄存器细节,便于快速理解和移植。