OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5122|回复: 3

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

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-5-16
在线时间
7 小时
发表于 2017-3-27 11:18:26 | 显示全部楼层 |阅读模式
5金钱
写了个定时器中断的程序,但是运行起来没反应,硬件是没问题的,同样的硬件运行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;        
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2016-11-17
在线时间
103 小时
发表于 2017-3-27 17:26:34 | 显示全部楼层
void __irq  Timer0Done(void);

void TimerInt(void)
{
          rPRIORITY = 0x00000000;               

          rINTMOD = 0x00000000;       
        、
       rINTMSK = ~(BIT_TIMER0);  

       pISR_TIMER0 = (int)Timer0Done;

       rTCFG0.....
      
       rTCFG1.....

      rTCNTB0.....
      
      rTCON.....
}

void __irq Timer0Done(void)
{
&#160; &#160;&#160; &#160;&#160;&#160;rSRCPND |= 1 << 10 ;
&#160; &#160;&#160; &#160;&#160;&#160;rINTPND |= 1 << 10 ;
&#160; &#160;&#160; &#160;&#160;&#160;flag=!flag;

&#160; &#160;&#160; &#160;&#160;&#160;if (flag)
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; Led1_On();
&#160; &#160;&#160; &#160;&#160;&#160;}
&#160; &#160;&#160; &#160;&#160;&#160;else
&#160; &#160;&#160; &#160;&#160;&#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; Led1_Off();
&#160; &#160;&#160; &#160;&#160;&#160;}
&#160; &#160;&#160; &#160;&#160;&#160;
}
这样试试!另外启动代码的中断跳转路由地址,要和pISR_TIMER0 的地址对应上
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-5-16
在线时间
7 小时
 楼主| 发表于 2017-3-27 22:59:50 | 显示全部楼层
apingzai 发表于 2017-3-27 17:26
void __irq  Timer0Done(void);

void TimerInt(void)

我按照您给的试了下,还是不行,程序下到开发板里后,led1会一直亮,我看下启动文件里面的地址, pISR_TIMER0                 (*(unsigned *)(_ISR_STARTADDRESS+0x48)),应该是没问题的。就是感觉中断只进入了一次,后面就进不去了,但是我自动重载都设置了,不懂为什么。。
回复

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2016-11-17
在线时间
103 小时
发表于 2017-4-13 10:33:39 | 显示全部楼层
上传下工程吧,这样看不出问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 12:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表