[资料分享] DSP定时器与中断系统实现LED灯变频闪烁

Jacktang   2019-12-1 17:42 楼主

利用定时器中断实现LED灯变频闪烁
实例比较简单,直接上源码。

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
/***************************************************************************************************
**Description  ** 全局变量定义
***************************************************************************************************/
volatile unsigned int timer_int_cnt;
interrupt void cpu_timer0_isr(void);
interrupt void cpu_timer1_isr(void);
interrupt void cpu_timer2_isr(void);
void Gpio_select(void);
void main(void)
{
       InitSysCtrl();   //  初始化系统控制,包括看门狗、PLL、外部时钟
       Gpio_select();     // 初始化使用到的GPIO口;
       DINT;            //禁止CPU中断
       InitPieCtrl();   //初始化PIE控制寄存器到他们的默认状态,即禁止PIE中断及清除所有PIE中断标志
       IER = 0x0000;    // 禁止CPU中断
       IFR = 0x0000;    // 清除所有CPU中断标志
       InitPieVectTable();//初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
       EALLOW;            //解除寄存器保护
       PieVectTable.TINT0 = &cpu_timer0_isr;         //PIE组1第7个中断为定时器Timer0(外设中断)
       PieVectTable.XINT13 = &cpu_timer1_isr;        //TINT13为CPU定时器中断Timer1(内部中断源)
       PieVectTable.TINT2 = &cpu_timer2_isr;         //TINT2为CPU定时器中断Timer2(内部中断源)
       EDIS;              //寄存器保护
       InitCpuTimers();   // 初始化CPU定时器

#if (CPU_FRQ_150MHZ)      // 配置CPU定时器 0, 1, and 2 中断周期,150MHzCPU频率, 周期单位为us;
       ConfigCpuTimer(&CpuTimer0, 150, 100000);    //Timer0定时器中断周期为0.1s
       ConfigCpuTimer(&CpuTimer1, 150, 200000);    //Timer1定时器中断周期为0.2s
       ConfigCpuTimer(&CpuTimer2, 150, 400000);    //Timer2定时器中断周期为0.4s
#endif
       CpuTimer0Regs.TCR.all = 0x4001; // 设置TIE = 1,开启定时器0中断
      CpuTimer1Regs.TCR.all = 0x0001; // 设置TIE = 0,关闭定时器1中断
       CpuTimer2Regs.TCR.all = 0x0001; // 设置TIE = 0,关闭定时器2中断
       IER |= M_INT1;                  //使能CPU中断线INT1
       IER |= M_INT13;                 //使能CPU中断线INT13
       IER |= M_INT14;                 //使能CPU中断线INT14
       PieCtrlRegs.PIEIER1.bit.INTx7 = 1;    //使能PIE组1第七位的使能标志位
       EINT;     // 使能全局中断INTM
       ERTM;     // 使能全局实时中断DBGM
    timer_int_cnt = 0;
       for(;;);
}
interrupt void cpu_timer0_isr(void)       //Timer0中断处理函数
{
       CpuTimer0.InterruptCount++;
       EALLOW;
        if(timer_int_cnt++ >= 12) 
        {
            timer_int_cnt = 0;
            CpuTimer0Regs.TCR.all = 0x0001;           // 设置TIE = 0,关闭定时器0中断
            CpuTimer1Regs.TCR.all = 0x4001;           // 设置TIE = 1,开启定时器1中断
            CpuTimer2Regs.TCR.all = 0x0001;           // 设置TIE = 0,关闭定时器2中断
        }

    GpioDataRegs.GPBTOGGLE.all =0x30000000; 
        GpioDataRegs.GPCTOGGLE.all =0x00000007;
       PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;    //PIEACK标志位置位,告诉PIE可以接受本组其他中断处理
       EDIS;
}

interrupt void cpu_timer1_isr(void)     //Timer1中断处理函数
{
       CpuTimer1.InterruptCount++;
       EALLOW;
       if( timer_int_cnt++ >= 12) 
        {
                timer_int_cnt = 0;
            CpuTimer0Regs.TCR.all = 0x0001;          // 设置TIE = 0,关闭定时器0中断
            CpuTimer1Regs.TCR.all = 0x0001;          // 设置TIE = 0,关闭定时器1中断
            CpuTimer2Regs.TCR.all = 0x4001;          // 设置TIE = 1,开启定时器2中断
        }
        GpioDataRegs.GPBTOGGLE.all =0x30000000;          //对应的GPIO高低电平翻转
        GpioDataRegs.GPCTOGGLE.all =0x00000007;          //对应的GPIO高低电平翻转
       // The CPU acknowledges the interrupt.
       EDIS;
}
interrupt void cpu_timer2_isr(void)      //Timer2中断处理函数
{  
       CpuTimer2.InterruptCount++;
        EALLOW;
        if( timer_int_cnt++ >= 12) 
        {
            timer_int_cnt = 0;
            CpuTimer0Regs.TCR.all = 0x4001;          // 设置TIE = 1,开启定时器0中断
            CpuTimer1Regs.TCR.all = 0x0001;          // 设置TIE = 0,关闭定时器1中断
            CpuTimer2Regs.TCR.all = 0x0001;          // 设置TIE = 0,关闭定时器2中断
        }
        GpioDataRegs.GPBTOGGLE.all =0x30000000; 
        GpioDataRegs.GPCTOGGLE.all =0x00000007;
       EDIS;
}
void Gpio_select(void)
{
        EALLOW;
    GpioCtrlRegs.GPAMUX1.all = 0x00000000;  // 对应的引脚复用成IO
    GpioCtrlRegs.GPAMUX2.all = 0x00000000;  // 对应的引脚复用成IO
    GpioCtrlRegs.GPBMUX1.all = 0x00000000;  // 对应的引脚复用成IO
        GpioCtrlRegs.GPBMUX2.all = 0x00000000;  // 对应的引脚复用成IO
    GpioCtrlRegs.GPCMUX1.all = 0x00000000;  // 对应的引脚复用成IO
    GpioCtrlRegs.GPCMUX2.all = 0x00000000;  // 对应的引脚复用成IO
        GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF;    // 对应的引脚用作输出
        GpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF;   // 对应的引脚用作输出
        GpioCtrlRegs.GPCDIR.all = 0xFFFFFFFF;   // 对应的引脚用作输出
       GpioDataRegs.GPBDAT.all    =0x30000000;  // 设置对应引脚的高低电平
       GpioDataRegs.GPCDAT.all    =0x00000007;  // 设置对应引脚的高低电平
        EDIS;
}    

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复