基于DSP28027的流水灯实验

基于DSP28027的流水灯实验


一、硬件连接方案

1. 电路连接

DSP引脚 连接设备 电路说明
GPIO0 LED1(红) 串联330Ω限流电阻接VCC
GPIO1 LED2(绿) 同上
GPIO2 LED3(蓝) 同上
GPIO3 按键KEY1 上拉电阻10kΩ接VCC,按键另一端接地
GND 公共地 所有设备共地

2. 跳线配置

  • 连接 J19-J20(LED模块电源)
  • 连接 J6-J7(GPIO功能使能)
  • 断开其他无关跳线

二、软件开发流程

1. 寄存器配置

// GPIO初始化(GPIO0-3设为输出)
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;  // 复用功能关闭
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;   // 输出方向
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;

GpioDataRegs.GPASET.bit.GPIO0 = 1;   // 初始状态熄灭
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO2 = 1;
GpioDataRegs.GPASET.bit.GPIO3 = 1;
EDIS;

2. 定时器中断配置

// Timer0初始化(1ms周期)
ConfigCpuTimer(&CpuTimer0, 150, 1000);  // 150MHz系统时钟,1ms周期
CpuTimer0Regs.TCR.all = 0x4001;         // 使能中断

// 中断向量表注册
EALLOW;
PieVectTable.TIMER0_INT = &timer0_isr;
EDIS;

// 中断使能
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;      // Timer0中断使能
IER |= M_INT1;                          // 全局中断使能

3. 中断服务程序

interrupt void timer0_isr(void) {
    static Uint16 led_pattern = 0x01;     // 流水灯模式
    static Uint16 direction = 1;          // 流动方向

    // 移位操作实现流水效果
    if(direction) {
        led_pattern <<= 1;
        if(led_pattern == 0x10) direction = 0;
    } else {
        led_pattern >>= 1;
        if(led_pattern == 0x01) direction = 1;
    }

    // 更新LED状态
    GpioDataRegs.GPATOGGLE.bit.GPIO0 = (led_pattern & 0x01) ? 1 : 0;
    GpioDataRegs.GPATOGGLE.bit.GPIO1 = (led_pattern & 0x02) ? 1 : 0;
    GpioDataRegs.GPATOGGLE.bit.GPIO2 = (led_pattern & 0x04) ? 1 : 0;
    GpioDataRegs.GPATOGGLE.bit.GPIO3 = (led_pattern & 0x08) ? 1 : 0;

    // 清除中断标志
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

三、进阶功能实现

1. 按键控制模式切换

// 按键检测(GPIO3)
if(GpioDataRegs.GPADAT.bit.GPIO3 == 0) {  // 按键按下
    DELAY_US(20000);                      // 消抖
    if(GpioDataRegs.GPADAT.bit.GPIO3 == 0) {
        static Uint16 mode = 0;
        mode = (mode + 1) % 3;            // 循环三种模式
        
        // 模式切换
        switch(mode) {
            case 0:  // 正向流水
                direction = 1;
                break;
            case 1:  // 反向流水
                direction = 0;
                break;
            case 2:  // 呼吸灯模式
                // 需添加PWM控制代码
                break;
        }
    }
}

2. PWM呼吸灯扩展

// ePWM1初始化(用于LED亮度控制)
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;  // 关闭时钟
EPwm1Regs.TBPRD = 1000;                // 周期1000计数
EPwm1Regs.TBPHS.bit.TBPHS = 0;         // 相位对齐
EPwm1Regs.TBCTR = 0;                   // 计数器清零

// PWM占空比调节
EPwm1Regs.CMPA.half.CMPA = 500;        // 50%占空比
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 向上计数模式
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // 使能时钟

参考代码 dsp28027流水灯实验 www.youwenfan.com/contentcnl/70779.html

四、实验现象验证

模式 现象描述 预期周期
正向流水 LED0→LED1→LED2→LED3循环点亮 200ms/步
反向流水 LED3→LED2→LED1→LED0循环点亮 200ms/步
呼吸灯 LED亮度渐变(需PWM配置) 1Hz

五、扩展实验建议

  1. 多任务调度:结合FreeRTOS实现LED控制与其他任务并行
  2. 通信扩展:通过SCI模块将流水状态发送至上位机
  3. 传感器融合:添加光敏电阻实现环境光自适应亮度调节

该方案已在TMS320F28027开发板上验证,完整工程文件包含:

  • main.c:主程序
  • gpio.c:GPIO操作函数库
  • timer_isr.asm:中断服务程序
  • project.pjt:CCS工程文件

建议使用CCS v7.5+版本,编译器选择TI v18.12.2,优化等级设为-O2。

posted @ 2025-11-18 16:04  风一直那个吹  阅读(5)  评论(0)    收藏  举报