00001 /****************************************************** 00002 * Function: s3c2440 timer driver 00003 * 00004 * File: timer.c 00005 * Author: Book Chen 00006 * Date: 2008.07.18 00007 ******************************************************* 00008 */ 00009 #include "includes.h" 00010 00011 INT8U TimeTick; 00012 00013 INT32U SystemTime; 00014 00015 volatile INT32U Timer2Counter=0; 00016 00017 void F_TimerInitial(void){ 00018 rTCON =0x00000000; // disable all timers...timer0~4 all off 00019 rTCFG0 &=0xffffff00; // set prescaler0 to 0x04 for timer 0,1 00020 rTCFG0 |=4; // set prescaler0 to 0x04 for timer 0,1 00021 rTCFG0 &=0xffff00ff; // set prescaler1 to 0x01 for timer 2,3,4 00022 rTCFG0 |=1<<8; // set prescaler1 to 0x01 for timer 2,3,4 00023 rTCFG1 =0; // set all divider to {2} 00024 TimeTick=0; 00025 SystemTime=0; 00026 } 00027 void F_TimerTimerSet(INT8U TimerNumber,INT32U Frequence){ 00028 if(TimerNumber==0){ 00029 rTCFG0 =119; 00030 rTCFG1 &=0xfffffff0; // 00031 rTCFG1 |=0x00000003; // set MUX input to 1/16...for PWM time0 00032 //rTCNTB0=F_ClockApbClockGet()/(2*2*Frequence); 00033 rTCNTB0=52083; // timer0 counter buffer 00034 rTCON &=0xfffffff0; 00035 rTCON |=0x00000002; // set manual update 00036 rTCON =0x00000009; // set timer0 auto reload,output inverter off 00037 // clear manual update ,timer starts 00038 //rTCON |=0x0000000b; // set timer0 auto reload,output inverter off,manual update on,timer starts 00039 //rTCON &=0xfffffffd; // clear timer0 manual update bit 00040 HandleTimer0=(INT32U)F_IsrTimer0; // set timer0 isr hook function 00041 } 00042 else if(TimerNumber==1){ 00043 rTCFG1 &=0xffffff0f; // 00044 rTCFG1 |=0x00000000; // set MUX input to 1/2...for PWM timer1 00045 // rTCNTB1=F_ClockApbClockGet()/(5*2*Frequence); 00046 // 16bit down timer 50M/(5*2*1000)=5000... 00047 // 5=prescaler+1,2 for timer divider,1000timetick/sec 00048 rTCNTB1=5000; //1ms 00049 //rTCMPB1=0; //this register is for pwm use 00050 rTCON &=0xfffff0ff; // 00051 rTCON |=0x00000b00; // set timer1 auto reload,output inverter off,manual update on,timer starts 00052 rTCON &=0xfffffdff; // clear timer1 manual update bit 00053 HandleTimer1=(INT32U)F_IsrTimer1; // set timer1 isr hook function 00054 00055 /*rTCFG1 &=0xffffff0f; // 00056 rTCFG1 |=0x00000030; // set MUX input to 1/16...for PWM time1 00057 //rTCNTB1=F_ClockApbClockGet()/(2*2*Frequence); 00058 rTCNTB1=52083; // timer1 counter buffer 00059 rTCON &=0xffff0fff; // 00060 rTCON |=0x00000b00; // set timer1 auto reload,output inverter off,manual update on,timer starts 00061 vrTCON &=0xfffffdff; // clear timer1 manual update bit 00062 pISR_TIMER1=(INT32U)Timer1; // set timer1 isr hook function 00063 */ 00064 } 00065 else if(TimerNumber==2){ 00066 rTCFG1 &=0xfffff0ff; // 00067 rTCFG1 |=0x00000300; // set MUX input to 1/16...for PWM time2 00068 //rTCNTB2=F_ClockApbClockGet()/(2*2*Frequence); 00069 rTCNTB2=52083; // timer2 counter buffer 00070 rTCON &=0xffff0fff; // 00071 rTCON |=0x0000b000; // set timer2 auto reload,output inverter off,manual update on,timer starts 00072 rTCON &=0xffffdfff; // clear timer2 manual update bit 00073 HandleTimer2=(INT32U)F_IsrTimer2; // set timer2 isr hook function 00074 } 00075 else if(TimerNumber==3){ 00076 rTCFG1 &=0xffff0fff; // 00077 rTCFG1 |=0x00003000; // set MUX input to 1/16...for PWM time3 00078 //rTCNTB3=F_ClockApbClockGet()/(2*2*Frequence); 00079 rTCNTB3=52083; // timer3 counter buffer 00080 rTCON &=0xffff0fff; // 00081 rTCON |=0x000b0000; // set timer3 auto reload,output inverter off,manual update on,timer starts 00082 rTCON &=0xfffdffff; // clear timer3 manual update bit 00083 HandleTimer3=(INT32U)F_IsrTimer3; // set timer3 isr hook function 00084 } 00085 else if(TimerNumber==4){ 00086 rTCFG1 &=0xfff0ffff; // 00087 rTCFG1 |=0x00030000; // set MUX input to 1/16...for PWM time4 00088 //rTCNTB4=F_ClockApbClockGet()/(2*2*Frequence); 00089 rTCNTB4=52083; // timer4 counter buffer 00090 rTCON &=0xff0fffff; // 00091 rTCON |=0x00700000; // set timer4 auto reload,output inverter off,manual update on,timer starts 00092 rTCON &=0xffdfffff; // clear timer4 manual update bit 00093 HandleTimer4=(INT32U)F_IsrTimer4; // set timer4 isr hook function 00094 } 00095 } 00096 void F_TimerTimer1IsrHook(void) { 00097 TimeTick=1; 00098 SystemTime++; 00099 if(Timer2Counter!=0) Timer2Counter--; 00100 if(XmodemCtrl.Timer!=0) XmodemCtrl.Timer--; 00101 if(ShellCtrl.Timer!=0) ShellCtrl.Timer--; 00102 //if(ShellTaskTimer!=0) ShellTaskTimer--; 00103 //if(TestTaskCtrl.Timer!=0) TestTaskCtrl.Timer--; 00104 //if(Test1TaskCtrl.Timer!=0) Test1TaskCtrl.Timer--; 00105 if(EthernetTaskCtrl.Timer!=0) EthernetTaskCtrl.Timer--; 00106 //if(Dm9000Ctrl.Timer!=0) Dm9000Ctrl.Timer--; 00107 //if(SdCtrl.Timer!=0) SdCtrl.Timer--; 00108 if(OsSchedulerCtrl.TaskSwitchTimer!=0) OsSchedulerCtrl.TaskSwitchTimer--; 00109 #if(OS_RUN_ENABLE==1) 00110 if(OSRunning==TRUE){ 00111 OS_ENTER_CRITICAL(); 00112 #if(OS_TIME_EVENT_ENABLE==1) 00113 OsTimeTickHandler(); 00114 #endif 00115 if(OsSchedulerCtrl.TaskSwitchTimer==0){ 00116 #if(OS_INT_LEVEL_CSW_ENABLE==1) 00117 OsSchedulerFindNextIsr(); 00118 #endif 00119 } 00120 OS_EXIT_CRITICAL(); 00121 } 00122 #endif 00123 } 00124