主题 : 有S3C2440关裸机的定时器中断程序进不去的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 131127
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2017-03-02
最后登录: 2017-04-08
楼主  发表于: 2017-04-05 22:50

 有S3C2440关裸机的定时器中断程序进不去的问题

写了个定时器中断的程序,但是运行起来没反应,硬件是没问题的,同样的硬件运行uart中断什么的都能正常,唯独定时器中断进不去,请教一下各位,能给指点一下吗?下面是我写的程序。


#include "2440addr.h"
#include "def.h"
#include <stdarg.h>
//#define _ISR_STARTADDRESS         0x33ffff00

static unsigned int flag = 1;

/*****************************************************************/
/* LED部分 */
/*****************************************************************/
#define Led1_Off()      {rGPADAT &= (~(1 << 5));}
#define Led1_On()     {rGPADAT |= (1 << 5);}
#define Led2_Off()      {rGPADAT &= (~(1 << 4));}
#define Led2_On()     {rGPADAT |= (1 << 4);}
#define Led3_Off()      {rGPADAT &= (~(1 << 3));}
#define Led3_On()     {rGPADAT |= (1 << 3);}
#define Led4_Off()      {rGPADAT &= (~(1 << 2));}
#define Led4_On()     {rGPADAT |= (1 << 2);}


void Led_Init(void)
{
        rGPACON &= ~(0xf <<2);
}

/*****************************************************************/
/* 定时器部分 */
/*****************************************************************/
/*
* 启动代码中已经设置了系统时钟,PCLK = 50M
* 若TIMER0获得25KHZ的时钟源,选择分频50M/25K = 2000
* 2000 = 250 * 8 ,所以prescaler等于249,divider等于8
* TCFG0控制预分频,TCFG1控制分频
* TCNTB0/TCMPB0定时器0计数缓冲寄存器和比较缓冲寄存器
* 详细参看S3C2440寄存器手册
*/
void Timer0_Init(void)
{
        rTCFG0 &= ~(0xff) ;
        rTCFG0 |= 249 ;
        rTCFG1 &=  ~(0xf) ;
        rTCFG1 |=  0x02 ;
        rTCNTB0 =  12500 ;//0.5s中断一次
        
        rTCON |= (1 << 1) ;//手动更新
        rTCON &= ~(1 << 1) ;
        rTCON |=  0x09 ; //自动加载,清除手动更新位,启动定时器        
}




/*****************************************************************/
/* 中断部分: */
/*****************************************************************/
/*
* 开启定时器0中断INTMSK第10位是TIMER0的标志位
*/
void Timer0_Interrupt_Init(void)
{
        
        rINTMSK &= ~(1 << 10) ;
}

/*****************************************************************/

/*****************************************************************/
/*
* 中断处理:关闭LED1,记得清除中断
*/
void __irq Timer0_Isr(void)
{
        rSRCPND |= 1 << 10 ;
        rINTPND |= 1 << 10 ;
        flag=!flag;

        if (flag)
        {
                Led1_On();
        }
        else
        {
                Led1_Off();
        }
        
}



void Isr_Init(void)
{
        pISR_TIMER0 = (U32)Timer0_Isr ;        
}
/*****************************************************************/



int Main()
{
        Led_Init() ;
        Timer0_Interrupt_Init();
        Timer0_Init();
        Isr_Init() ;
        
while(1)
{
        ;
}
  
        return 0;        
}
级别: 禁止发言
UID: 132451
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
贡献值: 0 点
综合积分: 32 分
注册时间: 2017-05-08
最后登录: 2017-06-04
1楼  发表于: 2017-05-29 21:04
用户被禁言,该主题自动屏蔽!