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

📄 timer.c

📁 在ads1.2下调试AT91RM9200的PWM功能测试程序源码
💻 C
字号:
//timer.c
//Catinux 040811
// Include Standart LIB  files 
#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"
#include "eb55.h"
#include "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_WaveformInit ( void )
{
    gCount_timer2_interrupt=0;
	//打开定时器,设置时钟源
	AT91F_PIO_CfgPeriph(
		AT91C_BASE_PIOA, // PIO controller base address
		0,
		((unsigned int) AT91C_PA20_TIOB1) |
		((unsigned int) AT91C_PA21_TIOA2) // Peripheral B
		);

	AT91F_TC_Open(AT91C_BASE_TC2,
	              TC_CLKS_MCK8                  //TIMER_CLOCK2 =mck/8
	              | AT91C_TC_WAVE              //WAVE=1, work on waveform mode
				 | AT91C_TC_WAVESEL_UPDOWN
				 | AT91C_TC_ACPA_SET
				 | AT91C_TC_ACPC_CLEAR
				 | AT91C_TC_AEEVT_NONE
				 | AT91C_TC_ASWTRG_NONE
				 | AT91C_TC_BCPB_NONE
				 | AT91C_TC_BCPC_NONE
				 | AT91C_TC_BEEVT_NONE
				 | AT91C_TC_BSWTRG_NONE
				 | AT91C_TC_EEVT_RISING,
	              AT91C_ID_TC2);

	AT91C_BASE_TC2->TC_RA=0x0043;
	AT91C_BASE_TC2->TC_RB=0x0080;
	AT91C_BASE_TC2->TC_RC=0x00a5;

	//开始计时
	AT91C_BASE_TC2->TC_CCR = AT91C_TC_SWTRG ;//|AT91C_TC_CLKEN;
}

//------------------------- 中断函数 -------------------------------
//定时器中断服务函数
//入口参数:定时器指针(AT91C_BASE_TC0,1,..)
void timer0_c_irq_handler()
{
    unsigned int dummy;    
    dummy = AT91C_BASE_TC0->TC_SR;
// 			AT91F_DBGU_Printk("\n\n\r=======00======");   		
	    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======");
	    }	     
}

void timer1_c_irq_handler()
{
    unsigned int dummy;    
    dummy = AT91C_BASE_TC1->TC_SR;
//			AT91F_DBGU_Printk("\n\n\r=======11======");
		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***********");
			AT91F_DBGU_Printk("\n\n\r====1111a==");
	    }		
}

void timer2_c_irq_handler()
{
    unsigned int dummy;    
    dummy = AT91C_BASE_TC2->TC_SR;
//			AT91F_DBGU_Printk("\n\n\r=======11======");
		gCount_timer2_interrupt++;//约244*4次为1秒,1ms一次
		//测试定时,输出LED	// 1/8Hz
	    if(gCount_timer2_interrupt>=122)
    	{
			gCount_timer2_interrupt=0;
			AT91F_DBGU_Printk("\n\n\r=======2222a======");
	    }		
}

//------------------------------ 内部函数 --------------------------------
//时钟通道初始化,时钟源使能
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 + -