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