找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3487|回复: 0
打印 上一主题 下一主题
收起左侧

DSP2812捕获发脉冲

[复制链接]
跳转到指定楼层
楼主
ID:135859 发表于 2016-8-3 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式




//注:脉冲输出无论设置为高有效或是低有效,只要不启动定时器输出的均为高电平。

//此函数采用捕获中断捕获到同步信号即发脉冲
//发脉冲时遵循以下公式:(T1CMPR比较值)+脉宽=T1PR周期,而计数初值T1CNT=触发脚对应值,就可以确定出T1CMPR,T1CNT,T1PR三个值
//注使用事件管理器的中断也要使能这层中断与其它中断不太一样

//TXCON简介
   //独立的GP定时控制寄存器
                           //用来决定处于4种计数模式中的哪一种,GP定时器使用内部还是外部时钟,使用8种预定标因子中的哪一种
                           //定时比较寄存器重载后进入哪种状态,定时器被使能还是禁止,周期寄存器采用定时器1,2还是自身的周期寄存器
                           //周期寄存器采用定时器3,4还是自身的周期寄存器

#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
#include "math.h"

//////捕获中断4
interrupt void evb_cap4_isr(void);
//////捕获中断5
interrupt void evb_cap5_isr(void);   
//////捕获中断6
interrupt void evb_cap6_isr(void);
//////外部区设置
void InitXintf(void);
/////系统初始化包括系统时钟
void InitSysCtrl(void);
/////IO口初始化
void InitGpio() ;
/////中断
void InitPieCtrl(void);
/////中断向量表
void InitPieVectTable(void);
/////中断初始化
void Initinterrupt(void);
int   zhuangtai[520]=0;           

//--------------主函数-----------------------------
void main()
{
Uint16 i=0;

InitSysCtrl();//系统初始化



InitXintf();//初始化外部RAM XINTF
       

       
InitGpio();//初始化GPIO口

/////////初始化EVA
////TXCON定时器控制寄存器
////15FREE,14SOFT仿真控制位(00仿真挂起时立即停止,01仿真挂起,完成当前定时器周期后停止,10仿真挂起不影响操作,11仿真挂起不影响操作,
////13Reserved    读操作返回0,写操作没有影响
////12,11TMODE 00停止/保持模式,01连续增/减计数模式,10连续递增计数模式,11方向增/减计数模式

   EvaRegs.T1CON.all=0x9046;
   EvaRegs.T2CON.all=0x9046;             //disable time1 and timer2

/////扩展控制寄存器
    EvaRegs.EXTCONA.bit.INDCOE=1;
    EvaRegs.GPTCONA.all=0x007f;

    EvaRegs.T1PR=0x6F70;   //周期10ms  100hz
    EvaRegs.T1CMPR=0x644A;  //比较值   1ms触发

    EvaRegs.T2PR=0x6F70;   
    EvaRegs.T2CMPR=0x644a;  
////EVB里的     
    EvbRegs.EXTCONB.bit.INDCOE=1;
    EvbRegs.GPTCONB.all=0x0052;

    EvbRegs.T3PR=0x6F70;   
    EvbRegs.T3CMPR=0x644a;  

  //////以上是与定时器相关的


///////捕获
    EvbRegs.CAPCONB.all=0;
    //EvbRegs.CAPFIFOB.bit.CAP4FIFO=0;
    //EvbRegs.CAPFIFOB.bit.CAP5FIFO=0;
   // EvbRegs.CAPFIFOB.bit.CAP6FIFO=0;
//////捕获中断
    EvbRegs.EVBIFRC.bit.CAP4INT=1;
    EvbRegs.EVBIFRC.bit.CAP5INT=1;
    EvbRegs.EVBIFRC.bit.CAP6INT=1;

        EvbRegs.EVBIMRC.all=0x0007;//中断屏蔽寄存器

    EvbRegs.T4PR=12500;
        EvbRegs.T4CNT=0x0001;

   EvbRegs.EVBIFRB.bit.T4PINT=1;
   EvbRegs.EVBIMRB.bit.T4PINT=1;
   EvbRegs.T4CON.all=0x9744;
   EvbRegs.CAPCONB.all=0x3054;



EvbRegs.T3CNT=300;
EvaRegs.T2CNT=300;
EvaRegs.T1CNT=300;
EvbRegs.T3CON.all=0x9046;
EvaRegs.T2CON.all=0x9046;
EvaRegs.T1CON.all=0x9046;
//EvaRegs.T1CON.all=0x9046;
/*       
EALLOW;//发生中断时调用中断函数sciaRxFifoIsr,scibRxFifoIsr
SysCtrlRegs.WDCR= 0x002F;
    EDIS;
*/       
for(i=0;i<520;i++)
zhuangtai[i]=0;

       
Initinterrupt();//初始化中断

zhuangtai[0]=GpioDataRegs.GPADAT.all&0XC0;
               
while(1)
{

}                  


}   











interrupt void evb_cap6_isr()                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
{

int  z=0;
  DINT;





EvbRegs.T3CON.all=0;

EvbRegs.T3CNT=200;


EvbRegs.T3CON.all=0x9046;


re:        EvbRegs.EVBIFRC.bit.CAP6INT=1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP5;
EINT;
}   

interrupt void evb_cap5_isr()                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
{

int  n=0;
  DINT;

EvaRegs.T2CON.all=0;

EvaRegs.T2CNT=200;



EvaRegs.T2CON.all=0x9046;


re:        EvbRegs.EVBIFRC.bit.CAP5INT=1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP5;
EINT;
}  


interrupt void evb_cap4_isr()                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
{

int  m=0;
  DINT;


EvaRegs.T1CON.all=0;


EvaRegs.T1CNT=200;

  EvaRegs.T1CON.all=0x9046;

re:        EvbRegs.EVBIFRC.bit.CAP4INT=1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP5;
EINT;
}






void Initinterrupt(void)
{

DINT;//屏蔽全局中断(INTM=1),置1,关中断

    InitPieCtrl();//初始化PIE控制寄存器

    IER=0x0000;//禁止所有的CPU级中断
    IFR=0x0000;//清除CPU级中断标志位

    InitPieVectTable();//初始化PIE中断向量表

//InitCpuTimers();

    EALLOW;//发生中断时调用中断函数sciaRxFifoIsr,scibRxFifoIsr

    EDIS;
EALLOW;
PieVectTable.CAPINT6=&evb_cap6_isr;
  PieVectTable.CAPINT4=&evb_cap4_isr;
PieVectTable.CAPINT5=&evb_cap5_isr;


EDIS;



PieCtrlRegs.PIEIER5.bit.INTx5=1;//开启第5组中断(捕获的三个中断在此组里)

      IER|=M_INT5;

       
    EINT;//使能全局中断(INTM=0),置0,开中断
    ERTM; //开全局实时中断,使能中断调试寄存器DBGM


}

void InitGpio()  //io点第二功?输入  输出设定
{
EALLOW;
//使芗拇嫫?
GpioMuxRegs.GPAMUX.all = 0x00FF; // 将EVA PWM 1-6 引脚配置
GpioMuxRegs.GPBMUX.all = 0x00FF; // 将EVB PWM 7-12 引脚配置




       
       

EDIS;
}

/////////////////











void InitSysCtrl(void)
{
  Uint16 i;
   EALLOW;

// 对于TMX产品,为了能够使得片内RAM模块M0/M1/L0/L1LH0能够获得最好的性能,控萍拇嫫鞯奈?
// 必须使能,这些位在设备硬件仿真寄存器内。TMX是TI的试验型产品


// 禁止看门狗模块
   SysCtrlRegs.WDCR= 0x0068;


// 初始化PLL模块
   SysCtrlRegs.PLLCR.all = 0x08; //如果外部晶振为20M,则SYSCLKOUT=20*1/2=10MHz

// 延时,使得PLL模块能够完成初始化操作
   for(i= 0; i< 5000; i++){}

// 高速时钟预定标器和低速时钟预定标器,产生高速外设时钟HSPCLK和低速外设时钟LSPCLK
   //SysCtrlRegs.LOSPCP.all = 0x00000;        // LSPCLK=10/1=10MHz
SysCtrlRegs.HISPCP.all=0x07;
SysCtrlRegs.LOSPCP.all=0x07;
// 对工程中使用到耐设进行时钟使能
   SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
   SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
   SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;  // SCIA模块时钟使能
   SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;  // SCIA模块时钟使能
                               
   EDIS;
       


                               

       
}

//---------------------------------------------------------------------------
// KickDog:
//---------------------------------------------------------------------------
// This function resets the watchdog timer.
// Enable this function for using KickDog in the application
void InitXintf(void)
{

       
    // Example of chaning the timing of XINTF Zones.  
    // Note acutal values should be based on the hardware
    // attached to the zone - timings presented here are
    // for example purposes.

    // All Zones:
    // Timing for all zones based on XTIMCLK = SYSCLKOUT/2
    XintfRegs.XINTCNF2.bit.XTIMCLK = 0;  // XTIMCLK = SYSCLKOUT/2
    XintfRegs.XINTCNF2.bit.CLKOFF = 1;   // DISABLE XCLKOUT
        XintfRegs.XINTCNF2.bit.WRBUFF = 0;   // NO WRITE BUFFER
        XintfRegs.XINTCNF2.bit.CLKMODE = 0;  // XCLKOUT = XTIMCLK/4

        // Zone 0
        // Ignore XREADY for Zone 1 accesses
        // Change read access lead/active/trail timing
        XintfRegs.XTIMING0.bit.USEREADY = 0;
        XintfRegs.XTIMING0.bit.XSIZE = 3;                // ALWAYS WRITE TO 11BIT
        XintfRegs.XTIMING0.bit.XWRACTIVE = 3;
        XintfRegs.XTIMING0.bit.XWRTRAIL=7;
        XintfRegs.XTIMING0.bit.XWRLEAD=3;
        XintfRegs.XTIMING0.bit.XRDLEAD = 3;
        XintfRegs.XTIMING0.bit.XRDACTIVE =7;
        XintfRegs.XTIMING0.bit.XRDTRAIL = 3;




       
    XintfRegs.XBANK.bit.BCYC = 7;        
    XintfRegs.XBANK.bit.BANK = 2;
       

        // Zone 2
        // Ignore XREADY for Zone 2 accesses
        // Change read access lead/active/trail timing
        XintfRegs.XTIMING2.bit.USEREADY = 0;
        XintfRegs.XTIMING2.bit.XSIZE = 3;
        XintfRegs.XTIMING2.bit.XWRACTIVE = 3;
        XintfRegs.XTIMING2.bit.XWRTRAIL=7;
        XintfRegs.XTIMING2.bit.XWRLEAD=3;
        XintfRegs.XTIMING2.bit.XRDLEAD = 3;
        XintfRegs.XTIMING2.bit.XRDACTIVE =7;
        XintfRegs.XTIMING2.bit.XRDTRAIL = 3;
        //no Double lead/active/trial timing for Zone 2
        XintfRegs.XTIMING2.bit.X2TIMING=1;

       
XintfRegs.XINTCNF2.bit.CLKOFF = 0;//

       
}

//************************************
//         初始化PIE控制寄存器
//************************************
void InitPieCtrl(void)
{
        // 禁止PIE模块
     PieCtrlRegs.PIECRTL.bit.ENPIE = 0;

        // 禁止PIE所有中断
     PieCtrlRegs.PIEIER1.all = 0;
     PieCtrlRegs.PIEIER2.all = 0;
     PieCtrlRegs.PIEIER3.all = 0;       
     PieCtrlRegs.PIEIER4.all = 0;
     PieCtrlRegs.PIEIER5.all = 0;
     PieCtrlRegs.PIEIER6.all = 0;
     PieCtrlRegs.PIEIER7.all = 0;
     PieCtrlRegs.PIEIER8.all = 0;
     PieCtrlRegs.PIEIER9.all = 0;
     PieCtrlRegs.PIEIER10.all = 0;
     PieCtrlRegs.PIEIER11.all = 0;
     PieCtrlRegs.PIEIER12.all = 0;

        // 清除所蠵IEIFR的中断标志位
     PieCtrlRegs.PIEIFR1.all = 0;
     PieCtrlRegs.PIEIFR2.all = 0;
     PieCtrlRegs.PIEIFR3.all = 0;       
     PieCtrlRegs.PIEIFR4.all = 0;
     PieCtrlRegs.PIEIFR5.all = 0;
     PieCtrlRegs.PIEIFR6.all = 0;
     PieCtrlRegs.PIEIFR7.all = 0;
     PieCtrlRegs.PIEIFR8.all = 0;
     PieCtrlRegs.PIEIFR9.all = 0;  
     PieCtrlRegs.PIEIFR10.all = 0;
     PieCtrlRegs.PIEIFR11.all = 0;
     PieCtrlRegs.PIEIFR12.all = 0;

        // 使能PIE模块
     PieCtrlRegs.PIECRTL.bit.ENPIE = 1;
     PieCtrlRegs.PIEACK.all = 0xFFFF;
}       

//***********************************
//        初始化PIE中断向量表
//***********************************

void InitPieVectTable(void)
{
        Uint16        i;
        Uint32 *Source = (void *) &PieVectTable;
        Uint32 *Dest = (void *) &PieVectTable;
               
        EALLOW;       
        for(i=0; i < 128; i++)
                *Dest++ = *Source++;       
        EDIS;

        // 使能PIE向量表
PieCtrlRegs.PIECRTL.bit.ENPIE = 1;       
                       
}


       
       













评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表