您的位置:首页 > 其它

基于国嵌ok6410教学视频的“定时器0中断"实验

2012-06-06 23:01 274 查看
View Code

#include "def.h"
#include "gpio.h"
#include "library.h"
#include "system.h"
#include "timer.h"
#include "intc.h"
#include "sfr6410.h"

/*

此函数的功能仅仅在于测试TIMER0的定时功能,以最简单的形式展示 “初始化定时器以及相关中断”
上述头文件在国嵌资料中有提供。
*/
#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(void);

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

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

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

}

//定时器初始化;
void    TimerInit(void)
{
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毫秒计算值:
Outp32(rTCNTB0,((g_PCLK>>11)/1000) * 500);
// 4. 对状态位写1,清除当前的未决中断:
uConValue = Inp32(rTINT_CSTAT);
uConValue |= (0x1<<5);
Outp32(rTINT_CSTAT,uConValue);

// 5. 注册安装定时器0的中断函数:
Outp32(rVIC0VECTADDR+4*NUM_TIMER0, (u32)Isr_Timer);
// 6. 使能定时器0的中断使能位:
uConValue = Inp32(rVIC0INTENABLE);
uConValue |= 0x1 << NUM_TIMER0;
Outp32(rVIC0INTENABLE,uConValue);

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

// 8.  最后使定时器开始计数,
uConValue = Inp32(rTCON);
uConValue &= ~0x1f;
uConValue |= 0x2;
//第一步:设置手动装入定时器的计算缓冲器;
Outp32(rTCON,uConValue);
//第二步:设置自动装入,并开启定时器:
uConValue = Inp32(rTCON);
uConValue &= ~0x1f;
uConValue |= 0x9;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: