📄 timer.c.bak
字号:
#include "def.h"
#include "option.h"
#include <string.h>
#include "k44.h"
#include "k44lib.h"
#include "etcs.h"
volatile int tmcCnt0,tmcCnt1,tmcCnt2,tmcCnt3,tmcCnt4,tmcCnt5;
volatile int tmcVal0,tmcVal1,tmcVal2,tmcVal3,tmcVal4,tmcVal5;
volatile int tovfCnt0,tovfCnt1,tovfCnt2,tovfCnt3,tovfCnt4,tovfCnt5;
volatile int trerror,trtotal;
/*
#define RDTNCNT(n) \
U32 RdT##n##CNT(void)\
{\
unsigned t0,t1;\
rT##n##CNT;\
while(1)\
{\
t0=rT##n##CNT;\
t1=rT##n##CNT;\
trtotal++;\
if(t0==t1)return t1;\
if((t0+1)==t1)return t1;\
if(t0==99 && t1==0)return t1;\
trerror++;\
}\
}
*/
#define RDTNCNT(n) \
U32 RdT##n##CNT(void)\
{\
unsigned t0,t1;\
rT##n##CNT;\
while(1)\
{\
t0=rT##n##CNT;\
t1=rT##n##CNT;\
if(t0==t1)return t1;\
if((t0+1)==t1)return t1;\
}\
}
RDTNCNT(0) //void RdT0CNT(void){...}
RDTNCNT(1) //void RdT1CNT(void){...}
RDTNCNT(2) //void RdT2CNT(void){...}
RDTNCNT(3) //void RdT3CNT(void){...}
RDTNCNT(4) //void RdT4CNT(void){...}
RDTNCNT(5) //void RdT5CNT(void){...}
void __irq IsrT0MCLed(void)
{
rINTPEND=~BIT_T0MC;
tmcVal0=RdT0CNT();
Led_Display(tmcCnt0++);
}
void __irq IsrT0MC(void)
{
rINTPEND=~BIT_T0MC;
tmcVal0=RdT1CNT();
}
void __irq IsrT1MC(void)
{
rINTPEND=~BIT_T1MC;
tmcVal1=RdT2CNT();
tmcCnt1++;
}
void __irq IsrT2MC(void)
{
rINTPEND=~BIT_T2MC;
tmcVal2=RdT3CNT();
tmcCnt2++;
}
void __irq IsrT3MC(void)
{
rINTPEND=~BIT_T3MC;
tmcVal3=RdT4CNT();
tmcCnt3++;
}
void __irq IsrT4MC(void)
{
rINTPEND=~BIT_T4MC;
tmcVal4=RdT4CNT();
tmcCnt4++;
}
void __irq IsrT5MC(void)
{
rINTPEND=~BIT_T5MC;
tmcVal5=RdT5CNT();
tmcCnt5++;
}
void __irq IsrT0OVF(void)
{
rINTPEND=~BIT_T0OVF;
tovfCnt0++;
}
void __irq IsrT1OVF(void)
{
rINTPEND=~BIT_T1OVF;
tovfCnt1++;
}
void __irq IsrT2OVF(void)
{
rINTPEND=~BIT_T2OVF;
tovfCnt2++;
}
void __irq IsrT3OVF(void)
{
rINTPEND=~BIT_T3OVF;
tovfCnt3++;
}
void __irq IsrT4OVF(void)
{
rINTPEND=~BIT_T4OVF;
tovfCnt4++;
}
void __irq IsrT5OVF(void)
{
rINTPEND=~BIT_T5OVF;
tovfCnt5++;
}
void Test_Timer(void)
{
int i;
int t0,t1,t2,t3,t4,t5;
Uart_Printf("[]Timer0,1,2,3,4,5 interrupt test\n");
Uart_Printf("NOTE: GPIO0 has to be connected to TIN.\n\n");
rP0CON|=0x1; //GPIO0=output;
pISR_T0MC=(unsigned)IsrT0MCLed; //to signal the interrupt period outside
pISR_T1MC=(unsigned)IsrT1MC;
pISR_T2MC=(unsigned)IsrT2MC;
pISR_T3MC=(unsigned)IsrT3MC;
pISR_T4MC=(unsigned)IsrT4MC;
pISR_T5MC=(unsigned)IsrT5MC;
pISR_T0OVF=(unsigned)IsrT0OVF;
pISR_T1OVF=(unsigned)IsrT1OVF;
pISR_T2OVF=(unsigned)IsrT2OVF;
pISR_T3OVF=(unsigned)IsrT3OVF;
pISR_T4OVF=(unsigned)IsrT4OVF;
pISR_T5OVF=(unsigned)IsrT5OVF;
tmcCnt0=tmcCnt1=tmcCnt2=tmcCnt3=tmcCnt4=tmcCnt5=0;
tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
rINTMASK=BIT_T0MC|BIT_T1MC|BIT_T2MC|BIT_T3MC|BIT_T4MC|BIT_T5MC|
BIT_T0OVF|BIT_T1OVF|BIT_T2OVF|BIT_T3OVF|BIT_T4OVF|BIT_T5OVF;
///////////////////////
//Interval mode test
///////////////////////
Uart_Printf("1) Interval mode test.\n");
Uart_Printf("[PROBE]Check GPIO0 frequency(500hz) for 0.5s\n");
rT0PRE=199; //100khz(20Mhz/200)
rT1PRE=199;
rT2PRE=199;
rT3PRE=199;
rT4PRE=199;
rT5PRE=199;
rT0DATA=99; //100khz/(99+1)=1khz
rT1DATA=99;
rT2DATA=99;
rT3DATA=99;
rT4DATA=99;
rT5DATA=99;
rT0CON=0xc0; //En CLR ITVAL EXTCLK 00
rT1CON=0xc0; //1 1 000 0 00
rT2CON=0xc0;
rT3CON=0xc0;
rT4CON=0xc0;
rT5CON=0xc0;
for(i=0;i<500;i++)
{
Led_Display(i);
while(rT0CNT<90);
while(rT0CNT>=90);
}
//Because the interrupt, TnCNT may not be near 0.
t0=RdT0CNT();
t1=RdT1CNT();
t2=RdT2CNT();
t3=RdT3CNT();
t4=RdT4CNT();
t5=RdT5CNT();
rT0CON=0x0; //Dis NCLR MC&OVF EXTCLK 00
rT1CON=0x0; //0 0 000 0 00
rT2CON=0x0;
rT3CON=0x0;
rT4CON=0x0;
rT5CON=0x0;
Uart_Printf("TnCNT=??, tmcCntn=500\n");
Uart_Printf("T0CNT=%d, tmcCnt0=%d\n",t0,tmcCnt0);
Uart_Printf("T1CNT=%d, tmcCnt1=%d\n",t1,tmcCnt1);
Uart_Printf("T2CNT=%d, tmcCnt2=%d\n",t2,tmcCnt2);
Uart_Printf("T3CNT=%d, tmcCnt3=%d\n",t3,tmcCnt3);
Uart_Printf("T4CNT=%d, tmcCnt4=%d\n",t4,tmcCnt4);
Uart_Printf("T5CNT=%d, tmcCnt5=%d\n",t5,tmcCnt5);
/////////////////////////////
//Match& Overflow mode test
/////////////////////////////
Uart_Printf("2) Match & OVF mode test.\n");
tmcCnt0=tmcCnt1=tmcCnt2=tmcCnt3=tmcCnt4=tmcCnt5=0;
tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
tmcVal0=tmcVal1=tmcVal2=tmcVal3=tmcVal4=tmcVal5=0;
rT0CON=0xc8; //En CLR MC&OVF EXTCLK 00
rT1CON=0xc8; //1 1 001 0 00
rT2CON=0xc8;
rT3CON=0xc8;
rT4CON=0xc8;
rT5CON=0xc8;
while(rT0CNT<200);
while(rT0CNT>=200); //to wait the timer overflow
while(rT0CNT<200);
t0=RdT0CNT();
t1=RdT1CNT();
t2=RdT2CNT();
t3=RdT3CNT();
t4=RdT4CNT();
t5=RdT5CNT();
rT0CON=0x08; //Dis NCLR MC&OVF EXTCLK 00
rT1CON=0x08; //0 0 001 0 00
rT2CON=0x08;
rT3CON=0x08;
rT4CON=0x08;
rT5CON=0x08;
Uart_Printf("TnCNT=???, tmcCntn=2, tmcValn=100, tovfCntn=1\n");
Uart_Printf("T0CNT=%d, tmcCnt0=%d, tmcVal0=%d, tovfCnt0=%d\n",t0,tmcCnt0,tmcVal0,tovfCnt0);
Uart_Printf("T1CNT=%d, tmcCnt1=%d, tmcVal1=%d, tovfCnt1=%d\n",t1,tmcCnt1,tmcVal1,tovfCnt1);
Uart_Printf("T2CNT=%d, tmcCnt2=%d, tmcVal2=%d, tovfCnt2=%d\n",t2,tmcCnt2,tmcVal2,tovfCnt2);
Uart_Printf("T3CNT=%d, tmcCnt3=%d, tmcVal3=%d, tovfCnt3=%d\n",t3,tmcCnt3,tmcVal3,tovfCnt3);
Uart_Printf("T4CNT=%d, tmcCnt4=%d, tmcVal4=%d, tovfCnt4=%d\n",t4,tmcCnt4,tmcVal4,tovfCnt4);
Uart_Printf("T5CNT=%d, tmcCnt5=%d, tmcVal5=%d, tovfCnt5=%d\n",t5,tmcCnt5,tmcVal5,tovfCnt5);
///////////////////////////////////
//Capture mode test: falling mode
///////////////////////////////////
pISR_T0MC=(unsigned)IsrT0MC;
//IsrT0MCLed can't be used when testing the capture mode.
tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
rP0=rP0&(~0x1); //GPIO0=0;
Uart_Printf("> Capture mode (falling mode).\n");
rT0CON=0xe0; //En CLR CAP_F EXTCLK 00
rT1CON=0xe0; //1 1 100 0 00
rT2CON=0xe0;
rT3CON=0xe0;
rT4CON=0xe0;
rT5CON=0xe0;
while(rT5CNT<1000);
rP0=rP0|(0x1); //GPIO0=1;
while(rT5CNT<2000);
rP0=rP0&(~0x1); //GPIO0=0;
while(rT5CNT>100); //check OVF interrupt is occurred.
rT0CON=0x20; //Dis NCLR CAP_F EXTCLK 00
rT1CON=0x20; //0 0 100 0 00
rT2CON=0x20;
rT3CON=0x20;
rT4CON=0x20;
rT5CON=0x20;
Uart_Printf("TnDATA=2000, tovfCntn=1\n");
Uart_Printf("T0DATA=%d, tovfCnt0=%d\n",rT0DATA,tovfCnt0);
Uart_Printf("T1DATA=%d, tovfCnt1=%d\n",rT1DATA,tovfCnt1);
Uart_Printf("T2DATA=%d, tovfCnt2=%d\n",rT2DATA,tovfCnt2);
Uart_Printf("T3DATA=%d, tovfCnt3=%d\n",rT3DATA,tovfCnt3);
Uart_Printf("T4DATA=%d, tovfCnt4=%d\n",rT4DATA,tovfCnt4);
Uart_Printf("T5DATA=%d, tovfCnt5=%d\n",rT5DATA,tovfCnt5);
//////////////////////////////////
//Capture mode test: rising mode
//////////////////////////////////
tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
rP0=rP0&(~0x1); //GPIO0=0;
Uart_Printf("> Capture mode (rising mode).\n");
rT0CON=0xe8; //En CLR CAP_R EXTCLK 00
rT1CON=0xe8; //1 1 101 0 00
rT2CON=0xe8;
rT3CON=0xe8;
rT4CON=0xe8;
rT5CON=0xe8;
while(rT5CNT<1000);
rP0=rP0|(0x1); //GPIO0=1;
while(rT5CNT<2000);
rP0=rP0&(~0x1); //GPIO0=0;
while(rT5CNT>100); //check OVF interrupt is occurred.
rT0CON=0x28; //Dis NCLR CAP_R EXTCLK 00
rT1CON=0x28; //0 0 101 0 00
rT2CON=0x28;
rT3CON=0x28;
rT4CON=0x28;
rT5CON=0x28;
Uart_Printf("TnDATA=1000, tovfCntn=1\n");
Uart_Printf("T0DATA=%d, tovfCnt0=%d\n",rT0DATA,tovfCnt0);
Uart_Printf("T1DATA=%d, tovfCnt1=%d\n",rT1DATA,tovfCnt1);
Uart_Printf("T2DATA=%d, tovfCnt2=%d\n",rT2DATA,tovfCnt2);
Uart_Printf("T3DATA=%d, tovfCnt3=%d\n",rT3DATA,tovfCnt3);
Uart_Printf("T4DATA=%d, tovfCnt4=%d\n",rT4DATA,tovfCnt4);
Uart_Printf("T5DATA=%d, tovfCnt5=%d\n",rT5DATA,tovfCnt5);
//////////////////////////////////////////
//Capture mode test: rising&falling mode
//////////////////////////////////////////
tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
rP0=rP0&(~0x1); //GPIO0=0;
Uart_Printf("> Capture mode (rising&falling mode).\n");
rT0CON=0xf0; //En CLR CAP_RF EXTCLK 00
rT1CON=0xf0; //1 1 110 0 00
rT2CON=0xf0;
rT3CON=0xf0;
rT4CON=0xf0;
rT5CON=0xf0;
while(rT5CNT<1000);
rP0=rP0|(0x1); //GPIO0=1;
t0=rT0DATA; //save the capture data
t1=rT1DATA;
t2=rT2DATA;
t3=rT3DATA;
t4=rT4DATA;
t5=rT5DATA;
while(rT5CNT<2000);
rP0=rP0&(~0x1); //GPIO0=0;
while(rT5CNT>100); //check OVF interrupt is occurred.
rT0CON=0x30; //Dis NCLR CAP_RF EXTCLK 00
rT1CON=0x30; //0 0 110 0 00
rT2CON=0x30;
rT3CON=0x30;
rT4CON=0x30;
rT5CON=0x30;
Uart_Printf("1st_TnDATA=1000, 2nd_TnDATA=2000, tovfCntn=1\n");
Uart_Printf("1st_T0DATA=%d, 2nd_T0DATA=%d, tovfCnt0=%d\n",t0,rT0DATA,tovfCnt0);
Uart_Printf("1st_T1DATA=%d, 2nd_T1DATA=%d, tovfCnt1=%d\n",t1,rT1DATA,tovfCnt1);
Uart_Printf("1st_T2DATA=%d, 2nd_T2DATA=%d, tovfCnt2=%d\n",t2,rT2DATA,tovfCnt2);
Uart_Printf("1st_T3DATA=%d, 2nd_T3DATA=%d, tovfCnt3=%d\n",t3,rT3DATA,tovfCnt3);
Uart_Printf("1st_T4DATA=%d, 2nd_T4DATA=%d, tovfCnt4=%d\n",t4,rT4DATA,tovfCnt4);
Uart_Printf("1st_T5DATA=%d, 2nd_T5DATA=%d, tovfCnt5=%d\n",t5,rT5DATA,tovfCnt5);
rINTMASK=0x0;
}
void Test_TimerRegRead(void)
{
int t0,t1,t2,t3,t4,t5;
Uart_Printf("[]Timer0,1,2,3,4,5 interrupt test\n");
Uart_Printf("NOTE: GPIO0 has to be connected to TIN.\n\n");
rP0CON|=0x1; //GPIO0=output;
pISR_T0MC=(unsigned)IsrT0MCLed; //to signal the interrupt period outside
pISR_T1MC=(unsigned)IsrT1MC;
pISR_T2MC=(unsigned)IsrT2MC;
pISR_T3MC=(unsigned)IsrT3MC;
pISR_T4MC=(unsigned)IsrT4MC;
pISR_T5MC=(unsigned)IsrT5MC;
pISR_T0OVF=(unsigned)IsrT0OVF;
pISR_T1OVF=(unsigned)IsrT1OVF;
pISR_T2OVF=(unsigned)IsrT2OVF;
pISR_T3OVF=(unsigned)IsrT3OVF;
pISR_T4OVF=(unsigned)IsrT4OVF;
pISR_T5OVF=(unsigned)IsrT5OVF;
tmcCnt0=tmcCnt1=tmcCnt2=tmcCnt3=tmcCnt4=tmcCnt5=0;
tovfCnt0=tovfCnt1=tovfCnt2=tovfCnt3=tovfCnt4=tovfCnt5=0;
//rINTMASK=BIT_T0MC|BIT_T1MC|BIT_T2MC|BIT_T3MC|BIT_T4MC|BIT_T5MC|
// BIT_T0OVF|BIT_T1OVF|BIT_T2OVF|BIT_T3OVF|BIT_T4OVF|BIT_T5OVF;
///////////////////////
//Interval mode test
///////////////////////
Uart_Printf("Timer register(TnCNT) reading test.\n");
rT0PRE=199; //100khz(20Mhz/200)
rT1PRE=199;
rT2PRE=199;
rT3PRE=199;
rT4PRE=199;
rT5PRE=199;
rT0DATA=99; //100khz/(99+1)=100hz
rT1DATA=99;
rT2DATA=99;
rT3DATA=99;
rT4DATA=99;
rT5DATA=99;
rT0CON=0xc0; //En CLR ITVAL EXTCLK 00
rT1CON=0xc0; //1 1 000 0 00
rT2CON=0xc0;
rT3CON=0xc0;
rT4CON=0xc0;
rT5CON=0xc0;
rSYSCFG=0x1ff1;
rSYSCFG=0x1ff1;
trerror=0;
trtotal=0;
while(!Uart_GetKey())
{
t0=RdT0CNT();
t1=RdT1CNT();
t2=RdT0CNT();
t3=RdT1CNT();
t4=RdT0CNT();
t5=RdT1CNT();
Uart_Printf("%3d,%3d,%3d,%3d,%3d,%3d,(t=%d,e=%d)\n",
t0,t1,t2,t3,t4,t5,trtotal,trerror);
//If timer interrupt occurs during reading TnCNT, the read values will be different.
//The timer interrupt occurs when TnCNT is 99 -> 0
}
}
/*
U32 RdT0CNT(void)
{
register t0,t1;
while(1)
{
t0=rT0CNT;
t1=rT0CNT; //These two values should be read sequentially to avoud the timer value increment.
if(t0==t1)return t1;
}
;above code assembly
;-g- without -zpz0
EXPORT RdT0CNT
RdT0CNT
0x00144c: e3a02af9 ..*. : MOV r2,#0xf9000
0x001450: e282261f ..&. : ADD r2,r2,#0x1f00000
0x001454: e1d210b6 .... : LDRH r1,[r2,#6]
0x001458: e1d200b6 .... : LDRH r0,[r2,#6]
0x00145c: e1510000 .Q.. : CMP r1,r0
0x001460: 1afffffb .... : BNE 0x1454
0x001464: e1a0f00e .... : MOV pc,r14
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -