这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 2104IRQ 关于2104IRQ中断C语言编程的一点心得。

共2条 1/1 1 跳转至

2104IRQ 关于2104IRQ中断C语言编程的一点心得。

院士
2006-09-17 18:14:16     打赏
2104IRQ 关于2104IRQ中断C语言编程的一点心得。



关键词: 2104IRQ     关于     中断     语言编程     一点     心得    

院士
2006-12-22 22:43:00     打赏
2楼
问 使用EasyARM2104试验板,使用外部中断1实现LED点亮/熄灭控制,与EINT1连接的是KEY1,当有键按下时,即可触发外部中断。

方法1:
中断向量
    CODE32

    AREA    vectors,CODE,READONLY
        ENTRY

;interrupt vectors
;中断向量表
Reset
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0xb9205f80
        LDR     PC, [PC, #-0xff0]             ;注意
        LDR     PC, FIQ_Addr

ResetAddr           DCD     ResetInit
UndefinedAddr       DCD     Undefined
SWI_Addr            DCD     SoftwareInterrupt
PrefetchAddr        DCD     PrefetchAbort
DataAbortAddr       DCD     DataAbort
Nouse               DCD     0
IRQ_Addr            DCD     0
FIQ_Addr            DCD     FIQ_Handler

主程序
/********************************************************************************************************
*File    :    EINT0_LED.C
*功能    :    使用外部中断1进行LED的控制,没当有一次中断时,即取反LED,以便指示中断输入
*说明    :    无
********************************************************************************************************/

#include "config.h"
#define        LEDCON        0x00002000            /* P0.13引脚控制LED4,低电平点亮 */

/*******************************************************************************************************
*名称    :    IRQ_Eint1()
*功能    :    外部中断0处理函数
*入口参数    :    无
*出口参数    :    无
*******************************************************************************************************/

void __irq IRQ_Eint1(void)
{
uint32    i;
i = VICIRQStatus;                            //读出VICIRQStatus的值
i = IOSET;                                //读出当前LED控制值
if((i&LEDCON)==0)                            //控制LED输出
{
  IOSET = LEDCON;
}
else
{
  IOCLR = LEDCON;
}
while((EXTINT&0x02)!=0)                    //等待外部中断恢复为高电平
{
  EXTINT = 0x02;                            //清除EINT1中断标志
}
VICVectAddr = 0;
}
/******************************************************************************************************
*名称    :    main()
*功能    :    初始化外部中断1及I/O连接等
******************************************************************************************************/

        int main (void)
{// add user source code
    PINSEL0 = 0x20000000;                     //设置I/O口工作模式,P0.14为EINT1
    PINSEL1 = 0x00000000;                                        
    IODIR  = LEDCON;                        //设置LED控制口为输出,其它I/O为输入
    
    /* 打开EINT0中断(不设置向量控制器,即使用非向量IRQ) */
    VICDefVectAddr = (uint32)IRQ_Eint1;
    VICIntSelect = 0x00000000;
    VICIntEnable = 0x00008000;
    
    EXTINT = 0x07;                            //清除外部中断标志
    while(1);                                //等待中断
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

方法2:

中断向量
    IMPORT    IRQ_Eint1
    CODE32

    AREA    vectors,CODE,READONLY
        ENTRY

;interrupt vectors
;中断向量表
Reset
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0xb9205f80
        LDR     PC, IRQ_Addr
        LDR     PC, FIQ_Addr

ResetAddr           DCD     ResetInit
UndefinedAddr       DCD     Undefined
SWI_Addr            DCD     SoftwareInterrupt
PrefetchAddr        DCD     PrefetchAbort
DataAbortAddr       DCD     DataAbort
Nouse               DCD     0
IRQ_Addr            DCD     IRQ_Eint1
FIQ_Addr            DCD     FIQ_Handler

主程序:
主程序
/********************************************************************************************************
*File    :    EINT0_LED.C
*功能    :    使用外部中断1进行LED的控制,没当有一次中断时,即取反LED,以便指示中断输入
*说明    :    无
********************************************************************************************************/

#include "config.h"
#define        LEDCON        0x00002000            /* P0.13引脚控制LED4,低电平点亮 */

/*******************************************************************************************************
*名称    :    IRQ_Eint1()
*功能    :    外部中断0处理函数
*入口参数    :    无
*出口参数    :    无
*******************************************************************************************************/

void __irq IRQ_Eint1(void)
{
uint32    i;
i = VICIRQStatus;                            //读出VICIRQStatus的值
i = IOSET;                                //读出当前LED控制值
if((i&LEDCON)==0)                            //控制LED输出
{
  IOSET = LEDCON;
}
else
{
  IOCLR = LEDCON;
}
while((EXTINT&0x02)!=0)                    //等待外部中断恢复为高电平
{
  EXTINT = 0x02;                            //清除EINT1中断标志
}
VICVectAddr = 0;
}
/******************************************************************************************************
*名称    :    main()
*功能    :    初始化外部中断1及I/O连接等
******************************************************************************************************/

        int main (void)
{// add user source code
    PINSEL0 = 0x20000000;                     //设置I/O口工作模式,P0.14为EINT1
    PINSEL1 = 0x00000000;                                        
    IODIR  = LEDCON;                        //设置LED控制口为输出,其它I/O为输入
    
    /* 打开EINT0中断(不设置向量控制器,即使用非向量IRQ) */
    VICIntSelect = 0x00000000;
    VICIntEnable = 0x00008000;
    
    EXTINT = 0x07;                            //清除外部中断标志
    while(1);                                //等待中断
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

注:以上两种方法都要求系统模式下开IRQ中断
    即
        ;设置系统模式堆栈
        MSR     CPSR_c, #0x5f
        LDR     SP, =StackUsr
1: 这不是例程吗?看不出楼主的心得在那里! 2: 是指中断向量表IRQ处有两种写法吧 3: 第一种在红皮书上面一样有写,第二种就完全是例程。 4: 画个圈报道 5: 收 6: 摘抄~~~~

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]