搜索
bottom↓
回复: 0

调试LPC2378的时候遇到一个小问题,请大家指教。

[复制链接]

出0入0汤圆

发表于 2011-9-1 18:50:09 | 显示全部楼层 |阅读模式
我用LPC2378写了一个外部中断的小程序,可就是进不去中断,不知道哪个地方错了,请大家指教。

lpc2378外部中断程序进不去中断ourdev_673230MWHUND.zip(文件大小:225K) (原文件名:EXINT.zip)

部分程序如下:
#include         "config.h"
extern volatile uint16 jishu;
#define EINT0           14            //EINT0中断源号
void EINT0_Handler(void);  //函数声明
//void __swi(0) IRQ_Enable( void );
//void __swi(1) IRQ_Disable( void );

__inline void enable_irq()
        {
        uint8 tmp;
        __asm
                {
                MRS tmp,CPSR
                BIC tmp,tmp,#0x80
                MSR CPSR_c,tmp
                }
        }

__inline void disable_irq()
        {
        uint8 tmp;
        __asm
                {
                MRS tmp,CPSR
                ORR tmp,tmp,#0x80
                MSR CPSR_c,tmp
                }
        }
/*****************************************************************************
** 函数名称: SetISR()
** 函数功能: 设置向量中断
** 入口参数: num   中断号0-31
**                         pri          中断优先级0-15
**                         func 中断服务函数入口地址(uint32)IRQ_EINT0
** 出口参数: 操作是(1)否(0)成功
** 调试说明:
******************************************************************************/
uint8 SetISR(uint32 num , uint32 pri, uint32 func)
{jishu=3;//
if(num > 31) return 0;//判断此中断号是否存在
if(pri > 15) return 0;//判断此中断优先级是否存在
*(volatile uint32*)((&VICVectAddr0)+ num) = func;   //设置中断服务函数,IRQ_EINT0
*(volatile uint32*)((&VICVectPri0)+ num)= pri & 0x0F; //设置中断优先级,
VICIntSelect &= ~(1<< num);//为1时该中断被分配为FIQ中断,为0分配为IRQ中断
VICIntEnable = 1<< num;//中断使能寄存器,为1时使能相应位的中断
//VICIntEnClear中断使能清零寄存器
return 1;
}
/****************************************************************************
** 函数功能 :外部中断0相关寄存器初始化
*****************************************************************************/
int EINT0_inti(void)
{jishu=1;//
PINSEL4  = (PINSEL4 &(~(0x03<<20)))|(0x01<<20);        // P2.10连接EINT0
FIO2DIR&=0xffffffbf;
//PINMODE4&=(~(0x03<<20));
EXTMODE= 0x01;// 外部中断模式寄存器控制每个管脚为0电平触发还是1边沿触发
EXTPOLAR= 0x00;//EXTPOLAR为 0低电平或下降沿触发,1高电平或上升沿触发

jishu=2;//
//IRQ_Enable();
//IRQEnable();//开IRQ总中断
//SetISR(EINT0,3,(uint32)IRQ_EINT0);//设置中断某中断号,中断优先级,中断服务函数(地址)
SetISR(EINT0,1,(uint32)EINT0_Handler);//有EINT0_Handler  HANDLER IRQ_EINT0时用

EXTINT= 1 << 0;           // 清外部中断0中断标志
enable_irq();
jishu=4;                                                               
return 0;
}
/****************************************************************************
** 函数名称 :IRQ_EINT0
** 函数功能 :外部中断0中断服务程序
** 入口参数 :无
** 出口参数 :无
*****************************************************************************/
void __irq IRQ_EINT0(void)
{jishu=5;//
IO1SET=1<<20;

//PINSEL4  = PINSEL4 &(~(0x03<<20));        // P2.10连接GPIO
//FIO2DIR = FIO2DIR &(~(1<<10));                // P2.10为输入
//while((FIO2PIN & (1<<10))==0);      //如果是低电平中断不要在低电平时清零中断标志
EXTINT      = (1 << 0);                                // 清外部中断0中断标志
VICVectAddr = 0x00;                                        // 通知VIC中断处理结束
//EINT0_inti();
}


IRQ.s函数如下:

NoInt       EQU 0x80        ;禁止IRQ中断 执行ARM指令

USR32Mode   EQU 0x10        ;切换到USER用户模式
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
EINT0_Handler  HANDLER IRQ_EINT0
    END
;/*********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/

main如下:
#include "config.h"
#include "EXIT0.c"
#include "lcd_320.c"
char xianshi[6]={0};
char xianshi0[6]={0};
volatile uint16 jishu=0,jishu0=0;
/*********************************************************************************************************
** 函数名称 :Delayns
** 函数功能 :长软件延时
** 入口参数 :dly        延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************/
void Delayns(uint32 dly)
{
        uint32 i = 0;
       
        for ( ; dly > 0; dly--)
                for (i = 0; i < 50000; i++);
}

//////////////////////类型转换////////////////////////////////////////////////////////////////////////////
void tochar(uint16 zh,char *xs)
{xs[0]=zh/10000+'0';
xs[1]=zh/1000%10+'0';
xs[2]=zh/100%10+'0';
xs[3]=zh/10%10+'0';
xs[4]=zh%10+'0';
xs[5]='\0';
}
/*********************************************************************************************************
** 函数名称 :main
*********************************************************************************************************/
int main(void)
{IO1DIR|=1<<20;
IO1CLR=1<<20;
lcd_initial();
EINT0_inti();


PrintStr1(1,64,"1");





        while (1)
        {

//if((EXTINT&0x01)==0x01)
//jishu0++;

PrintStr1(1,80,"2");

tochar(jishu,xianshi);
PrintStr1(1,16,xianshi);


tochar(jishu0,xianshi0);
PrintStr1(1,32,xianshi0);


        }
       
    return (0);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 15:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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