//注:脉冲输出无论设置为高有效或是低有效,只要不启动定时器输出的均为高电平。
//此函数采用捕获中断捕获到同步信号即发脉冲
//发脉冲时遵循以下公式:(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;
}
|