您的位置:首页 > 其它

ok6410的定时器0 测试程序

2012-06-15 23:20 316 查看
#include "def.h"
#include "gpio.h"
#include "library.h"
#include "system.h"
#include "timer.h"
#include "intc.h"
#include "sfr6410.h"

/*

此函数的功能仅仅在于测试TIMER0的定时功能,以最简单的形式展示 “初始化定时器以及相关中断”
上述头文件在国嵌资料中有提供。

实现效果是:定时地在 LED1, LED2 , LED3之间轮转:
*/
#define        GPIO    ((volatile oGPIO_REGS*)GPIO_BASE)

extern void    SYSC_GetClkInform(void);
void    LedInit(void);
void    LedPlay(u8 l_num);
void    Delay(int time);
void    TimerInit(u8 t_num, int ms);

int main(void)
{
//使能中断向量控制器:
SYSTEM_EnableVIC();
//使能IRQ模式中断:
SYSTEM_EnableIRQ();
//得到g_PCLK时钟:
SYSC_GetClkInform();
//初始化中断:
INTC_Init();
//定时器初始化:
TimerInit(0 , 500);
//Led初始化:
LedInit();

while(1);
}
//定时器服务例程
void    __irq    Isr_Timer(void)
{
// 1. 清除对应的未决位:
u32    uConValue;
uConValue = Inp32(rTINT_CSTAT);
uConValue |= (0x1<<(5 + 1));
Outp32(rTINT_CSTAT,uConValue);
// 2. 需要处理的东西///////////////////
LedPlay(1);
Delay(100);
LedPlay(2);
Delay(100);
LedPlay(3);

// 3. 必须清除中断服务运行地址,为下次中断准备:
Outp32(rVIC0ADDR,0);

}

//定时器初始化;
void    TimerInit(u8 t_num, int ms)
{
u32    uConValue;
// 1. 对中断进行配置前最好先关闭定时器:
Outp32(rTCON,0);
// 2. 对定时器配置定时器所采用的频率,最后得到2048的分频:

//第一步:配置precaler0为127分频:
uConValue = Inp32(rTCFG0);
uConValue &= ~0xff;
uConValue |= 0x7f;
Outp32(rTCFG0, uConValue);
//第二步:配置二级分频为16;共分频2048:
uConValue = Inp32(rTCFG1);
uConValue &= ~0xf;
uConValue |= 0x4;
Outp32(rTCFG1,uConValue);
// 3. 设置定时器所需要的计算值:

// 可以算得1微秒的 计数值 为g_PCLK/2048/1000  设为500毫秒计算值:
if(t_num == 1)
Outp32(rTCNTB1,((g_PCLK>>11)/1000) * ms);
else if(t_num == 0)
Outp32(rTCNTB0,((g_PCLK>>11)/1000) * ms );
// 4. 对状态位写1,清除当前的未决中断:
uConValue = Inp32(rTINT_CSTAT);
uConValue |= (0x1<<(5+ t_num));
Outp32(rTINT_CSTAT,uConValue);

// 5. 注册安装定时器的中断函数: 每个寄存器存有4个字节的地址所以乘以4
if(t_num == 0)
Outp32(rVIC0VECTADDR+4*NUM_TIMER0, (u32)Isr_Timer);
else if(t_num == 1)
Outp32(rVIC0VECTADDR+4*NUM_TIMER1, (u32)Isr_Timer);
// 6. 使能定时器的中断使能位:
uConValue = Inp32(rVIC0INTENABLE);
uConValue |= (0x1 << NUM_TIMER0) | (0x1 << NUM_TIMER1);
Outp32(rVIC0INTENABLE,uConValue);

//  7. 设置使得定时器可以发生中断:
uConValue = Inp32(rTINT_CSTAT);
uConValue |= 0x1 << (t_num);
Outp32(rTINT_CSTAT,uConValue);

// 8.  最后使定时器开始计数,
uConValue = Inp32(rTCON);
//第一步:设置手动装入定时器的计算缓冲器;
uConValue &= ~(0x1f << t_num*8);
uConValue |= 0x2 << (t_num * 8);
Outp32(rTCON,uConValue);

//第二步:设置自动装入,并开启定时器:
uConValue = Inp32(rTCON);
uConValue &= ~(0x1f << t_num * 8);
uConValue |= 0x9 << (t_num *8);
Outp32(rTCON,uConValue);

}

//延时函数;
void    Delay(int time)
{
int i;
for(; time > 0; time--)
for(i=0; i < 3000; i++);
}

//led初始化;
void    LedInit(void)
{
u32    uConValue;

uConValue = GPIO->rGPIOMCON;
uConValue &= ~(0xf | (0xf<<4) | (0xf<<8) | (0xf<<12));
uConValue |= (0x1 | (0x1 << 4) | (0x1 << 8) | (0x1 << 12));
GPIO->rGPIOMCON = uConValue;

}
//led工作,l_num为什么值就点着对应的led灯:
void    LedPlay(u8    l_num)
{
u32        tmp;
tmp = GPIO->rGPIOMDAT;
tmp |=  0x1f;
tmp &= (~ (1 << (l_num - 1)));
GPIO->rGPIOMDAT = tmp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: