//注:脈沖輸出無論設置為高有效或是低有效,只要不啟動定時器輸出的均為高電平。
//此函數采用捕獲中斷捕獲到同步信號即發脈沖
//發脈沖時遵循以下公式:(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;
}
|