📄 timer.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 + -