4066|8

53

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

一个LPC2132的中断很傻的问题 [复制链接]

#include

void __irq IRQ_TIMER0(void)
{
        T0IR = 0X01;
        VICVectAddr = 0X00;       
}

int main(void)
{
        VICIntSelect = 0X00;
        VICVectCntl0 = (0X20|0X04);
        VICVectAddr0 = (unsigned int)IRQ_TIMER0;
        VICIntEnable = 0X01;
       
         T0TC = 0X00;
        T0PR = 0X00;
        T0MR0 = 0XFFFF;       
        T0MCR = 0X03;
        T0TCR = 0X01;

        while(1)
        {
               unsigned int i = 0XFFFF;
               while(i)
                 i--;
        }
}
用keil调试,进入不了中断函数,监控T0TC从0增加到T0MR0后归零,哪里写错了?
照着手册写程序,网上也翻了半天多。
能否不加config.h或者FIR_Enable直接调通?能的话请把Keil的文件打个包发1983ffly@163.com?

最新回复

说明: VICIntEnable = 0X01 这句弄错了,改为VICIntEnable = 1  详情 回复 发表于 2009-11-28 23:49
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
也不熟悉你的寄存器设置,我首先得使能Timer0中断吧.
其实VICVectAddr0 = (unsigned int)IRQ_TIMER0 中的VICVectAddr0 定义是否正确,是否是定时器0的中断地址
检查各个.h文件和startup.s文件.
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
调试的时候看看程序停在什么地方,是否还在启动代码里出不来,看下startup.s是否正确,C程序中看下装载中断向量表有没有成功
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
/******************************************************************************
** Function name:                install_irq
**
** Descriptions:        Install interrupt handler
**                                The max VIC size is 16, but, there are 32 interrupt
**                                request inputs. Not all of them can be installed into
**                                VIC table at the same time.
**                                The order of the interrupt request installation is
**                                first come first serve.
** parameters:                Interrupt number and interrupt handler address
** Returned value:                true or false, when the table is full, return false
**
******************************************************************************/
unsigned long install_irq( unsigned long IntNumber, void *HandlerAddr )
{
            unsigned long i;
            unsigned long *vect_addr;
            unsigned long *vect_cntl;
      
            VICIntEnClr |= 1 << IntNumber;        /* Disable Interrupt */
   
            for(i = 0; i < VIC_SIZE; i++)
            {
        /* find first un-assigned VIC address for the handler */
                vect_addr = (unsigned long *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + i*4);
                vect_cntl = (unsigned long *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + i*4);
                if(*vect_addr == (unsigned long)NULL)
                {
                            *vect_addr = (unsigned long)HandlerAddr;        /* set interrupt vector */
                            *vect_cntl = (unsigned long)(IRQ_SLOT_EN | IntNumber);
                            break;
                }
            }
            if(i == VIC_SIZE)
            {
                return( FALSE );                /* fatal error, can't find empty vector slot */
            }
            VICIntEnable |= 1 << IntNumber;        /* Enable Interrupt */
            return( TRUE );
}
这是一个装载中断向量表的函数
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
不会是CPSR没有允许中断吧?
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

6
 
进入不了中断,肯定是你中断初始化那不对,看看你的总中断打开没?
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 cfanlwn 的回复:
进入不了中断,肯定是你中断初始化那不对,看看你的总中断打开没?


应该是这方面的原因。
 
 
 

回复

93

帖子

0

TA的资源

一粒金砂(初级)

8
 
记得要清除中断状态寄存器哦
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

9
 
说明:
VICIntEnable = 0X01 这句弄错了,改为VICIntEnable = 1<<4;
增加函数,能够操作CPSR,可以使能中断了。
void IRQ_Enable(void)
    {
         int temp;
         __asm
         {
              MRS temp,CPSR
              BIC temp,temp,#0x80
              MSR CPSR_c,temp
         }
}
但是发现以下问题,当中断触发时,程序会跳到0X00000000,然后程序就乱了。
具体寄存器数值如下:
T0IR:0X00000000 变为 0X00000001
VICRawIntr:0X00000008 变为 0X00000018
VICIRQStatus:0X00000000 变为 0X00000010
VICVectAddr:0X00000000变为0X00000110
IRQ_TIMER0:0X00000110
VICVectAddr0:0X00000110
VICIntEnable:0X00000010
感觉上现在中断能触发,但是程序跳的位置不对!!!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表