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

📄 timer.c

📁 at91rm9200基于多媒体控制接口控制smc卡的控制程序
💻 C
字号:
//timer.c
//Catinux 040811
// Include Standart LIB  files 
#include "include/AT91RM9200.h"
#include "include/lib_AT91RM9200.h"
#include "drv/eb55.h"
#include "drv/timer.h"

extern void timer0_asm_irq_handler(void);
extern void timer1_asm_irq_handler(void);
extern void timer2_asm_irq_handler(void);
extern void timer3_asm_irq_handler(void);
extern void AT91F_DBGU_Printk(	char *buffer);

int gCount_timer0_interrupt;
int gCount_timer1_interrupt;
int gCount_timer2_interrupt;
int gCount_timer3_interrupt;
//定时器钟通道初始化,时钟源使能
void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId);


//-------------------------- 外部函数 -------------------------------

//定时器0设置
void Timer0_Init ( void )
{
	//定时器0设置为计时溢出,提供系统时钟
	//时钟中断次数赋初值
    gCount_timer0_interrupt=0;
	//打开定时器,设置时钟源
	AT91F_TC_Open(AT91C_BASE_TC0,TC_CLKS_MCK8,AT91C_ID_TC0);//每秒244次中断
   	//设置定时中断句柄
	AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC0, TIMER0_INTERRUPT_LEVEL,
								AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, timer0_asm_irq_handler); 
	//设置中断触发方式,为计时溢出
	AT91C_BASE_TC0->TC_IER = AT91C_TC_COVFS;//CPCS;//IRQ enable CPC//在此改变中断触发模式,如COVFS为计时器溢出中断
	//允许中断
	AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC0);
	//触发一次中断
 	AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_TC0) ;
	//开始计时
	AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG ;
}

//定时器1设置
void Timer1_Init ( void )
{
	//定时器1设置为计时溢出
	//时钟中断次数赋初值
    gCount_timer1_interrupt=0;
	//打开定时器,设置时钟源
	AT91F_TC_Open(AT91C_BASE_TC1,TC_CLKS_MCK8,AT91C_ID_TC1);//每秒61次中断
   	//设置定时中断句柄
	AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC1, TIMER1_INTERRUPT_LEVEL,
								AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, timer1_asm_irq_handler); 
	//设置中断触发方式
	AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS;  //  IRQ enable CPC//在此改变中断触发模式,RC compare interrupt
	//允许中断
	AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC1);
	//触发一次中断
 	AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_TC1) ;
	//开始计时
	AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG ;
}
//定时器2设置
void Timer2_Init ( void )
{
	//时钟中断次数赋初值
    gCount_timer2_interrupt=0;
	//打开定时器,设置时钟源
	AT91F_TC_Open(AT91C_BASE_TC2,TC_CLKS_MCK8,AT91C_ID_TC2);//每秒?次中断?
   	//设置定时中断句柄
	AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC2, TIMER2_INTERRUPT_LEVEL,
								AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, timer2_asm_irq_handler); 
	//设置中断触发方式 //???
	AT91C_BASE_TC2->TC_IER = AT91C_TC_LOVRS;//CPAS;//COVFS;////;  //  IRQ enable CPC//在此改变中断触发模式,RC compare interrupt
	//允许中断
	AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC2);
	//触发一次中断
 	AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_TC2) ;
	//开始计时
	AT91C_BASE_TC2->TC_CCR = AT91C_TC_SWTRG ;
}
//定时器3设置
void Timer3_Init ( void )
{
	//时钟中断次数赋初值
    gCount_timer3_interrupt=0;
	//打开定时器,设置时钟源
	AT91F_TC_Open(AT91C_BASE_TC3,TC_CLKS_MCK128,AT91C_ID_TC3);//每秒61次中断
   	//设置定时中断句柄
	AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC3, TIMER3_INTERRUPT_LEVEL,
								AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, timer3_asm_irq_handler); 
	//设置中断触发方式
	AT91C_BASE_TC3->TC_IER = AT91C_TC_CPAS;//COVFS;////;  //  IRQ enable CPC//在此改变中断触发模式,RC compare interrupt
	//允许中断
	AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC3);
	//触发一次中断
 	AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_TC3) ;
	//开始计时
	AT91C_BASE_TC3->TC_CCR = AT91C_TC_SWTRG ;
}

//------------------------- 中断函数 -------------------------------
//定时器中断服务函数
//入口参数:定时器指针(AT91C_BASE_TC0,1,..)
void timer_c_irq_handler(AT91PS_TC TC_pt)
{
    unsigned int dummy;
    
    dummy = TC_pt->TC_SR;
    	
	if(TC_pt == AT91C_BASE_TC0)//定时器0中断
	{
		
	    gCount_timer0_interrupt++;	//约244次为1秒,4ms一次
		//测试定时,输出LED	//1Hz
	    if(gCount_timer0_interrupt>=244)//0x00000003d)//61
    	{
			gCount_timer0_interrupt=0;
			AT91F_DBGU_Printk("\n\n\r=======0000a======");
	    }
	    
	    //0811 TIMER0用于UCOSII的节拍服务

	    //0811end
	    
    }
    if(TC_pt ==  AT91C_BASE_TC1)//定时器1中断
	{
		gCount_timer1_interrupt++;//约244*4次为1秒,1ms一次
		//测试定时,输出LED	// 1/8Hz
	    if(gCount_timer1_interrupt>=122)
    	{
			gCount_timer1_interrupt=0;
			AT91F_DBGU_Printk("\n\n\r=======1111a======");
	    }		
	}
    if(TC_pt ==  AT91C_BASE_TC2)//定时器2中断
	{
		gCount_timer2_interrupt++;
		//测试定时,输出LED	// 1/8Hz
	    if(gCount_timer2_interrupt>=122)
    	{
			gCount_timer2_interrupt=0;
			AT91F_DBGU_Printk("\n\n\r=======22222======");
	    }		
	}
    if(TC_pt ==  AT91C_BASE_TC3)//定时器3中断
	{
		gCount_timer3_interrupt++;
		//测试定时,输出LED	// 1/8Hz
	    if(gCount_timer3_interrupt>=2)
    	{
			gCount_timer3_interrupt=0;
			AT91F_DBGU_Printk("\n\n\r=======3333======");
			//闪烁LED,间隔8s
	    }		
	}	
	
}

//------------------------------ 内部函数 --------------------------------
//时钟通道初始化,时钟源使能
void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId)
{
    unsigned int dummy;

    // First, enable the clock of the TIMER
    AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<<TimerId ) ;

	//* Disable the clock and the interrupts
	TC_pt->TC_CCR = AT91C_TC_CLKDIS ;
	TC_pt->TC_IDR = 0xFFFFFFFF ;

    //* Clear status bit 
    dummy = TC_pt->TC_SR;
    //* Supress warning variable "dummy" was set but never used
    dummy = dummy;
	//* Set the Mode of the Timer Counter
	TC_pt->TC_CMR = Mode ;

	//* Enable the clock
	TC_pt->TC_CCR = AT91C_TC_CLKEN ;
}

//end

⌨️ 快捷键说明

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