📄 timer.c
字号:
Delay(1); //To compensate timer error(<1 tick period)
rTCON = 0x0; //One-shot, Inverter off, No operation, Dead zone disable, Stop
if(variable4==1 && variable3==1 && variable2==1 && variable1==1 && variable0==1)
{
Uart_Printf("Timer 0,1,2,3,4 One-shot Interrupt Test => OK!\n");
}
else
{
Uart_Printf("Timer 0,1,2,3,4 One-shot Interrupt Test => Fail............\n");
}
Uart_Printf("Timer0: %d (=1)\nTimer1: %d (=1)\nTimer2: %d (=1)\nTimer3: %d (=1)\nTimer4: %d (=1)\n",
variable0,variable1,variable2,variable3,variable4);
/* Timer0,1,2,3,4 Interrupt Service is masked */
rINTMSK |= (BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0);
Uart_Printf("Press any key\n");
while(!Uart_Getch()); //Key board press check
}
/****** Timer Interrupt Request ******/
void __irq Timer0Done(void)
{
rSRCPND = BIT_TIMER0; //Clear pending bit
rINTPND = BIT_TIMER0;
rINTPND; //Prevent an double interrupt pending
variable0++;
}
void __irq Timer1Done(void)
{
rSRCPND = BIT_TIMER1; //Clear pending bit
rINTPND = BIT_TIMER1;
rINTPND;
variable1++;
}
void __irq Timer2Done(void)
{
rSRCPND = BIT_TIMER2; //Clear pending bit
rINTPND = BIT_TIMER2;
rINTPND;
variable2++;
}
void __irq Timer3Done(void)
{
rSRCPND = BIT_TIMER3; //Clear pending bit
rINTPND = BIT_TIMER3;
rINTPND;
variable3++;
}
void __irq Timer4Done(void)
{
rSRCPND = BIT_TIMER4; //Clear pending bit
rINTPND = BIT_TIMER4;
rINTPND;
variable4++;
}
/******************** Timer DMA Request Test ********************/
void Test_TimerDma(void)
{
int i;
rTCFG0 = rTCFG0 & ~(0xffffff) | 0x0; //Dead zone=0, Prescaler0,1 = 0
rTCFG1 = rTCFG1 & ~(0xffffff) | 0x3 << 0 | 0x1 << 20; //Mux0 1/16, DMA Request Channel 0
rTCNTB0 = 65500;
rTCMPB0 = 30000;
rTCNTB1 = 65500;
rTCMPB1 = 30000;
rTCNTB2 = 65500;
rTCMPB2 = 30000;
rTCNTB3 = 65500;
rTCMPB3 = 30000;
rTCNTB4 = 65500;
rTCON = rTCON & ~(0xffffff) | 0x1<<1 | 0x1<<9 | 0x1<<13 | 0x1<<17 | 0x1<<21 ; //Manual update
Uart_Printf("\nTimer 0 DMA Request Test\n\n");
rTCON = 0x1 | 0x1<<3; //Auto reload, Start
for(i=0 ; i < 4 ; i++)
DMA_M2M(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single
rTCON = 0x0; //Timer Stop
Uart_Printf("\nTimer 1 DMA Request Test\n\n");
rTCFG1 = rTCFG1 & ~(0xffffff) | 0x3 << 4 | 0x2 << 20; //Mux0 1/16, DMA Request Channel 2
rTCON = 0x1<<8 | 0x1<<11; //Auto reload, Start
for(i=0 ; i < 4 ; i++)
DMA_M2M(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single
rTCON = 0x0;
Uart_Printf("\nTimer 2 DMA Request Test\n\n");
rTCFG1 = rTCFG1 & ~(0xffffff) | 0x3 << 8 | 0x3 << 20; //Mux0 1/16, DMA Request Channel 3
rTCON = 0x1<<12 | 0x1<<15; //Auto reload, Start
for(i=0 ; i < 4 ; i++)
DMA_M2M(3,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single
rTCON = 0x0;
Uart_Printf("\nTimer 3 DMA Request Test\n\n");
rTCFG1 = rTCFG1 & ~(0xffffff) | 0x3 << 12 | 0x4 << 20; //Mux0 1/16, DMA Request Channel 0
rTCON = 0x1<<16 | 0x1<<19; //Auto reload, Start
for(i=0 ; i < 4 ; i++)
DMA_M2M(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single
rTCON = 0x0;
Uart_Printf("\nTimer 4 DMA Request Test\n\n");
rTCFG1 = rTCFG1 & ~(0xffffff) | 0x3 << 16 | 0x5 << 20; //Mux0 1/16, DMA Request Channel 2
rTCON = 0x1<<20 | 0x1<<22; //Auto reload, Start
for(i=0 ; i < 4 ; i++)
DMA_M2M(2,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single
rTCON = 0x0;
Uart_Printf("Press any key\n");
while(!Uart_Getch()); //Key board press check
}
/***** Memory to Memory DMA Service Routine *****/
void DMA_M2M(int ch,int srcAddr,int dstAddr,int tc,int dsz,int burst)
{
int i,time;
volatile U32 memSum0=0,memSum1=0;
DMA *pDMA; //Pointer for DMA Special Register Structure
int length;
length=tc*(burst ? 4:1)*((dsz==0)+(dsz==1)*2+(dsz==2)*4); //total data size(byte address)
// Counter value * burst size * data size
Uart_Printf("[DMA%d MEM2MEM Test]\n",ch);
switch(ch)
{
case 0:
pISR_DMA0=(int)Dma0Done; //DMA0 interrupt Vector Table Initialzation
rINTMSK&=~(BIT_DMA0); //DMA0 interrupt Enable
pDMA=(void *)0x4b000000; //pDMA ponter indicate first addr. of DMA0 Special Register
break;
case 1:
pISR_DMA1=(int)Dma1Done; //DMA1 interrupt Vector Table Initialzation
rINTMSK&=~(BIT_DMA1);
pDMA=(void *)0x4b000040;
break;
case 2:
pISR_DMA2=(int)Dma2Done; //DMA2 interrupt Vector Table Initialzation
rINTMSK&=~(BIT_DMA2);
pDMA=(void *)0x4b000080;
break;
case 3:
pISR_DMA3=(int)Dma3Done; //DMA3 interrupt Vector Table Initialzation
rINTMSK&=~(BIT_DMA3);
pDMA=(void *)0x4b0000c0;
break;
}
Uart_Printf("DMA%d %8xh->%8xh,size=%xh(tc=%xh),dsz=%d,burst=%d\n",ch,srcAddr,dstAddr,length,tc,dsz,burst);
Uart_Printf("Initialize the src.\n");
for(i=srcAddr;i<(srcAddr+length);i+=4)
{
*((U32 *)i)=i^0x55aa5aa5;
memSum0+=i^0x55aa5aa5;
}
Uart_Printf("DMA%d start\n",ch);
dmaDone=0;
/* Value Setting of Current DMA Special Registers */
pDMA->DISRC=srcAddr;
pDMA->DISRCC=(0<<1)|(0<<0); //inc,AHB
pDMA->DIDST=dstAddr;
pDMA->DIDSTC=(0<<1)|(0<<0); //inc,AHB
pDMA->DCON=tc|(1<<31)|(1<<30)|(1<<29)|(burst<<28)|(1<<27)|(0x3<<24)|(1<<23)|(1<<22)|(dsz<<20)|(tc);
//HS,AHB,TC interrupt,whole, HWSource request mode,relaod off
pDMA->DMASKTRIG= 0x1<<1; //DMA on,
/* DMA Start */
Timer_Start(3);//128us resolution
while(dmaDone==0);
time=Timer_Stop();
Uart_Printf("DMA transfer done. time=%f, %fMB/S\n",(float)time/ONESEC3, length/((float)time/ONESEC3)/1000000.);
rINTMSK=BIT_ALLMSK;
/* Check DMA Result */
for(i=dstAddr;i<dstAddr+length;i+=4)
{
memSum1+=*((U32 *)i)=i^0x55aa5aa5;
}
Uart_Printf("memSum0=%x,memSum1=%x\n",memSum0,memSum1);
if(memSum0==memSum1)
Uart_Printf("DMA test result--------------------------------------O.K.\n");
else
Uart_Printf("DMA test result--------------------------------------ERROR!!!\n");
}
/***** DMA Interrupt Service Routine *****/
static void __irq Dma0Done(void)
{
ClearPending(BIT_DMA0);
dmaDone=1;
}
static void __irq Dma1Done(void)
{
ClearPending(BIT_DMA1);
dmaDone=1;
}
static void __irq Dma2Done(void)
{
ClearPending(BIT_DMA2);
dmaDone=1;
}
static void __irq Dma3Done(void)
{
ClearPending(BIT_DMA3);
dmaDone=1;
}
void Test_WDT_IntReq(void)
{
/* WDT ISR addr Initialization */
pISR_WDT_AC97 = (unsigned)Wdt_Int;
isWdtInt = 0;
//f_watchdog = PCLK / (Prescaler value + 1 ) / Division_factor
Uart_Printf("[WatchDog Timer Interrupt Request Test]\n");
/* WDT INTMSK Enable */
ClearPending(BIT_WDT_AC97);
rINTMSK&=~(BIT_WDT_AC97); //Watch dog Interrupt service is available
rSUBSRCPND=(BIT_SUB_WDT);
rINTSUBMSK&=~(BIT_SUB_WDT);
/* WDT Interrupt Test */
// 1. Clock division_factor 128
Uart_Printf("\nClock Division Factor: 128(dec), Prescaler: 7812(dec)\n");
rWTCON = ((PCLK/1000000-1)<<8) | (3<<3) | (1<<2); //Clock division 128, Interrupt enable
rWTDAT = 7812 ;
rWTCNT = 7812 ;
rWTCON = rWTCON | (1<<5); //Watch-dog timer enable
while(isWdtInt != 10);
// 2. Clock division_factor 64
isWdtInt = 0;
Uart_Printf("\nClock Division Factor: 64(dec), Prescaler: 7812(dec)\n");
rWTCON = ((PCLK/1000000-1)<<8) | (2<<3) | (1<<2); //Clock division 64, Interrupt enable
rWTDAT = 7812 ;
rWTCNT = 7812 ;
rWTCON = rWTCON | (1<<5); //Watch-dog timer enable
while(isWdtInt != 10);
// 3. Clock division_factor 32
isWdtInt = 0;
Uart_Printf("\nClock Division Factor: 32(dec), Prescaler: 7812(dec)\n");
rWTCON = ((PCLK/1000000-1)<<8) | (1<<3) | (1<<2); //Clock division 32, Interrupt enable
rWTDAT = 7812 ;
rWTCNT = 7812 ;
rWTCON = rWTCON | (1<<5); //Watch-dog timer enable
while(isWdtInt != 10);
// 4. Clock division_factor 16
isWdtInt = 0;
Uart_Printf("\nClock Division Factor: 16(dec), Prescaler: 7812(dec)\n");
rWTCON = ((PCLK/1000000-1)<<8) | (0<<3) | (1<<2); //Clock division 16, Interrupt enable
rWTDAT = 7812 ;
rWTCNT = 7812 ;
rWTCON = rWTCON | (1<<5); //Watch-dog timer enable
while(isWdtInt != 10);
// 5. Prescaler: 128
isWdtInt = 0;
Uart_Printf("\n\nPrescaler: 128(dec), Clock Division Factor: 128(dec)\n");
rWTCON = (128<<8) | (3<<3) | (1<<2); //Clock division 128, Interrupt enable
rWTDAT = 3077 ;
rWTCNT = 3077 ;
rWTCON = rWTCON | (1<<5); //Watch-dog timer enable
while(isWdtInt != 10);
// 6. Prescaler: 64
isWdtInt = 0;
Uart_Printf("\nPrescaler: 64(dec), Clock Division Factor: 128(dec)\n");
rWTCON = (64<<8) | (3<<3) | (1<<2); //Clock division 64, Interrupt enable
rWTDAT = 3077 ;
rWTCNT = 3077 ;
rWTCON = rWTCON | (1<<5); //Watch-dog timer enable
while(isWdtInt != 10);
// 7. Prescaler: 32
isWdtInt = 0;
Uart_Printf("\nPrescaler: 32(dec), Clock Division Factor: 128(dec)\n");
rWTCON = (32<<8) | (3<<3) | (1<<2); //Clock division 32, Interrupt enable
rWTDAT = 3077 ;
rWTCNT = 3077 ;
rWTCON = rWTCON | (1<<5); //Watch-dog timer enable
while(isWdtInt != 10);
// 8. Prescaler: 16
isWdtInt = 0;
Uart_Printf("\nPrescaler: 16(dec), Clock Division Factor: 128(dec)\n");
rWTCON = (16<<8) | (3<<3) | (1<<2); //Clock division 16, Interrupt enable
rWTDAT = 3077;
rWTCNT = 3077 ;
rWTCON = rWTCON | (1<<5); //Watch-dog timer enable
while(isWdtInt != 10);
/* WDT Reset Test */
rWTCON = (128<<8) | (3<<3) | (1); //Prescaler=0x31(49),Clock division 128,Reset enable
Uart_Printf("\nI will restart after 2 sec.\n");
rWTCNT = 3077;
rWTCON = rWTCON | (1<<5); //Watch-dog timer Interrupt enable
while(1);
rINTSUBMSK|=(BIT_SUB_WDT);
}
/***** WDT Interrupt Service Rotine *****/
void __irq Wdt_Int(void)
{
rSUBSRCPND=(BIT_SUB_WDT); // Clear Sub int pending
ClearPending(BIT_WDT_AC97); // Clear master pending
Uart_Printf("%d ",++isWdtInt);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -