3391|8

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请大虾们帮我看看阿 我的中断怎么老进不去阿 [复制链接]

请大虾们帮我看看阿 我的中断怎么老进不去阿:

我用的是LPC2119芯片 用于检测频率信号 可是中断老是进不去 请大家帮我看看 是不是那地方配置有问题呢?
#include "config.h"

uint16 Fdiv;
uint8 p;
uint8 flag_ri;
uint32 T1temp0,T1temp1,T1diff;
uint32 T2temp0,T2temp1,T2diff;
uint8 flag_t1,flag_t2;
float freqnd1,freqnd2;
uint8 end1,end2;

void __irq IRQ_UART0(void)
{

VICVectAddr=0x00;
}

void __irq IRQ_Eint1(void)
{
  T1temp0=T1temp1;
  T1temp1=T1TC;
  if(T1temp1>T1temp0)
  {
   T1diff=T1temp1-T1temp0;
   flag_t1=1;
  }
  VICVectAddr=0x00;
}
void __irq IRQ_Eint2(void)
{  
  EXTINT = 0x04;                   // 清除中断标志 外部中断2  IRQ中断
   //VICVectAddr = 0x00;
IO1CLR= 0x00020000;
T2temp0=T2temp1;
  T2temp1=T1TC;
  if(T2temp1>T2temp0)
  {
   T2diff=T2temp1-T2temp0;
   flag_t2=1;
  }
  VICVectAddr=0x00;
}
void init_ic(void)

{
//================================IO初始化
  PINSEL0=0x800000c5;
  PINSEL1=0x15454000;
  PINSEL2=0X00000000;
  
//=======================设置T1用于做时间轴  
  T1TC=0;
  T1PR=0;
  T1MR1=0Xffffffff;
  T1MCR=0X00;
  T1TCR=0X01;
  
//=========================串口设置   
  U0LCR=0X83;
//U0DLL=0X12;
// U0DLM=0X00;
   Fdiv = (Fpclk / 16) / 9600;  // 设置波特率
   U0DLM = Fdiv>>8;                           
   U0DLL = Fdiv&0xff;   
   U0LCR=0X03;
  // U0FCR=0X07;
  // U0IER=0x01;
  
   
//======================设置中断向量   
  VICIntSelect=0x00000000;

  VICVectCntl1 = 0x2F;                                // EINT1通道分配到IRQ slot 1,即优先级1
  VICVectAddr1 = (uint32)IRQ_Eint1;        // 设置EINT1向量地址
  VICVectCntl2 = 0x30;                                // EINT2通道分配到IRQ slot 2,即优先级2
  VICVectAddr2 = (uint32)IRQ_Eint2;       



//====================外部中断设置  
EXTMODE = 0x0f;                             //外部中断边沿触发
EXTPOLAR = 0x00;                            //下降沿触发  
EXTINT=0x07;        //clear INT0, INT1 and INT2 interrupt flag 清外部中断标志  外部中断低电平有效,对其写1是复位
VICIntEnable=0x00018000;//enable INT1 and INT2 interrupt
   

}




void DelayNS(uint32 dly)
{
uint32 i;       
for (;dly>0;dly--)
for (i=0;i<50000;i++);
}


int main (void)
{
  IO1DIR=0x00030000;
  IO1SET=0x00030000;
  init_ic();

   while(1)
{
   if(flag_t1)

  {
  freqnd1=12000000.0/T1diff;
  if(freqnd1>45 && freqnd1<60)
  
   {
    end1=50;
   }
   else
   end1=100;
  }
   
   
   if(flag_t2)
   {
    IO1SET=0x00020000;
    freqnd2=12000000.0/T2diff;
   
    if(freqnd2>45 && freqnd2<60)
  
   {
    end2=50;
   }
   else
   end2=100;
   
   }
p=end1;
// p=0x31;
U0THR=p;
while( (U0LSR&0x20)==0 );
   
DelayNS(50);
  
p=end2;
//p=0x32;
U0THR=p;
while( (U0LSR&0x20)==0 );

   // return 0;
}
}
不胜感激 !!!

最新回复

有问题请先GOOGLE,BAIDU  详情 回复 发表于 2008-5-1 00:49
点赞 关注

回复
举报

57

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没看到向量表嘛,ARM的中断向量表要自己写的吧.
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
在这里不是设置中断通道了吗 而且中断地号也设置相应的中断函数了吗

VICVectCntl1 = 0x2F; // EINT1通道分配到IRQ slot 1,即优先级1
  VICVectAddr1 = (uint32)IRQ_Eint1; // 设置EINT1向量地址
  VICVectCntl2 = 0x30; // EINT2通道分配到IRQ slot 2,即优先级2
  VICVectAddr2 = (uint32)IRQ_Eint2;

不需要中断向量表了吧?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
如果所有的中断都不行,就要检查初始化码。
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

5
 
我用的是周立功LPC2100模板 里边的初始化文件我也不知怎么改请大家帮忙看看吧

这是IRQ。S文件
;/****************************************Copyright (c)**************************************************
;**                               Guangzou ZLG-MCU Development Co.,LTD.
;**                                      graduate school
;**                                 http://www.zlgmcu.com
;**
;**--------------File Info-------------------------------------------------------------------------------
;** File Name: IRQ.s
;** Last modified Date:  2004-06-14
;** Last Version: 1.1
;** Descriptions: The irq handle that what allow the interrupt nesting.
;**
;**------------------------------------------------------------------------------------------------------
;** Created By: Chenmingji
;** Created date:   2004-09-17
;** Version: 1.0
;** Descriptions: First version
;**
;**------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;** Version:
;** Descriptions:
;**
;********************************************************************************************************/


NoInt       EQU 0x80

USR32Mode   EQU 0x10
SVC32Mode   EQU 0x13
SYS32Mode   EQU 0x1f
IRQ32Mode   EQU 0x12
FIQ32Mode   EQU 0x11

    CODE32

    AREA    IRQ,CODE,READONLY

    MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function

        EXPORT  $IRQ_Label                      ; The label for exports 输出的标号
        IMPORT  $IRQ_Exception_Function         ; The imported labels 引用的外部标号

$IRQ_Label
        SUB     LR, LR, #4                      ; Calculate the returning address 计算返回地址
        STMFD   SP!, {R0-R3, R12, LR}           ; Protects the task environments 保存任务环境
        MRS     R3, SPSR                        ; Protects the status variable 保存状态
        STMFD   SP, {R3,LR}^                    ; Protects SPSR and SP in user status, Notice: DO NOT write back.保存SPSR和用户状态的SP,注意不能回写
                                                ; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP
        NOP
        SUB     SP, SP, #4*2

        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; Switch to the System Mode 切换到系统模式
      
        BL      $IRQ_Exception_Function         ; call the C interrupt handler funtion 调用c语言的中断处理程序

        MSR     CPSR_c, #(NoInt | IRQ32Mode)    ; Switch bak to IRQ mode 切换回irq模式
        LDMFD   SP, {R3,LR}^                    ; Recover SPSR and SP in user status, Notic: DO NOT write back. 恢复SPSR和用户状态的SP,注意不能回写
                                                ; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP
        MSR     SPSR_cxsf, R3
        ADD     SP, SP, #4*2                    ;

        LDMFD   SP!, {R0-R3, R12, PC}^          ;
    MEND

;/* 以下添加中断句柄,用户根据实际情况改变 */
;/* Add interrupt handler here,user could change it as needed */

;Timer0_Handler  HANDLER Timer0
;EINT2_Handler HANDLER EINT2

    END
;/*********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
你的中断向量程序看起来很奇怪,
只是定义了一个宏,但没有向量表,被注释掉了。
即使没有注释掉也很奇怪,因为这个向量表只是个很具体的中断程序地址,
中断控制器可能不会起作用。

我不是很熟,随便说说。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
初始化文件一般不用改的
中断程序给你个例子:
/****************************************************************************
* 文件名:EINT1_VECT.C
* 功能:使用外部中断1进行B1的控制,每当有一次中断时,即取反B1控制口,以便指示中断输入。
*      使用向量中断方式。
* 说明:将跳线器JP9短接,JP4断开,然后短接/断开JP1(使EINT1为低/高电平)。
****************************************************************************/
#include  "config.h"
  

#define          BEEPCON        0x00000080                /* P0.7引脚控制B1,低电平蜂鸣 */

/****************************************************************************
* 名称:IRQ_Eint1()
* 功能:外部中断EINT1服务函数,取反B1控制口。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_Eint1(void)
{  uint32  i;
   
   i = IO0SET;                                                // 读取当前B1控制值
   if( (i&BEEPCON)==0 )                                // 控制B1输出取反
   {  IO0SET = BEEPCON;
   }
   else
   {  IO0CLR = BEEPCON;
   }
   
   EXTINT = 0x02;                                        // 清除EINT1中断标志
   VICVectAddr = 0;                                        // 向量中断结束
}               
                       

/****************************************************************************
* 名称:main()
* 功能:初始化外部中断1(EINT1)为向量中断,并设置为下降沿触发模式,然后等待外部中断。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int  main(void)
{  PINSEL0 = 0x20000000;                        // 设置管脚连接,P0.14设置为EINT1
   IO0DIR = BEEPCON;                                        // 设置B1控制口为输出,其它I/O为输入
   
   EXTMODE = 0x02;                                        // 设置EINT1中断为边沿触发模式
   EXTPOLAR = 0x00;                                        // 设置EINT1中断为下降沿触发
   
   /* 打开EINT1中断(设置向量控制器,即使用向量IRQ) */
   VICIntSelect = 0x00000000;                // 设置所有中断分配为IRQ中断
   VICVectCntl0 = 0x2F;                                // 分配EINT1中断到向量中断0
   VICVectAddr0 = (int)IRQ_Eint1;         // 设置中断服务程序地址
   EXTINT = 0x02;                                        // 清除EINT1中断标志       
   VICIntEnable = 0x00008000;                // 使能EINT1中断
   
   while(1);                                                // 等待中断
   return(0);
}
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
不会,帮顶
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

9
 
有问题请先GOOGLE,BAIDU
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表