📄 timer.c
字号:
#include <string.h>
#include "..\include\k401.h"
#include "..\include\k401lib.h"
#include "..\include\timer.h"
void __irq Timer0Done(void);
void __irq Timer1Done(void);
void __irq Timer2Done(void);
void __irq Timer3Done(void);
void __irq Timer4Done(void);
void __irq TimerFIFOInt(void);
void __irq BT_Int(void);
void Timer3_PWMMode_Test(void);
void Timer4_PWMMode_Test(void);
void Timer_Interval_Test(void);
//void Timer_Capture_Test(void);
//void Timer_MatchOverflow_Test(void);
//void Timer_DMAMode_Test(void);
void Timer_PWMMode_Test(void);
void Test_WDTimer(void);
char timervalue[]={0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, 0x0};
void *timerfunc[][2]=
{
(void *)Timer_Interval_Test, "Interval Test ",
// (void *)Timer_Capture_Test, "Capture Test ",
// (void *)Timer_MatchOverflow_Test, "Match&Over Test ",
// (void *)Timer_DMAMode_Test, "DMA Mode Test ",
(void *)Timer_PWMMode_Test, "PWM Mode Test ",
(void *)Test_WDTimer, "WDT Test ",
0,0
};
void Test_Timer(void)
{
int j,i;
int temp0=0;
int temp1=0;
temp0='q'-'a';
temp1='Q'-'a';
Uart_Printf("\nKS17C40100 Timer Test Program\n");
while(1)
{
i=0;
Uart_Printf("=========================================================================\n");
for(j=0;j<100;j++);
while(1)
{
Uart_Printf("%c: %s",'a'+i,timerfunc[i][1]);
i++;
if((int)(timerfunc[i][0])==0){Uart_Printf("\nq: Return to Main Menu\n");break;}
if((i%4)==0)Uart_Printf("\n");
}
Uart_Printf("=========================================================================\n");
Uart_Printf("Select the function to test?");
i=Uart_Getch()-'a';
if(i==temp0 || i==temp1) break;
else
{
Uart_Printf("\n");
if(i>=0 && (i<(sizeof(timerfunc)/8)) )
( (void (*)(void)) (timerfunc[i][0]) )();
}
}
}
void Timer_Interval_Test(void)
{
Uart_Printf("[Timer0,1,2,3,4 Interval Mode Test]\n");
Uart_Printf("Check the Match Interrupt\n");
Uart_Printf("To exit Timer Interval Mode Test, Press any key!!!!\n");
rTFCON=0x0; //Timer FIFO Disable
rTPRE0=0x0;
rTPRE1=0x0;
rTPRE2=0x0;
rTPRE3=0x0;
rTPRE4=0x0;
rTDAT0=0x7fff;
rTDAT1=0x2345;
rTDAT2=0x3456;
rTDAT3=0x12;
rTDAT4=0x34;
pISR_TMC0=(unsigned)Timer0Done;
pISR_TMC1=(unsigned)Timer1Done;
pISR_TMC2=(unsigned)Timer2Done;
pISR_TMC3=(unsigned)Timer3Done;
pISR_TMC4=(unsigned)Timer4Done;
rSYSCON|=BIT_GLOBAL;
rINTMSK=(BIT_TMC0|BIT_TMC1|BIT_TMC2|BIT_TMC3|BIT_TMC4);
//rINTMSK=(BIT_TMC0);
Led_Display(0xf);
rTCON0=0x80;
rTCON1=0x80;
rTCON2=0x80;
rTCON3=0x80;
rTCON4=0x80;
while(Uart_Getch()==0)Led_Display(0xf);
rTCON0=0x0;
rTCON1=0x0;
rTCON2=0x0;
rTCON3=0x0;
rTCON4=0x0;
rSYSCON&=~(BIT_GLOBAL);
rINTMSK=0x40;
}
void Timer_PWMMode_Test(void)
{
int ch;
Uart_Printf("\nTimer3,4 PWM Mode Test\n");
Uart_Printf("\nSelect channel of Timer......[3] or [4]");
ch=Uart_Getch()-'3';
if(ch==0) Timer3_PWMMode_Test();
else Timer4_PWMMode_Test();
}
void Timer3_PWMMode_Test(void)
{
Uart_Printf("[Timer3 PWM Mode Test]\n");
Uart_Printf("Check the output signal of PIN13\n");
Uart_Printf("To exit Timer Interval Mode Test, Press any key!!!!\n");
rSYSCON&=~(BIT_GLOBAL);
rPCON0|=(0x2<<5);
rTPRE3=(MCLK*2/1000000-1);
rTDAT3=0x7f;
rTCON3=0x8b;
Uart_Getch();
rTCON3=0x0;
}
volatile char *pti;
void Timer4_PWMMode_Test(void)
{
// int temp=0;
// int i;
Uart_Printf("[Timer4 PWM Mode Test]\n");
Uart_Printf("Check the output signal of PIN14\n");
Uart_Printf("To exit Timer PWM Mode Test, Press any key!!!!\n");
pti=timervalue;
rPCON0|=(0x2<<7);
rTPRE4=0xff;
rTDAT4=0x7f;
rTCON4=0x8b;
Uart_Getch();
rTCON4=0x0;
Uart_Printf("[Timer4 FIFO PWM Mode Test]\n");
Uart_Printf("Check the output signal of PIN14\n");
Uart_Printf("To exit Timer FIFO PWM Mode Test, Press any key!!!!\n");
rTPRE4=(MCLK*2/1000000-1);
rTFCON=0x9;
pISR_TF=(unsigned)TimerFIFOInt;
rSYSCON|=BIT_GLOBAL;
rINTMSK=BIT_TF;
rTCON4=0x8b;
// for(i=0;i<15;i++)
// {
// Uart_Printf("Test pti=0x%x, *pti=0x%x\n",pti+i,*(pti+i));
// i++;
// }
// temp=rTFSTAT&0x7;
rDMASRC0=(int)pti;
rDMADST0=0x3ff904b;
rDMACNT0=0x5;
rDMACON0=0x0841;
// while(1);
// while(!(rTFSTAT & 0x8))
// {
// rTFW4=timervalue[k];
// k++;
// Uart_Printf("Test: TFSTAT=0x%x, TFW4=0x%x, k=%d\n",rTFSTAT,rTFW4,k);
// if(timervalue[k]==0x0)k=0;
// }
// k=5;
Uart_Getch();
rSYSCON&=~(BIT_GLOBAL);
rTCON4=0x0;
}
volatile int isBTInt;
void Test_WDTimer(void)
{
Uart_Printf("[WatchDog Timer Test]\n");
isBTInt=0;
rBTCON=0xa503;
rINTPND=0x0;
rSYSCON|=BIT_GLOBAL;
rINTMSK=BIT_BT;
pISR_BT=(unsigned)BT_Int;
while(isBTInt!=10);
Uart_Printf("\nI will restart after 335.54ms!!!\n");
rBTCON=0xa603;
rSYSCON&=~BIT_GLOBAL;
while(1);
}
void __irq Timer0Done(void)
{
rINTPND=~(BIT_TMC0);
Led_Display(0x1);
}
void __irq Timer1Done(void)
{
rINTPND=~(BIT_TMC1);
Led_Display(0x2);
}
void __irq Timer2Done(void)
{
rINTPND=~(BIT_TMC2);
Led_Display(0x4);
}
void __irq Timer3Done(void)
{
rINTPND=~(BIT_TMC3);
Led_Display(0x8);
}
void __irq Timer4Done(void)
{
rINTPND=~(BIT_TMC4);
Led_Display(0x9);
}
void __irq TimerFIFOInt(void)
{
int temp=0;
rINTPND=~(BIT_TF);
temp=rTFSTAT&0x7;
Uart_Printf("Test temp=0x%x, pti=0x%x\n",temp, pti);
rDMASRC0=(int)(pti);
rDMADST0=0x3ff904b;
rDMACNT0=0x5-temp;
rDMACON0=0x0841;
pti+=(0x5-temp);
}
void __irq BT_Int(void)
{
rINTPND=~(BIT_BT);
Uart_Printf("%d",++isBTInt);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -