专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

TMS320F2812外设例程系列之EvTimerPeriod

作者:佚名   来源:不详   点击数:  更新时间:2014年08月17日   【字体:

  //#####################################################################

//文件:  Example_281xEvTimerPeriod.c
//说明:  配置EVA定时器1,EVA定时器2,EVB定时器3,定时器4为周期溢出中断。
//       每进行一次中断响应计数器加1。EVA定时器1的周期最短,EVB定时器4的周期最长
//测试变量:
//                 EvaTimer1InterruptCount;
//                 EvaTimer2InterruptCount;
//                 EvbTimer3InterruptCount;
//                 EvbTimer4InterruptCount;
//#####################################################################
#include "DSP281x_Device.h"   
#include "DSP281x_Examples.h"   
//功能函数原型
interrupt void eva_timer1_isr(void);
interrupt void eva_timer2_isr(void);
interrupt void evb_timer3_isr(void);
interrupt void evb_timer4_isr(void);
void init_eva_timer1(void);
void init_eva_timer2(void);
void init_evb_timer3(void);
void init_evb_timer4(void);
//全局变量
Uint32  EvaTimer1InterruptCount;
Uint32  EvaTimer2InterruptCount;
Uint32  EvbTimer3InterruptCount;
Uint32  EvbTimer4InterruptCount;
//主程序
void main(void)
{
  //步骤1.初始化系统控制(PLL,看门狗,使能外设时钟)
    InitSysCtrl();
  //步骤2.初始化GPIO 
  //InitGpio();   //本例中跳过  
  //步骤3.清除所有中断并初始化PIE中断向量表,禁止CPU中断
    DINT;
  //初始化PIE控制寄存器
    InitPieCtrl();
  //禁止CPU中断并清除所有CPU中断
    IER = 0x0000;
    IFR = 0x0000;
  //初始化PIE中断向量表 
    InitPieVectTable();
  //本例中用到的中断映射
    EALLOW;  
    PieVectTable.T1PINT = &eva_timer1_isr;
    PieVectTable.T2PINT = &eva_timer2_isr;
    PieVectTable.T3PINT = &evb_timer3_isr;
    PieVectTable.T4PINT = &evb_timer4_isr;
    EDIS;   
  //步骤4.初始化所有外设
  //InitPeripherals();   //本例中不需要,可以跳过
    init_eva_timer1();
    init_eva_timer2();
    init_evb_timer3();
    init_evb_timer4();
  //步骤5.使能中断
    //初始化计数值为 0 
    EvaTimer1InterruptCount = 0;
    EvaTimer2InterruptCount = 0;
    EvbTimer3InterruptCount = 0;
    EvbTimer4InterruptCount = 0;
    PieCtrlRegs.PIEIER2.all = M_INT4;       //使能INT2.4(T1PINT)
    PieCtrlRegs.PIEIER3.all = M_INT1;       //使能INT3.1(T2PINT)
    PieCtrlRegs.PIEIER4.all = M_INT4;       //使能INT4.4(T3PINT)
    PieCtrlRegs.PIEIER5.all = M_INT1;       //使能INT5.1(T4PINT)
    //使能CPU中断INT2(T1PINT)、INT3(T2PINT)、INT4(T3PINT)、INT5(T4PINT)
    IER |= (M_INT2 | M_INT3 | M_INT4 | M_INT5);
    //使能全局中断和全局实时DBGM中断
    EINT;   //使能全局中断INTM
    ERTM;   //使能全局实时中断DBGM
    //步骤6.空循环
    for(;;);
}
//EVA定时器1初始化程序
void init_eva_timer1(void)
{
    //初始化EVA 定时器1: 配置定时器1寄存器组(EVA)
    EvaRegs.GPTCONA.all = 0;
    //配置通用定时器1周期为0x0200
    EvaRegs.T1PR = 0x0200;         //周期
    EvaRegs.T1CMPR = 0x0000;       //比较寄存器值
    //使能通用定时器 1 周期中断位、递增计数、内部时钟模式、使能比较
    EvaRegs.EVAIMRA.bit.T1PINT = 1;
    EvaRegs.EVAIFRA.bit.T1PINT = 1;
    EvaRegs.T1CNT = 0x0000;         //清除通用定时器 1 的计数器
    EvaRegs.T1CON.all = 0x1742;
    EvaRegs.GPTCONA.bit.T1TOADC = 2; //定时器 1 周期中断启动 EVA ADC 转换
}
//EVA 定时器 2 初始化程序
void init_eva_timer2(void)
{
    //初始化 EVA定时器2: 设置定时器2寄存器组(EV A)
    EvaRegs.GPTCONA.all = 0;  
    //配置通用定时器2的周期为0x0200;
    EvaRegs.T2PR = 0x0400;       //周期
    EvaRegs.T2CMPR = 0x0000;     //比较寄存器
    //使能通用定时器2周期中断、递增计数、内部时钟模式、使能比较
    EvaRegs.EVAIMRB.bit.T2PINT = 1;
    EvaRegs.EVAIFRB.bit.T2PINT = 1;
    EvaRegs.T2CNT = 0x0000;       //清除通用定时器2的计数器
    EvaRegs.T2CON.all = 0x1742;
    EvaRegs.GPTCONA.bit.T2TOADC = 2; //周期中断启动EVA ADC转换
}
//EVB定时器3初始化程序
void init_evb_timer3(void)
{
    //初始化EVB定时器3:
    //设置定时器3寄存器组(EV B)
    EvbRegs.GPTCONB.all = 0;
    //配置通用定时器3的周期为 0x0200;
EvbRegs.T3PR = 0x0800;       //周期
EvbRegs.T3CMPR = 0x0000;     //比较寄存器
    //使能通用定时器3周期中断、递增计数、内部时钟模式、使能比较
    EvbRegs.EVBIMRA.bit.T3PINT = 1;
    EvbRegs.EVBIFRA.bit.T3PINT = 1;
    EvbRegs.T3CNT = 0x0000;     //清除通用定时器3的计数器
    EvbRegs.T3CON.all = 0x1742;
    EvbRegs.GPTCONB.bit.T3TOADC = 2;   //定时器3周期中断启动EVA ADC转换
}
//EVB定时器4初始化程序
void init_evb_timer4(void)
{
    //初始化EVB定时器4:
    //设置定时器4寄存器 (EV B)
    EvbRegs.GPTCONB.all = 0;
    //配置通用定时器4的周期为 0x0200;
    EvbRegs.T4PR = 0x1000;     //周期
    EvbRegs.T4CMPR = 0x0000;     //比较寄存器
    //使能通用定时器4周期中断、递增计数、内部时钟模式、使能比较
    EvbRegs.EVBIMRB.bit.T4PINT = 1;
    EvbRegs.EVBIFRB.bit.T4PINT = 1;
    EvbRegs.T4CNT = 0x0000;     //清除通用定时器4的计数器
    EvbRegs.T4CON.all = 0x1742;
    EvbRegs.GPTCONB.bit.T4TOADC = 2;   //定时器4周期中断启动EVA ADC转换
//EVA 定时器 1 中断服务程序
interrupt void eva_timer1_isr(void)
{
    EvaTimer1InterruptCount++;
    EvaRegs.EVAIMRA.bit.T1PINT = 1; //使能来自这个定时器的更多的中断
    EvaRegs.EVAIFRA.all = BIT7;         //注意,为了安全,写一个掩码到程序整体
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
  //应答中断接收更多的来自PIE第2组的中断
}
//EVA定时器2中断服务程序
interrupt void eva_timer2_isr(void)
{
  EvaTimer2InterruptCount++;
  //使能来自这个定时器的更多的中断
  EvaRegs.EVAIMRB.bit.T2PINT = 1;
  EvaRegs.EVAIFRB.all = BIT0;         //注意,为了安全,写一个掩码到程序整体
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;  
  //应答中断接收更多的来自PIE第3组的中断
}
//EVB 定时器 3 中断服务程序
interrupt void evb_timer3_isr(void)
{
  EvbTimer3InterruptCount++;
  EvbRegs.EVBIFRA.all = BIT7;         //注意,为了安全,写一个掩码到程序整体
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;  
  //应答中断接收更多的来自PIE第4组的中断
}
//EVB 定时器 4 中断服务程序
interrupt void evb_timer4_isr(void)
{
    EvbTimer4InterruptCount++;
    EvbRegs.EVBIFRB.all = BIT0;         //注意,为了安全,写一个掩码到程序整体
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;  
  //应答中断接收更多的来自PIE第5组的中断
}
关闭窗口