⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 arm7 实验箱 关于步进直流电机驱动程序和步进电机的一些应用
💻 C
字号:
/****************************************Copyright (c)**************************************************/
/**                                
;**                                 西南科技大学计算机科学学院
;**                                   
;**                                http://www.cs.suswt.edu.cn
;**            
;**             日期:  2007/10/10 
;**             描述:  西南科技大学计算机学院CS-II型实验板定时器驱动工作程序,包含定时器0,定时器1  
;**             作者:
;**
;**--------------timer.c文件
;**------------------------------------------------------------------------------------------------------*/

/**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define _TIMER_C_
#ifdef  _TIMER_C_

/************************************************
 *          Header File                         * 
 ***********************************************/
 #include"config.h"
 #include"led.h"
 #include"key.h"
 #include"motor.h"
/************************************************
 *          Globale variable					*
 ***********************************************/
 uint32 div0 = 0;
 uint32 div1 = 3;
 uint32 overflow = 0;
 extern uint8 motor_step_run_flag;
 extern uint8 motor_step_speed;
 extern uint8 motor_step_speed_flag;
 extern uint8 key_up_flag;
 extern uint8 motor_step_direction;
 
 /**--------------------------------------------------------------------------**/
 //                            定时器0
 
 #define TIMER0_ENABLE
 #ifdef  TIMER0_ENABLE
/*******************************************************************************
Function Name:void __irq IRQ_Timer0(void)    								   *
Description  : Timer0的中断服务函数,需要利用Timer0进行中断的程序都可以放在这个*
			   函数中                                                          *
               ads1.2 规定,在定义中断服务函数时,必须加入关键字__irq保证函数返*
			   回时会切换处理器模式										       *
			   需要注意的是:注意在退出中断服务程序时,要清零相应外设的中断标志*
			   以及VICVectAddr,为响应下一次中断做好准备                       *      	
*******************************************************************************/
void __irq IRQTimer0(void)
 { 	
 	if(motor_step_speed_flag == FALSE)
 	{ 
	 	 switch(KEYScan())
	    {
	    	case 0x00:motor_step_run_flag = TRUE;break;
	    	case 0x08:motor_step_run_flag = FALSE;break;
	    	case 0x01:motor_step_speed_flag = TRUE;break;
	    	case 0x09:motor_step_speed_flag = FALSE;break; 
	    	case 0x02:motor_step_direction = CLOCKWISE;break;
	    	case 0x0a:motor_step_direction = ANTICLOCKWISE;break;
	    	default:break;   	
	    }
	}
    
    
    /* 上面添加需要定时器中断的代码*/
 	T0IR=0X01;                                     //清除中断
    VICSoftIntClear=0x00000010;
    VICVectAddr=0x00;                              //清除地址
 } 
 
/*******************************************************************************
Function Name:	 void Timer0_InterruptSet(void)          					   *
Description  :对中断向量的设置,包括中断类型,中断优先级,中断服务地址         *
					  中断使能。											   *	
*******************************************************************************/ 
void TIMER0InterruptSet(void)
 {
 	VICIntSelect &= 0xffffffef;                    //第4、5位分别代表定时计数器0、1  设置中断类型
 	VICVectCntl0 = 0x24;                           //为中断源分配向量IRQ的优先级 ,VICVectCntl n,n值越小优先级越高,0<=n<=15
 	                                               //0010 0100 中断源序号为4  代表计数器0中断
 	VICVectAddr0 = (int)IRQTimer0;                 //向量地址寄存器  为该中断优先级设置服务程序入口地址
 	VICIntEnable = 0x00000010; 	                   //中断使能 允许相应中断源产生中断
 }
/*******************************************************************************
Function Name:  void Timer0_Init(void)          							   *
Description  :	定时器计数器0初始化设置,包括预分频值,匹配模式,启动复位等。  *												   *						
*******************************************************************************/
 void TIMER0Init(void)                             //另外一种写法 void Timer1_Init(uint32 Div,uint32 Ovf)
 {
    T0TC = 0;                                      
 	T0PR = div0;                                   //设置预分频值  定时器计数时钟频率 Fpclk/(PR+1)
 	T0MCR = 0x03;                                  //设置匹配模式 匹配后复位T0TC,并产生中断标志  
 	T0MR0 = Fpclk/1000;                                 //设置匹配值  可以理解为计数器益出值 设置1ms匹配值
 	T0TCR = 0x03;                                  //启动并复位
 	TIMER0InterruptSet();
 }
/*******************************************************************************
Function Name:	void Timer0_Start(void)										   *
Description  :	定时器计数器0启动   				        				   *	
*******************************************************************************/
void TIMER0Start(void)
{
	T0TCR = 0x01;	                               //定时器使能,相当与定时计数器的开关
}
#endif



/**--------------------------------------------------------------------------**/
 //                               定时器1

#define TIMER1_ENABLE
#ifdef TIMER1_ENABLE

/*******************************************************************************
Function Name:void __irq IRQ_Timer1(void)    								   *
Description  : Timer1的中断服务函数,需要利用Timer1进行中断的程序都可以放在这个*
			   函数中                                                          *
               ads1.2 规定,在定义中断服务函数时,必须加入关键字__irq保证函数返*
			   回时会切换处理器模式										       *
			   需要注意的是:注意在退出中断服务程序时,要清零相应外设的中断标志*
			   以及VICVectAddr,为响应下一次中断做好准备                       *      	
*******************************************************************************/
void __irq IRQTimer1(void)
 { 	
 	if(motor_step_speed_flag==TRUE)
    {
    	switch(KEYScan())
    	{
    		
    		case 0x03:motor_step_speed = 0x00;break;
    		case 0x04:motor_step_speed = 0x01;break;
    		case 0x05:motor_step_speed = 0x02;break;
    		case 0x06:motor_step_speed = 0x03;break;
    		case 0x07:motor_step_speed = 0x04;break;
    		
    		case 0x09:motor_step_speed_flag = FALSE;break;
    		
    		case 0x0b:motor_step_speed = 0x05;break;
    		case 0x0c:motor_step_speed = 0x06;break;
    		case 0x0d:motor_step_speed = 0x07;break;
    		case 0x0e:motor_step_speed = 0x08;break;
    		case 0x0f:motor_step_speed = 0x09;break;
    		default:break;    		
    	}
    }
 	LEDScan(); 
 	LEDPrint(motor_step_speed); 
 	if(motor_step_run_flag == TRUE)
    {
    	MOTORStepRun(motor_step_speed,motor_step_direction);
    } 
   
    
    /* 上面添加需要定时器中断的代码*/
 	T1IR=0X01;                                     //清除中断
    VICSoftIntClear=0x00000010;
    VICVectAddr=0x00;                              //清除地址
 } 
 
/*******************************************************************************
Function Name:	 void Timer1_InterruptSet(void)          					   *
Description  :对中断向量的设置,包括中断类型,中断优先级,中断服务地址中断使能 *	
*******************************************************************************/ 
void TIMER1InterruptSet(void)
 {
 	VICIntSelect &= 0xffffffdf;                    //第4、5位分别代表定时计数器0、1  设置中断类型
 	VICVectCntl1 = 0x25;                           //为中断源分配向量IRQ的优先级 ,VICVectCntl n,n值越小优先级越高,0<=n<=15
 	                                               //0010 0100 中断源序号为4  代表计数器0中断
 	VICVectAddr1 = (int)IRQTimer1;                 //向量地址寄存器  为该中断优先级设置服务程序入口地址
 	VICIntEnable = 0x00000020; 	                   //中断使能 允许相应中断源产生中断
 }
 
/*******************************************************************************
Function Name:  void Timer1_Init(void)          							   *
Description  :	定时器计数器1初始化设置,包括预分频值,匹配模式,启动复位等。  *												   *						
*******************************************************************************/
 void TIMER1Init(void)                             //另外一种写法 void Timer1_Init(uint32 Div,uint32 Ovf)
 {
    T1TC = 0;                                      
 	T1PR = div1;                                   //设置预分频值  定时器计数时钟频率 Fpclk/(PR+1)
 	T1MCR = 0x03;                                  //设置匹配模式 匹配后复位T0TC,并产生中断标志  
 	T1MR0 = Fpclk/1000;                            //设置匹配值  可以理解为计数器益出值 设置1ms匹配值
 	T1TCR = 0x03;                                  //启动并复位
 	TIMER1InterruptSet();
 }
 
/*******************************************************************************
Function Name:	void Timer0_Start(void)										   *
Description :	定时器计数器0启动   		        						   *	
*******************************************************************************/
void TIMER1Start(void)
{
	T1TCR = 0x01;	                               //定时器使能,相当与定时计数器的开关
}
#endif


#endif
/*****************************************************************************
 *                         End of Entire File                                *
 ****************************************************************************/


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -