#include "int.h"
#include "stdio.h"
#define PWMTIMER_BASE (0xE2500000)
#define TCFG0 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x00)) )
#define TCFG1 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x04)) )
#define TCON ( *((volatile unsigned long *)(PWMTIMER_BASE+0x08)) )
#define TCNTB0 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x0C)) )
#define TCMPB0 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x10)) )
#define TCNTO0 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x14)) )
#define TCNTB1 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x18)) )
#define TCMPB1 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x1C)) )
#define TCNTO1 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x20)) )
#define TCNTB2 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x24)) )
#define TCMPB2 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x28)) )
#define TCNTO2 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x2C)) )
#define TCNTB3 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x30)) )
#define TCMPB3 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x34)) )
#define TCNTO3 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x38)) )
#define TCNTB4 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x3C)) )
#define TCNTO4 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x40)) )
#define TINT_CSTAT ( *((volatile unsigned long *)(PWMTIMER_BASE+0x44)) )
void pwm_stopall(void);
void timer_request(void);
void irq_handler(void);
void timer_init(unsigned long utimer,unsigned long uprescaler,unsigned long udivider,unsigned long utcntb,unsigned long utcmpb);
void irs_timer();
// 用于记录中断发生的次数
int counter;
void timer_request(void)
{
printf("\r\n#############Timer test############\r\n");
// 禁止所有timer
pwm_stopall();
counter = 0;
// 设置timer0中断的中断处理函数
intc_setvectaddr(NUM_TIMER0,irs_timer);
// 使能timer0中断
intc_enable(NUM_TIMER0);
// 设置timer0
timer_init(0,65,4,62500,0);
}
// 停止所有timer
void pwm_stopall(void)
{
TCON = 0;
}
// timer0中断的中断处理函数
void irs_timer()
{
unsigned long uTmp;
//清timer0的中断状态寄存器
uTmp = TINT_CSTAT;
TINT_CSTAT = uTmp;
// 打印中断发生次数
printf("Timer0IntCounter = %d \r\n",counter++);
// vic相关的中断清除
intc_clearvectaddr();
}
void timer_init(unsigned long utimer,unsigned long uprescaler,unsigned long udivider,unsigned long utcntb,unsigned long utcmpb)
{
unsigned long temp0;
// 定时器的输入时钟 = PCLK / ( {prescaler value + 1} ) / {divider value} = PCLK/(65+1)/16=62500hz
//设置预分频系数为66
temp0 = TCFG0;
temp0 = (temp0 & (~(0xff00ff))) | ((uprescaler-1)<<0);
TCFG0 = temp0;
// 16分频
temp0 = TCFG1;
temp0 = (temp0 & (~(0xf<<4*utimer))& (~(1<<20))) |(udivider<<4*utimer);
TCFG1 = temp0;
// 1s = 62500hz
TCNTB0 = utcntb;
TCMPB0 = utcmpb;
// 手动更新
TCON |= 1<<1;
// 清手动更新位
TCON &= ~(1<<1);
// 自动加载和启动timer0
TCON |= (1<<0)|(1<<3);
// 使能timer0中断
temp0 = TINT_CSTAT;
temp0 = (temp0 & (~(1<<utimer)))|(1<<(utimer));
TINT_CSTAT = temp0;
}