|
我用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周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|