2. LED闪烁

任务说明

本案例基于中微CMS32系列车规MCU,使用片上GPIO控制LED灯,通过软件延时函数实现LED周期性亮灭闪烁。完成本案例后,您将掌握GPIO输出模式配置、电平翻转操作以及延时控制的基本方法。

硬件连接

LED阳极通过限流电阻(约330Ω)连接至PB0引脚,阴极接地。当PB0输出高电平时LED点亮,输出低电平时LED熄灭。CMS32开发板通常已将LED连接至指定引脚,若板载LED不在PB0,请按实际原理图调整引脚定义。

软件设计

程序主循环中先配置PB0为推挽输出模式,随后循环执行LED点亮、延时、熄灭、延时的操作。延时函数采用简单的循环递减计数实现,延时时间由系统时钟频率和循环体指令周期共同决定。本案例使用CMS32内部HRC时钟(默认频率可配置),延时函数参数为循环次数,实际延时时间与编译器优化级别相关,如需精确定时请使用定时器外设(后续案例介绍)。

代码实现


#include "CMS32L051.h"

/* 延时函数:简单软件延时 */
void delay(unsigned int count)
{
    unsigned int i;
    for (i = 0; i < count; i++)
    {
        __NOP();  /* 空操作,防止被编译器完全优化 */
    }
}

int main(void)
{
    /* 使能GPIOB时钟 */
    SYS_Enable_Clock(CLOCK_GPIOB);
    
    /* 配置PB0为输出模式 */
    GPIOB->DIR &= ~(1 << 0);      /* 0=输出 */
    GPIOB->DB_MODE &= ~(1 << 0);  /* 数字模式 */
    GPIOB->OD_MODE &= ~(1 << 0);  /* 推挽输出 */
    
    while (1)
    {
        GPIOB->DATA |= (1 << 0);   /* PB0输出高,LED点亮 */
        delay(500000);             /* 延时约0.5秒(依赖时钟频率) */
        
        GPIOB->DATA &= ~(1 << 0);  /* PB0输出低,LED熄灭 */
        delay(500000);             /* 延时约0.5秒 */
    }
}

代码说明

代码首先使能GPIOB外设时钟,然后将PB0方向寄存器配置为输出模式,并设置为数字推挽输出。主循环中通过置位和清零数据寄存器实现LED电平切换,每次切换后调用延时函数保持当前状态。延时函数参数500000为循环次数,实际延时时间取决于系统时钟频率,典型配置下约为0.5秒。

编译与烧录

本案例代码基于CMS32L051系列MCU,需使用中微官方提供的CMS32标准外设库。在Keil MDK或IAR环境中创建工程,添加上述代码并包含对应芯片头文件。编译通过后,使用CMS-ICE仿真器或J-Link通过SWD接口连接开发板,将生成的hex文件烧录至芯片。

验证方法

烧录完成后,观察开发板上连接至PB0的LED灯是否以约1Hz频率(亮0.5秒、灭0.5秒)周期性闪烁。若LED常亮或常灭,检查GPIO引脚配置是否正确、LED硬件连接是否与代码一致。若闪烁频率明显偏离预期,调整延时函数参数值即可改变闪烁速度。

判定标准

LED以肉眼可见的稳定周期持续闪烁,且亮灭时间基本相等,即可判定本案例实现成功。通过修改delay函数参数并重新烧录,LED闪烁频率应随之变化,证明延时控制逻辑有效。

CMS32L051 GPIOB PB0 330Ω LED GND PB0输出波形 点亮 熄灭 点亮 熄灭 延时 闪烁周期 ≈ 1秒