|
//注:脈沖輸出無論設(shè)置為高有效或是低有效,只要不啟動定時(shí)器輸出的均為高電平。
//此函數(shù)采用捕獲中斷捕獲到同步信號即發(fā)脈沖
//發(fā)脈沖時(shí)遵循以下公式:(T1CMPR比較值)+脈寬=T1PR周期,而計(jì)數(shù)初值T1CNT=觸發(fā)腳對應(yīng)值,就可以確定出T1CMPR,T1CNT,T1PR三個(gè)值
//注使用事件管理器的中斷也要使能這層中斷與其它中斷不太一樣
//TXCON簡介
//獨(dú)立的GP定時(shí)控制寄存器
//用來決定處于4種計(jì)數(shù)模式中的哪一種,GP定時(shí)器使用內(nèi)部還是外部時(shí)鐘,使用8種預(yù)定標(biāo)因子中的哪一種
//定時(shí)比較寄存器重載后進(jìn)入哪種狀態(tài),定時(shí)器被使能還是禁止,周期寄存器采用定時(shí)器1,2還是自身的周期寄存器
//周期寄存器采用定時(shí)器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);
//////外部區(qū)設(shè)置
void InitXintf(void);
/////系統(tǒng)初始化包括系統(tǒng)時(shí)鐘
void InitSysCtrl(void);
/////IO口初始化
void InitGpio() ;
/////中斷
void InitPieCtrl(void);
/////中斷向量表
void InitPieVectTable(void);
/////中斷初始化
void Initinterrupt(void);
int zhuangtai[520]=0;
//--------------主函數(shù)-----------------------------
void main()
{
Uint16 i=0;
InitSysCtrl();//系統(tǒng)初始化
InitXintf();//初始化外部RAM XINTF
InitGpio();//初始化GPIO口
/////////初始化EVA
////TXCON定時(shí)器控制寄存器
////15FREE,14SOFT仿真控制位(00仿真掛起時(shí)立即停止,01仿真掛起,完成當(dāng)前定時(shí)器周期后停止,10仿真掛起不影響操作,11仿真掛起不影響操作,
////13Reserved 讀操作返回0,寫操作沒有影響
////12,11TMODE 00停止/保持模式,01連續(xù)增/減計(jì)數(shù)模式,10連續(xù)遞增計(jì)數(shù)模式,11方向增/減計(jì)數(shù)模式
EvaRegs.T1CON.all=0x9046;
EvaRegs.T2CON.all=0x9046; //disable time1 and timer2
/////擴(kuò)展控制寄存器
EvaRegs.EXTCONA.bit.INDCOE=1;
EvaRegs.GPTCONA.all=0x007f;
EvaRegs.T1PR=0x6F70; //周期10ms 100hz
EvaRegs.T1CMPR=0x644A; //比較值 1ms觸發(fā)
EvaRegs.T2PR=0x6F70;
EvaRegs.T2CMPR=0x644a;
////EVB里的
EvbRegs.EXTCONB.bit.INDCOE=1;
EvbRegs.GPTCONB.all=0x0052;
EvbRegs.T3PR=0x6F70;
EvbRegs.T3CMPR=0x644a;
//////以上是與定時(shí)器相關(guān)的
///////捕獲
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;//發(fā)生中斷時(shí)調(diào)用中斷函數(shù)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,關(guān)中斷
InitPieCtrl();//初始化PIE控制寄存器
IER=0x0000;//禁止所有的CPU級中斷
IFR=0x0000;//清除CPU級中斷標(biāo)志位
InitPieVectTable();//初始化PIE中斷向量表
//InitCpuTimers();
EALLOW;//發(fā)生中斷時(shí)調(diào)用中斷函數(shù)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組中斷(捕獲的三個(gè)中斷在此組里)
IER|=M_INT5;
EINT;//使能全局中斷(INTM=0),置0,開中斷
ERTM; //開全局實(shí)時(shí)中斷,使能中斷調(diào)試寄存器DBGM
}
void InitGpio() //io點(diǎn)第二功?輸入 輸出設(shè)定
{
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產(chǎn)品,為了能夠使得片內(nèi)RAM模塊M0/M1/L0/L1LH0能夠獲得最好的性能,控萍拇嫫韉奈?
// 必須使能,這些位在設(shè)備硬件仿真寄存器內(nèi)。TMX是TI的試驗(yàn)型產(chǎn)品
// 禁止看門狗模塊
SysCtrlRegs.WDCR= 0x0068;
// 初始化PLL模塊
SysCtrlRegs.PLLCR.all = 0x08; //如果外部晶振為20M,則SYSCLKOUT=20*1/2=10MHz
// 延時(shí),使得PLL模塊能夠完成初始化操作
for(i= 0; i< 5000; i++){}
// 高速時(shí)鐘預(yù)定標(biāo)器和低速時(shí)鐘預(yù)定標(biāo)器,產(chǎn)生高速外設(shè)時(shí)鐘HSPCLK和低速外設(shè)時(shí)鐘LSPCLK
//SysCtrlRegs.LOSPCP.all = 0x00000; // LSPCLK=10/1=10MHz
SysCtrlRegs.HISPCP.all=0x07;
SysCtrlRegs.LOSPCP.all=0x07;
// 對工程中使用到耐設(shè)進(jìn)行時(shí)鐘使能
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; // SCIA模塊時(shí)鐘使能
SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1; // SCIA模塊時(shí)鐘使能
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的中斷標(biāo)志位
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;
}
|
評分
-
查看全部評分
|