打印
[S3C2440]

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

[复制链接]
1058|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
695808764|  楼主 | 2017-4-6 09:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

写了个定时器中断的程序,但是运行起来没反应,硬件是没问题的,同样的硬件运行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;        
}

相关帖子

沙发
695808764|  楼主 | 2017-4-6 14:12 | 只看该作者
求大神们给点支援啊,感觉这个是比较简单的,可能就是哪个点没有注意到,但我自己实在发现不了。。

使用特权

评论回复
板凳
695808764|  楼主 | 2017-4-8 11:24 | 只看该作者
最近,在论坛里看了一个前辈的帖子,引用他的原文:之前做2440的中断实验,就是进不了中断。然后按照网上的说法在程序中加入头文件#include “mmu.h” 在主函数中加入MMU_Init()函数就能实现中断,对mmu一无所知,使用mmu来实现中断有两种方法:
一种是将mmu.c文件中MMU_SetMTT(0x00000000,0x03f00000,(int)__ENTRY,RW_CB)的(int)__ENTER改成0x30000000;
一种是在2440init.s文件中加入下面程序
EXPORT  __ENTRY
    ENTRY
__ENTRY。
我照着试了下,果然能进入中断了!!但是我用示波器看了下,定时器实际中断时间与我设置的不同。。。而且为什么这样做能实现我也完全不懂,求大神指教啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝